Спринт 6c — терминология и сверка документации с реальным кодом:
- Словарь терминов в static/docs.html: «маршрутизатор» вместо «роутер»,
«защитное условие» вместо «guard», «пошаговая ветка» вместо «многошаговая».
Разделены концепты «намерение» (intent) и «ветка» (branch) с пометкой,
что в коде они хранятся как одна сущность 1:1.
- Песочница: «Решение маршрутизатора» виден всегда (зелёный/жёлтый),
счётчик переключений «N из 3» отдельной плашкой, бейджи под словарь.
- Настройки: «Условия перехода» → «Защитные условия (guards, JSON)».
- GRAPH_ARCHITECTURE_v4.md: имена полей thread_state и слоты приведены
к реальной БД (db/models/thread_state.py) и таксономии промптов шагов
(prompts/intents/new_booking/steps/). Ссылки на *_v2 примеры. На v3
поставлена шапка «устарело».
- 4 примера переписаны как *_v2: реальные current_intent_code/
current_step_code/slots_json, реальные allowed_next без двойных переходов,
реальная таксономия слотов name/reason/specialist/preferred_time/confirmed.
Удалены вымышленные CRM tool calls и слоты, которых нет в коде.
- static/example.html — параметризованная страница с навигацией между
4 примерами; роут GET /api/docs/examples/{name} в main.py отдаёт
markdown без дублирования файлов.
- Редактирование документов в Отладке: GET/PUT /documents/{id}/raw,
textarea с переразметкой и обновлением Chroma при сохранении.
Спринт 7, часть A — мульти-RAG через подписку ветка↔документы:
- Миграция: таблица intent_documents (M:N), модель IntentDocument,
индекс по document_id для обратного поиска.
- API: GET/PUT /intents/{code}/documents и GET/PUT /documents/{id}/intents
с PUT-семантикой «полный список», атомарно. Сервис
services/intent_document_service.py.
- Retrieval-фильтр в chat_service: подтягивает document_ids активной
ветки и передаёт в vectorstore.query(). Дефолт пустой подписки —
document_ids=[] (= 0 чанков), не «вся коллекция»: пустая подписка
означает «ветка не настроена», подмешивать случайное хуже, чем
ничего. vectorstore.query() различает None (нет фильтра) и [] (0).
- UI Настроек: блок «Документы базы знаний» в правом сайдбаре,
всегда видим независимо от вкладки, сортировка по имени, счётчик
«N из M», PUT при сохранении.
- UI Отладки: третья кнопка «привязка» рядом с «удалить» —
раскрывашка со списком веток (галочки), быстрая привязка прямо
на странице загрузки.
- Песочница: блок «Срез RAG» с подпиской/найдено, ворнинг при пустой
подписке. Поле rag_subscription в QueryResponse и ChatResponse.
- Системный промпт страницы Отладки переехал в обычную ветку _debug
(«Страница отладки»). Удалён prompts/system_prompt.md и логика
DEFAULT_SYSTEM_PROMPT в llm_client. routers/query.py подтягивает
активный конфиг ветки _debug и её подписки. Дефолт пустой подписки
для _debug — None (вся коллекция), не [] как для пациентских — чтобы
Отладка работала «из коробки». На странице Отладки info-bar показывает
активную версию и счётчик подписок, ссылка → Настройки.
- Тест-блок «Тест-вопрос» в центре Настроек: расширил /query
параметрами intent_code (default _debug), system_prompt (override
для теста черновика из textarea), disable_rag (для _router).
Редактор промпта обёрнут в <details open> — можно свернуть до
одной строки. Под ним — три колонки результата (RAG / промпт /
ответ). Для _router показывается подсказка про отсутствие RAG.
Документы:
- data/datasets/*.md — наработки по 6 веткам (рабочие материалы оператора).
- docs/BRANCH_MAP_AND_PROMPTS_v1.md, docs/OPTIMIZATION_CONVERSION_v1.md,
docs/guides/state_machine_and_slots.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Chat Agent for Patients (RAG) — инструмент настройки
RAG-ядро + веб-инструмент для настройки пациентского чат-агента: загрузка wiki, редактирование промпта и правил, прогон сценариев.
Подключение реальных каналов (чат в мобильном приложении, бот в МАКС) делает другой разработчик — этот проект отдаёт ему готовое RAG-ядро и API плюс согласованную конфигурацию (системный промпт, правила, снапшот базы знаний).
Статус
🟢 Active — Спринты 1–2 и доработки (2.5) закрыты, идём на Спринт 3.
Что уже работает:
- RAG-ядро: FastAPI + ChromaDB +
intfloat/multilingual-e5-large+ DeepSeek. - Загрузка документов (
.md,.txt,.pdf,.docx), чанкинг с чисткой markdown-мусора (навигационные блоки, инлайн-ссылки), просмотр чанков с эмбеддингами. - Многошаговый диалог с памятью треда (SQLAlchemy 2.0 async + Alembic + SQLite). История хранится навсегда.
- Переиндексация без повторной загрузки файла: сохранённый
raw_text→ новый чанкер. - Две отладочные страницы: «Отладка» (одиночный вопрос, база знаний) и «Песочница» (чат с агентом, список тредов, переименование, удаление).
- Markdown-рендер ответов ассистента в «Песочнице».
- Системный промпт вынесен в
prompts/system_prompt.md— правится без кода.
Цель проекта
- Поднять RAG по wiki операторов и API диалога с агентом.
- Дать операторам веб-инструмент, в котором они в процессе настройки:
- загружают документы wiki (постепенно, по мере готовности — не пакетно);
- редактируют системный промпт и правила поведения агента;
- играют роль пациента в тестовом чате и смотрят, что отвечает агент;
- сохраняют проработанные диалоги как сценарии и перегоняют их после изменения настроек.
- Сама интеграция с реальными каналами (приложение, МАКС) — вне скоупа этого проекта.
Что не входит в скоуп
- Реальная интеграция с чатом в мобильном приложении (
work-pcs-pt-mobile). - Реальная интеграция с ботом в МАКС (
work-pcs-pt-bots). - Очередь и UI оператора для живого переключения с агента на человека.
- Мультипользовательская прод-эксплуатация.
Всё это — задача смежного разработчика, который будет использовать API этого сервиса.
Архитектура (черновик)
┌──────────────────────────────────┐ ┌──────────────────────┐
│ Web UI настройки (один экран) │ │ │
│ ┌────────────┐ ┌────────────┐ │ │ RAG (wiki) │
│ │ База знаний│ │ Промпт + │──┼─────▶│ ChromaDB + E5 │
│ │ (upload) │ │ правила │ │ └──────────────────────┘
│ └────────────┘ └────────────┘ │ ┌──────────────────────┐
│ ┌────────────┐ ┌────────────┐ │─────▶│ DeepSeek LLM API │
│ │ Песочница │ │ Сценарии │ │ └──────────────────────┘
│ │ (чат) │ │ (сохран.) │ │
│ └────────────┘ └────────────┘ │
└──────────────────────────────────┘
│
▼
Chat Agent API (FastAPI)
(тот же API, что потом получит
внешний разработчик для каналов)
Ключевая идея: веб-инструмент — это единственный клиент агента на время настройки. Когда конфигурация «устаканивается», её снапшот отдаётся внешнему разработчику вместе с документированным API.
Технологический стек (предварительно)
| Слой | Технология | Назначение |
|---|---|---|
| API | FastAPI (Python 3.11–3.12) | HTTP-эндпоинты агента и настройки |
| Vector DB | ChromaDB | База эмбеддингов wiki |
| Embeddings | intfloat/multilingual-e5-large |
Русскоязычные эмбеддинги |
| LLM | DeepSeek API | Диалоговая модель |
| Хранилище конфигов и сценариев | SQLite | Промпты, правила, сценарии |
| Веб-UI | Vanilla JS / лёгкий фреймворк | Одностраничное приложение настройки |
| Контейнеризация | Docker | Изолированный запуск |
База опыта —
work-pcs-dr-cdss(RAG-сервис для врачей). Переиспользуем паттерн сервисовembeddings.py / vectorstore.py / document_processor.py / llm_client.py.
План (спринты)
См. docs/SPRINTS.md. Архитектурные документы и разобранные примеры — в docs/architecture/ и docs/examples/.
Запуск
Требования
- Python 3.12
- Ключ DeepSeek API
Установка
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # и вписать DEEPSEEK_API_KEY
Старт
.venv/bin/python -m uvicorn main:app --host 0.0.0.0 --port 8003
Миграции Alembic применяются автоматически на старте. Первая загрузка embedding-модели E5-large занимает ~15–20 секунд.
Вручную накатить миграции
.venv/bin/alembic upgrade head
Создать новую миграцию после изменения моделей
.venv/bin/alembic revision --autogenerate -m "описание изменений"
.venv/bin/alembic upgrade head
Использование
Веб-страницы
http://localhost:8003/— Отладка: загрузка документов, просмотр чанков со scores и эмбеддингами, одиночный тест-вопрос с 3-колоночным ответом (чанки / промпт / ответ LLM).http://localhost:8003/sandbox.html— Песочница: чат с агентом. Слева список сохранённых диалогов, в центре сам чат, справа отладка последнего ответа (найденные чанки + собранный промпт).
API
| Метод | Путь | Назначение |
|---|---|---|
| GET | /health |
Статус, кол-во документов и чанков, модель эмбеддингов |
| POST | /documents/upload |
Загрузить файл (.md, .txt, .pdf, .docx), сохраняет raw_text в SQLite и чанки в Chroma |
| GET | /documents |
Список документов |
| GET | /documents/{id}/chunks |
Чанки документа + их эмбеддинги |
| DELETE | /documents/{id} |
Удалить документ (из Chroma и SQLite) |
| POST | /documents/{id}/reindex |
Переразметить документ с актуальными правилами чанкера |
| POST | /documents/reindex-all |
Переразметить всю базу |
| POST | /query |
Одиночный вопрос (Отладка) |
| POST | /chat |
Отправить реплику в тред (создаёт тред, если thread_id не передан) |
| GET | /threads |
Список всех диалогов |
| GET | /threads/{id} |
Тред целиком с историей |
| PATCH | /threads/{id} |
Переименовать |
| DELETE | /threads/{id} |
Удалить тред со всеми сообщениями |
Правка системного промпта
prompts/system_prompt.md — читается при старте сервиса. После правки — рестарт.
Структура
.
├── README.md # этот файл
├── docs/ # проектная документация (см. ниже)
├── config.py # настройки (Pydantic BaseSettings)
├── main.py # FastAPI app, lifespan, авто-миграции
├── alembic.ini # конфиг Alembic
├── migrations/ # миграции БД
├── prompts/
│ └── system_prompt.md # системный промпт (правится без кода)
├── db/
│ ├── base.py # DeclarativeBase
│ ├── session.py # async engine + sessionmaker
│ └── models/
│ ├── thread.py # диалоги
│ ├── message.py # сообщения
│ └── document.py # raw_text документов для reindex
├── models/ # Pydantic-модели API
│ ├── requests.py
│ └── responses.py
├── routers/
│ ├── health.py
│ ├── documents.py # upload / list / chunks / delete / reindex
│ ├── query.py # /query (одиночный вопрос)
│ ├── chat.py # /chat (диалог с памятью)
│ └── threads.py # CRUD тредов
├── services/
│ ├── embeddings.py # E5-large
│ ├── vectorstore.py # ChromaDB
│ ├── document_processor.py # парсер + чанкер
│ ├── text_cleanup.py # чистка markdown-мусора
│ ├── document_service.py # SQLite-слой для raw_text
│ ├── llm_client.py # DeepSeek
│ ├── rag_pipeline.py # /query pipeline
│ └── chat_service.py # диалоги: создание треда, сборка контекста
├── static/
│ ├── index.html # страница «Отладка»
│ └── sandbox.html # страница «Песочница»
└── data/
├── chroma/ # векторная БД (gitignored)
└── sqlite/ # реляционная БД (gitignored)
Документация (docs/)
docs/
├── SPRINTS.md # план и статус спринтов
├── architecture/
│ ├── GRAPH_ARCHITECTURE_v1.md # черновик при развороте 2026-04-23
│ ├── GRAPH_ARCHITECTURE_v2.md # уточнения 2026-04-24
│ └── GRAPH_ARCHITECTURE_v3.md # текущая (билингв. термины + ссылки на примеры)
└── examples/
├── 01_basic_booking.md # happy path записи (линейный)
├── 02_price_during_booking.md # soft-insertion vs. hard-handoff
└── 03_child_patient_guard.md # guard в шаге qualify (запись ребёнка)
Связанные проекты
work-pcs-dr-cdss— RAG для врачей, источник технических паттернов.work-pcs-pt-mobile— мобильное приложение пациента (канал подключит другой разработчик).work-pcs-pt-bots— пациентские боты МАКС (канал подключит другой разработчик).