Этот проект представляет собой асинхронного агента на базе LLM, который:
- Генерирует поисковые запросы для извлечения релевантного контента;
- Использует Yandex Search API для получения данных;
- Парсит и суммирует полученный контент с помощью инструментов
aiohttp,lxmlиxml.etree.ElementTree; - Синтезирует финальный ответ на основе агрегированной информации;
- Обрабатывает запросы через FastAPI для обеспечения быстрого и масштабируемого API-сервиса.
Проект состоит из следующих основных компонентов:
-
LLM Agent
Основной код агента, который использует модельgpt-4o-miniдля генерации поисковых запросов, суммаризации контента и синтеза окончательного ответа. Все запросы к модели выполняются асинхронно с использованиемasyncio. -
Yandex Search API & Парсинг
Модуль, реализующий взаимодействие с Yandex Search API. Данные, полученные от API, парсятся с использованием библиотекaiohttp,lxmlиxml.etree.ElementTreeдля последующего анализа и суммаризации. -
FastAPI App
Веб-сервис, созданный с использованием FastAPI, который предоставляет HTTP endpoint для отправки запросов. Валидация входящих данных, логирование запросов и обработка ошибок реализованы на уровне middleware и роутов.
Для корректной работы проекта необходим .env файл, содержащий OPENAI_API_KEY, YANDEX_SEARCH_SECRET, YANDEX_USER_ID
YANDEX_USER_ID - id of yandex cloud folder
YANDEX_SEARCH_SECRET - api-key of service account with search_api.execute permission
OPENAI_API_KEY - OpenAI api-key
Для запуска выполните команду:
docker-compose up -dОна соберёт Docker-образ, а затем запустит контейнер.
После успешного запуска контейнера приложение будет доступно на http://localhost:8080.
Отправьте POST-запрос на эндпоинт /api/request. Например, используйте curl:
curl --location --request POST 'http://localhost:8080/api/request' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": "В каком городе находится главный кампус Университета ИТМО?\n1. Москва\n2. Санкт-Петербург\n3. Екатеринбург\n4. Нижний Новгород",
"id": 1
}'В ответ вы получите JSON вида:
{
"id": 1,
"answer": 1,
"reasoning": "Из информации на сайте",
"sources": [
"https://itmo.ru/ru/",
"https://abit.itmo.ru/"
]
}