Files
gorkycode-2025/README.md
Nikidze ae68432fcb final
2025-10-31 22:21:29 +03:00

90 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ИИ-помощник туриста
Веб-сервис, который создает **персональные пешеходные маршруты**, понимая **свободную речь пользователя**. Наш AI-гид анализирует ваши желания, текущее местоположение и время, чтобы построить уникальную прогулку, которая подходит именно вам. Сервис доступен [здесь: https://gorkycode.nikidze.ru/](https://gorkycode.nikidze.ru/).
Дополнительное описание доступно [тут](https://docs.google.com/document/d/1_E_qirZ593MJWbkkDWpVPHXo5n-VnV8HTrttNpayACE/edit?usp=sharing).
---
## Понимание контекста
В отличие от конкурентов, которые просто ищут по тегам, наш сервис **понимает логику и последовательность** запроса. Мы не просто находим "музей" и "кофе", мы строим маршрут так, как этого хотел пользователь.
Как система обработает внешне похожие запросы:
| Запрос пользователя | Интерпретация AI и результат |
| :--- | :--- |
| *«Хочу сходить в музей и попить кофе»* | Найдет музей и кофейню рядом. Порядок **не важен**. |
| *«Хочу попить кофе, потом в музей»* | Построит маршрут **сначала в кофейню**, а уже **потом в музей**. |
| *«Хочу походить по музеям, потом зайти за кофе»* | Включит в маршрут **несколько музеев**, а кофейня будет **финальной точкой**. |
| *«Хочу в музей или попить кофе, потом на канатку»* | Выберет **одно из двух** (музей или кафе), а затем **обязательно добавит** канатную дорогу. |
Эта способность понимать нюансы делает наш сервис по-настоящему персональным и умным.
---
## Основные возможности
- **Пошаговый интерфейс** — Удобный опрос в несколько шагов, который не перегружает пользователя и позволяет легко вернуться для корректировки.
- **Диалоговый режим** — Если данных не хватает, система задаст уточняющие вопросы, пока не получит всю необходимую информацию.
- **Умная маршрутизация** — Алгоритм учитывает время на дорогу пешком и посещение локаций, отсекая нерелевантные точки.
- **Гибкий анализ запроса** — AI (Gemini 2.5 Flash) извлекает теги, время и адрес, даже если они указаны неточно (например, *«свободен до 6 вечера»* или адрес с опечаткой).
- **Микросервисная архитектура** — Проект разбит на независимые Docker-контейнеры, что обеспечивает надежность и масштабируемость.
---
## Как это работает: от запроса до маршрута
1. **Сбор данных (UI + AI)**
Пользователь в свободной форме отвечает на вопросы о своих предпочтениях, времени и местоположении. Данные отправляются в основной сервис `input_to_route`.
2. **Анализ и структурирование (AI: Gemini 2.5 Flash)**
С помощью модели `Gemini 2.5 Flash` через `OpenRouter API` текстовый запрос преобразуется в структурированные данные:
```json
{
"tags": [["Музей"], ["Кофейня"]],
"user_location": "улица Ошарская, дом 14",
"time": 180
}
```
На этом же этапе нормализуется адрес пользователя с помощью отдельного сервиса на базе `libpostal`.
3. **Поиск кандидатов (База данных)**
Сервис находит в базе данных все объекты, соответствующие извлеченным тегам.
4. **Построение маршрута (OSRM)**
- Координаты пользователя и найденных точек передаются в `navigation-engine` (кастомная сборка `OSRM` с картой Нижнего Новгорода).
- Алгоритм отсекает слишком удаленные точки.
- Строится матрица временных затрат на перемещение между оставшимися точками.
- На основе матрицы и логики тегов ("и", "или", "потом") генерируется список подходящих по времени маршрутов.
- Из списка выбирается один (на данный момент — случайный).
5. **Генерация описания (AI)**
На основе выбранных точек маршрута `Gemini 2.5 Flash` генерирует красивое и связное текстовое описание прогулки для пользователя.
---
## Архитектура и технологии
Проект построен на основе микросервисной архитектуры и развернут в Docker-контейнерах на платформе `dockhost`. Такой подход обеспечивает изоляцию компонентов и простоту масштабирования.
| Компонент | Технологии | Роль |
| :--- | :--- | :--- |
| **web-ui** | **Vue 3, JavaScript** | Пользовательский интерфейс: пошаговый опрос и отображение результата. |
| **input_to_route** | **FastAPI (Python)** | **Мозг системы.** Оркестрирует весь процесс: общается с UI, AI, базой данных и другими сервисами. |
| **engine-wrapper** | **FastAPI (Python)** | Упрощенная обертка над движком OSRM для удобства взаимодействия. |
| **navigation-engine** | **OSRM Backend (C++)** | Высокопроизводительный движок для построения пешеходных маршрутов. |
| **libpostal-service** | **libpostal, REST API** | Сервис для нормализации и парсинга географических адресов. Вынесен в отдельный контейнер из-за большого веса библиотеки. |
| **AI-провайдер** | **OpenRouter API (Gemini 2.5 Flash)** | Предоставляет доступ к LLM для анализа запросов и генерации текста. |
| **Платформа** | **Dockhost** | Облачная платформа для хостинга Docker-контейнеров. |
---
## Почему наш стек эффективен
1. **FastAPI** — Идеально подходит для создания асинхронных API, которые связывают разные сервисы. Быстрый, современный и легок в освоении.
2. **Vue 3** — Реактивный фреймворк, который позволяет создавать динамичные и отзывчивые пользовательские интерфейсы, как наш пошаговый опросник.
3. **OSRM** — Один из самых быстрых open-source движков для маршрутизации. Использование кастомной сборки только для Нижнего Новгорода делает его еще более производительным.
4. **Gemini 2.5 Flash через OpenRouter** — Экономически эффективное решение. Модель обеспечивает высокую скорость, отличное качество понимания русского языка и следование сложным инструкциям, что является ядром нашего проекта.
5. **Микросервисы на Docker** — Стандарт индустрии. Позволяет независимо разрабатывать, обновлять и масштабировать части приложения. `libpostal` в отдельном контейнере — классический пример правильного применения этого подхода.