diff --git a/README.md b/README.md index eeb7d89..03f35e8 100644 --- a/README.md +++ b/README.md @@ -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) +``` --- diff --git a/SPRINTS.md b/SPRINTS.md index 5113882..d456adc 100644 --- a/SPRINTS.md +++ b/SPRINTS.md @@ -92,7 +92,7 @@ ### Цель Закрыть технический долг, накопленный за первые два спринта: почистить чанки от markdown-мусора, сделать ответ агента читаемым в UI, подготовить системный промпт к вынесению в редактор (Спринт 3) и навести порядок в логах и README. -### Статус: ⏳ Запланирован +### Статус: ✅ Закрыт ### Задачи