Перейти к содержанию

Общая архитектура🔗

Система разделена на главный сервис и набор микросервисов, каждый из которых выполняет строго определённую задачу. Все компоненты связаны через базу данных, HTTP-запросы и Redis.

Компоненты🔗

  • Django (main) — архитектор базы, пользователи, админка
  • data_service — точка доступа к профилям и транзакциям, далее - Микросервис данных и статистики
  • gpt_service — взаимодействие с OpenAI
  • tools_service — вызывает внешние функции по запросу GPT
  • widget_service — поддержка ChatGPT-виджета на сайтах
  • Интеграционные сервисы: VK, WhatsApp, и др.

Совет

Возвращайся к этому месту, если видишь в документации обозначение сервиса, но не помнишь что оно означает.

Общая схема взаимодействия🔗

У нас всего 2 типа взаимодействия

1) Интеграции в различные каналы (VK группы, Whatsapp и др)
2) Встраиваемый виджет на сайт

Интеграции в каналы🔗

Как схема обработки, так и архитектура кода в данных сервисах одинаковая (с изменениями под API конкретного сервиса).

Интеграционные сервисы подключаются к внешним платформам (VK, WhatsApp и др.) и принимают входящие сообщения через вебхуки. После получения сообщения:

  • данные профиля запрашиваются из БД через data_service;
  • текст сообщения передаётся в gpt_service для генерации ответа;
  • gpt_service при необходимости вызывает одну или несколько функций в tools_service;
  • данные о расходе и параметрах запроса передаются в data_service для создания транзакции;
  • результат обработки возвращается в исходный канал.

Все взаимодействия между компонентами выполняются по HTTP. Для управления последовательностью и блокировками используется Redis.

Cookie consent enabled

Совет

Двигайся по номерам подписей, чтобы понять порядок действий.

Встраиваемый виджет на сайт🔗

виджет встраивается с помощью JS скрипта в HTML страницу сайта

<script type="module" defer src="https://api.yamarkiza.ru/widget-static/widgetjs.js"></script>

Внимание

В будущем скрипт может измениться, текущий - лишь для примера

Виджет на сайте позволяет пользователям общаться с 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 отправляются в клиент в виде чанков в реальном времени.

Схема взаимодействия точно такая же как и в интеграциях