docs: актуализация README, закрытие Спринта 2.5

README переписан под текущее состояние — был TBD со времён init:

- Статус: Спринты 1–2 и доработки (2.5) закрыты, что именно уже
  работает (RAG, многошаговый диалог, переиндексация, две страницы).
- Запуск: команды для установки, старта, ручного наката миграций и
  создания новых. Автомиграции на старте отмечены.
- Использование: табличка API-эндпоинтов (/documents, /query, /chat,
  /threads, /reindex), описание двух веб-страниц и правки системного
  промпта через prompts/system_prompt.md.
- Структура: актуальное дерево директорий с назначением каждого
  модуля (db/, prompts/, routers/, services/, static/).

SPRINTS.md: Спринт 2.5 помечен закрытым — все пять задач пройдены
(логи, системный промпт в файле, markdown-рендер, чистка чанков +
reindex, README).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
AR 15 M4
2026-04-23 11:21:10 +05:00
parent e534a74460
commit 6348d9a206
2 changed files with 121 additions and 3 deletions
+120 -2
View File
@@ -8,7 +8,16 @@
## Статус
🟡 **Active — MVP, проектирование.**
🟢 **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` — правится без кода.
---
@@ -84,7 +93,116 @@
## Запуск
TBD — будет заполнено в Спринте 1.
### Требования
- Python 3.12
- Ключ DeepSeek API
### Установка
```bash
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # и вписать DEEPSEEK_API_KEY
```
### Старт
```bash
.venv/bin/python -m uvicorn main:app --host 0.0.0.0 --port 8003
```
Миграции Alembic применяются автоматически на старте. Первая загрузка
embedding-модели E5-large занимает ~15–20 секунд.
### Вручную накатить миграции
```bash
.venv/bin/alembic upgrade head
```
### Создать новую миграцию после изменения моделей
```bash
.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` — читается при старте сервиса. После правки — рестарт.
---
## Структура
```
.
├── 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)
```
---
+1 -1
View File
@@ -92,7 +92,7 @@
### Цель
Закрыть технический долг, накопленный за первые два спринта: почистить чанки от markdown-мусора, сделать ответ агента читаемым в UI, подготовить системный промпт к вынесению в редактор (Спринт 3) и навести порядок в логах и README.
### Статус: Запланирован
### Статус: Закрыт
### Задачи