Хотя подключение GPT к интерфейсу Gradio кажется тривиальной задачей, у некоторых новичков возникают трудности, поэтому мы максимально подробно расписали весь процесс создания простейшего чат-бота.
Gradio – библиотека с открытым исходным кодом. Ее плюс — можно быстро писать свои веб-приложения для ML-моделей, генерировать API. Поэтому тут не нужны никакие навыки работы с Java Script или CSS – всё пишем на Питоне.
Gradio – это целая экосистема библиотек Python и JavaScript... Внутри библиотеки можно поработать с JS и обратиться к загруженному приложению на Hugging Face по имени, например.
Gradio чаще используют для демонстрационных моделей, чтобы протестировать нейронку с адекватным интерфейсом. Но двумя окошечками ответов и запросов утилита не ограничивается. В библиотеке есть и классы для гибкой настройки внешнего вида: при помощи класса "gr.Blocks" можно поиграться с обработкой сложных потоков данных, управлением отображения компонентов.
Но сегодня мы ограничимся простым функционалом.
Задача простая: создать чат-бот с привязкой к самой популярной LLM – GPT
Работать будем с классом gr.ChatInterface(predict).launch(), который создает базовый интерфейс для работы нейронки.
Predict – функция предсказания, отвечающая за входные данные, которые будет получать OpenAI и на ее основе генерировать наш ответ. Сюда мы поместим историю всех сообщений для контекста и сам запрос пользователя.
Для начала импортируем Gradio и утилиту для работы с API OpenAI, предварительно установив нужное через pip.
!pip install openai gradio
Дополнительно загружаем getpass для работы с паролями.
from openai import OpenAI # для работы с API OpenAI
import gradio as gr
import getpass
Мы пользуемся функцией getpass.getpass() для безопасного ввода API-ключа OpenAI. Тут же подключаем клиент.
# Запрос ввода ключа от OpenAI
api_key = getpass.getpass("Введите OpenAI API Key:")
# Создание клиента к API OpenAI
client = OpenAI(api_key=api_key)
Ключ можно забрать у себя в профиле после регистрации на сайте компании. Напоминаем, что использовать российские номера OpenAI запретила – для получения ключа придется купить аккаунт или пройти верификацию с иностранным номером.
Все готово для создания нашего чат-бота. Теперь нам нужно задать функцию predict, которая будет принимать входные данные.
Чтобы наш GPT учитывал не только сообщения пользователя — нужно добавить историю сообщений. Так GPT сгенерирует ответы, рассматривая контекст.
Соответственно функция predict будет принимать два параметра: message (текущее сообщение пользователя) и history (история предыдущих сообщений в чате).
def predict(message, history):
Давайте попробуем прописать возвращаемые данные в аргумент history, пропишем логику пополнения "контекста" LLM.
Чтобы наша "история" заработала, сперва ее нужно отформатировать под экосистему OpenAI. Для этого внутри функции мы создаем пустой список history_openai_format, куда и будут попадать сообщения в обработанном виде.
history_openai_format = [] # список сообщений в формате пригодном для OpenAI
Дальше нужно разделить данные между запросами пользователя и ответами GPT. Content – сообщения от нейронки или человека.
User – запросы пользователя,
Assistent – ответы чат-бота.
Благодаря циклу for программа последовательно запишет все запросы пользователя и ответы GPT в историю сообщений и заполнит наш пустой отформатированный список.
for human, assistant in history: # перебираем все сообщения
# Указываем для каждого сообщения роль
history_openai_format.append({"role": "user", "content": human }) # наши запросы
history_openai_format.append({"role": "assistant", "content": assistant}) # ответы чат-бота
Важно. Нейронка должна учитывать не только прошедшую историю, но и нынешний запрос, который мы только что ввели... Поэтому добавляем в контекст/историю сообщений аргумент message.
# Наше последнее сообщение для чат-бота
history_openai_format.append({"role": "user", "content": message})
Вживую это будет выглядеть примерно так. Допустим, у нас получился сырой список:
history = [
("Hello, who are you?", "I am a virtual assistant."),
("Can you help me with my homework?", "Of course, what do you need help with?")
]
С действительным сообщением message = "I need help with my math assignment."
Тогда и отформатированная история пропишется по ролям:
history_openai_format = [
{"role": "user", "content": "Hello, who are you?"},
{"role": "assistant", "content": "I am a virtual assistant."},
{"role": "user", "content": "Can you help me with my homework?"},
{"role": "assistant", "content": "Of course, what do you need help with?"},
{"role": "user", "content": "I need help with my math assignment."}
]
Теперь создадим сам запрос к чат-боту через response с вызовом всей истории переписки, обозначая точность ответов и выбранную модель.
# Формируем запрос к чат-боту со всей историей переписки
response = client.chat.completions.create(
model='gpt-4o', # используемая модель
messages= history_openai_format, # список форматированных сообщений с ролями
temperature=1.0 # точность ответов модели
Возвращаем результат предсказания.
return response.choices[0].message.content
И запускаем интерфейс.
# Запуск интерфейса чат-бота с функцией предсказания
gr.ChatInterface(predict).launch()
Весь код выглядит так:
from openai import OpenAI # для работы с API OpenAI
import gradio as gr
import getpass # для работы с паролями
# Запрос ввода ключа от OpenAI
api_key = getpass.getpass("Введите OpenAI API Key:")
# Создание клиента к API OpenAI
client = OpenAI(api_key=api_key)
# Функция предсказания с двумя параметрами
# message - текущее сообщение
# history - история сообщений с чат-ботом
def predict(message, history):
history_openai_format = [] # список сообщений в формате пригодном для OpenAI
for human, assistant in history: # перебираем все сообщения
# Указываем для каждого сообщения роль
history_openai_format.append({"role": "user", "content": human }) # наши запросы
history_openai_format.append({"role": "assistant", "content": assistant}) # ответы чат-бота
# Наше последнее сообщение для чат-бота
history_openai_format.append({"role": "user", "content": message})
# Формируем запрос к чат-боту со всей историей переписки
response = client.chat.completions.create(
model='gpt-4o', # используемая модель
messages= history_openai_format, # список форматированных сообщений с ролями
temperature=1.0 # точность ответов модели
)
return response.choices[0].message.content # возвращаем результат предсказания
# Запуск интерфейса чат-бота с функцией предсказания
gr.ChatInterface(predict).launch()
Мы считаем, что с подключением GPT разберется даже школьник. Такой вариант – минимум для реализации чат-бота. В следующем посте мы расскажем, как создать своего простого менеджера HR-отдела.
Pitcentr0
а,... зачем это писать ? спросите у chatgpt как написать этого бота, и, все