AnswerBot Бот поддержки на ChatGPT.

#Python#ChatGPT#AI#Pandas#Flask

example of AnswerBot Chat

Свой REST API (через Embeddings + Completion) для OpenAI ChatGPT. На входе берем данные в CSV (например, из СУБД), генерим (через OpenAI) embeddings. При получении запроса с вебморды составляем prompt запрос (через embeddings) со специфичной информацией и спрашиваем ответ у ChatGPT.

Благодаря способности ChatGPT понимать все языки (на терпимом уровне) бот отвечает более-менее понятно даже при запросах на русском, хотя база знаний на итальянском.

В логах сохраняем запросы-ответы (чтобы уточнять-дополнять базу) и токены (чтобы оценивать затраты и отлаживать сложные вопросы с длинным контекстом или длинным ответом).

2023/03/16 11:52:27 q
  Q: come posso farmi passare una tosse secca?
  A:  Per curare una tosse secca, è consigliabile consultare un medico o uno specialista in otorinolaringoiatria. Akos Srl offre otorinolaringoiatria a Parma ed è raggiungibile al numero di telefono 0521882885.
  Tokens: 1082 + 77 = 1159

2023/03/16 11:53:15 q
  Q: ho già consultato il medico ma le cure non hanno avuto effetto
  A:  Potrebbe essere necessario cambiare medico o provare un trattamento diverso. Se non sei sicuro, è meglio consultare un altro medico per una seconda opinione.
  Tokens: 1394 + 53 = 1447


2023/03/16 12:38:59 q
  Q: Посоветуйте мне (на русском) трех непьющих стоматологов в Милане?
  A:  В Милане есть три стоматолога, которые не пьют: C.D.I Pellegrino Rossi (номер телефона 02483171), Stenco Dott. Maurizio (номер телефона 0258321154) и Stagnati Dott. Giovanni (номер телефона 023553081).
  Tokens: 1459 + 142 = 1601

Например (гипотетически) для запроса о барах на ул Весенней, где в продаже есть Гиннес, мы в базе держим список баров и их ассортимент, и через embeddings создаем запрос вида (факты, которые наиболее подходящие):

  • В баре на ул. Весенней, 2 продается Гиннес и Жигулевское
  • В баре на ул. Весенней, 42 продается Гиннес и Чешское
  • В баре на ул. Весенней, 13 продается Пражское и Бочковое
  • В баре на ул. Летней, 3 продается Гиннес, Карлсберг и Сливочное
  • В баре на ул. Осенней, 4 продается Гиннес и Старый Мельник
  • В баре на ул. Зимней, 5 продается Баварское и Гиннес

Где на Весенней можно выпить Гиннес?

Контекст может включать и лишние факты (заранее это определить невозможно, embeddings позволяет нам только выбрать несколько наиболее релевантных). Затем, ChatGPT, который более-менее понимает языки, но ничего не знает про наши бары и их ассортимент, на основе вопроса и такого контекста дает правильный ответ.

Интеграция с Siri

Используя приложение ChatGPT-Siri удалось сделать (только для iPhone) голосовой интерфейс с Siri. Человек задает голосом вопрос Siri и указывает, что надо спросить нашего бота. ChatGPT-Siri посылает запрос на наш API (URL настраивается).

Проблема ChatGPT-Siri в том, что он:

  1. Работает с общей моделью ChatGPT (которая не знает предметную специфику: ни про цены и ассортимент баров, ни про трезвых миланских стоматологов)
  2. Не умеет работать с embeddings

Но оно OpenSource и легко и глубоко настраивается, поэтому мы используем это приложение как интерфейс к Siri - через него получаем текстовый запрос на наш REST API, обрабатываем с нашими embeddings и создаем контекст, получаем ответ и отправляем обратно на телефон, и Siri зачитывает его красивым женским голосом.

Небольшая сложность - ChatGPT-Siri умеет работать endpoint https://api.openai.com/v1/chat/completions и ожидает JSON ответ формата chat.completion, а мы обращаемся к простому текстовому completion и имеем ответ типа text_completion. Поэтому крафтим свой ответ нужного формата, подставляя в него полученный ответ, и высылаем ChatGPT-Siri его в том формате, как он и ожидает.

Вторая сложность - Siri отправляет лишнюю информацию, вроде уточенний пользователя (- Желаете еще что-то еще спросить? - Нет.). А так как мы можем отвечать на один вопрос, приходится из нескольких сообщений выбрасывать мусор и находить один вопрос, на который и отвечаем.

Голосовой интерфейс из браузера

Персонализация

Для ответов используется общая база знаний + персональная небольшая база фактов для пользователя. Пример тестового диалога (переведен с итальянского на русский):

AI: Здравствуйте, чем я могу вам помочь сегодня? U: Когда я должен буду платить следующий взнос по кредиту? AI: Следующий платеж по кредиту должен быть выплачен 25 мая 2023 года. U: Является ли оплата банковским переводом регулярной? AI: Да, платеж банковским переводом является регулярным.