Общая архитектура🔗
Система разделена на главный сервис и набор микросервисов, каждый из которых выполняет строго определённую задачу. Все компоненты связаны через базу данных, HTTP-запросы и Redis.
Компоненты🔗
- Django (
main) — архитектор базы, пользователи, админка data_service— точка доступа к профилям и транзакциям, далее - Микросервис данных и статистикиgpt_service— взаимодействие с OpenAItools_service— вызывает внешние функции по запросу GPTwidget_service— поддержка ChatGPT-виджета на сайтах- Интеграционные сервисы: VK, WhatsApp, и др.
Совет
Возвращайся к этому месту, если видишь в документации обозначение сервиса, но не помнишь что оно означает.
Общая схема взаимодействия🔗
У нас всего 2 типа взаимодействия
1) Интеграции в различные каналы (VK группы, Whatsapp и др)
2) Встраиваемый виджет на сайт
Интеграции в каналы🔗
Как схема обработки, так и архитектура кода в данных сервисах одинаковая (с изменениями под API конкретного сервиса).
Интеграционные сервисы подключаются к внешним платформам (VK, WhatsApp и др.) и принимают входящие сообщения через вебхуки. После получения сообщения:
- данные профиля запрашиваются из БД через
data_service; - текст сообщения передаётся в
gpt_serviceдля генерации ответа; gpt_serviceпри необходимости вызывает одну или несколько функций вtools_service;- данные о расходе и параметрах запроса передаются в
data_serviceдля создания транзакции; - результат обработки возвращается в исходный канал.
Все взаимодействия между компонентами выполняются по HTTP. Для управления последовательностью и блокировками используется Redis.
Совет
Двигайся по номерам подписей, чтобы понять порядок действий.
Встраиваемый виджет на сайт🔗
виджет встраивается с помощью JS скрипта в HTML страницу сайта
Внимание
В будущем скрипт может измениться, текущий - лишь для примера
Виджет на сайте позволяет пользователям общаться с ChatGPT через веб-интерфейс который отрисовывает JS скрипт. В отличие от интеграций с платформами, здесь реализована потоковая передача ответа (streaming) — ответ от ChatGPT отображается в чате по мере генерации.
После отправки сообщения пользователем:
widget_serviceполучает запрос и извлекает домен;- выполняется запрос в
data_serviceдля проверки домена и получения связанных данных профиля; - сообщение пользователя сохраняется в базе данных;
widget_serviceотправляет данные вgpt_service(включая конфигурацию профиля и текст сообщения);gpt_serviceвозвращает потоковый ответ (чанки), который немедленно транслируется обратно в виджет;- после завершения генерации финальный чанк содержит информацию о расходах;
widget_serviceпередаёт эти данные вdata_serviceдля создания транзакции и сохранения ответа ChatGPT в базе.
Все взаимодействия между сервисами выполняются по HTTP.
Потоковые ответы из gpt_service в widget_service и из него в виджет передаются через SSE (Server-Sent Events), используя StreamingResponse1 с асинхронным генератором — данные от gpt_service отправляются в клиент в виде чанков в реальном времени.
Схема взаимодействия точно такая же как и в интеграциях
