feat(llm): RAG — база знаний по КР с цитатами (#60) #61

Merged
Eleboba merged 1 commits from feat/60-rag into dev 2026-10-04 04:14:53 +03:00
Owner

Что меняется

База знаний (RAG) по клиническим рекомендациям: КР ПТСР 2023, КР Депрессия 2024 и спецификация модуля «Лекарства». PDF переведены в txt и сверены по словам. Поиск — офлайн-BM25 по основам слов с синонимами. Ответы экстрактивные: только предложения из КР с цитатой «[КР ПТСР 2023, стр. N]».

Closes #60

Зона

A (app/llm/rag, config/texts/rag.yaml, tests/test_llm_*). Плюс новые config/rag/ (корпус) и docs/source/rag/ (PDF и конвертер), ADR-011 в docs/DECISIONS.md. Контракты и pyproject.toml не тронуты, новых зависимостей нет.

Как проверить

make lint && make test
uv run python -m app.llm.rag "через сколько начинают действовать антидепрессанты"
uv run python -m app.llm.rag "что такое флэшбек"
uv run python -m app.llm.rag "какой рецепт борща"            # → «ответа нет, уточните у врача»
uv run python -m app.llm.rag --audience doctor "синдром отмены антидепрессантов"
uv run python -m app.llm.rag --search "ДПДГ при ПТСР"         # сырые фрагменты со скорами

Гарантии:

  • Пациенту: дозы и назначения вырезаются, вопрос о дозе отправляется к врачу, в конце всегда приписка «решает ваш врач». Перефразировка LLM с новым содержанием отбраковывается.
  • Врачу: дословные цитаты с уровнем доказательности.
  • Документы команды (audiences: [team]) наружу не попадают.
  • Safety-проверка входящего — на стороне вызывающего, как и для med_qa.

Метрики (tests/test_llm_rag.py): hit@3 = 15/18 на контрольных вопросах, 9/9 вопросов не по теме отсечены.

Встраивание в диалог и дашборд — отдельными issue.

Чек-лист

  • rebase на origin/dev
  • make lint + make test зелёные (753 passed)
  • лог в issue (### 2026-10-04)
  • нет ПДн в логах, нет реальных данных, нет секретов
  • общие файлы не тронуты (кроме записи ADR и строки в config/README.md)

🤖 Generated with Claude Code

## Что меняется База знаний (RAG) по клиническим рекомендациям: КР ПТСР 2023, КР Депрессия 2024 и спецификация модуля «Лекарства». PDF переведены в txt и сверены по словам. Поиск — офлайн-BM25 по основам слов с синонимами. Ответы экстрактивные: только предложения из КР с цитатой «[КР ПТСР 2023, стр. N]». Closes #60 ## Зона A (`app/llm/rag`, `config/texts/rag.yaml`, `tests/test_llm_*`). Плюс новые `config/rag/` (корпус) и `docs/source/rag/` (PDF и конвертер), ADR-011 в `docs/DECISIONS.md`. Контракты и `pyproject.toml` не тронуты, новых зависимостей нет. ## Как проверить ```bash make lint && make test uv run python -m app.llm.rag "через сколько начинают действовать антидепрессанты" uv run python -m app.llm.rag "что такое флэшбек" uv run python -m app.llm.rag "какой рецепт борща" # → «ответа нет, уточните у врача» uv run python -m app.llm.rag --audience doctor "синдром отмены антидепрессантов" uv run python -m app.llm.rag --search "ДПДГ при ПТСР" # сырые фрагменты со скорами ``` Гарантии: - Пациенту: дозы и назначения вырезаются, вопрос о дозе отправляется к врачу, в конце всегда приписка «решает ваш врач». Перефразировка LLM с новым содержанием отбраковывается. - Врачу: дословные цитаты с уровнем доказательности. - Документы команды (`audiences: [team]`) наружу не попадают. - Safety-проверка входящего — на стороне вызывающего, как и для `med_qa`. Метрики (`tests/test_llm_rag.py`): hit@3 = 15/18 на контрольных вопросах, 9/9 вопросов не по теме отсечены. Встраивание в диалог и дашборд — отдельными issue. ## Чек-лист - [x] rebase на origin/dev - [x] make lint + make test зелёные (753 passed) - [x] лог в issue (### 2026-10-04) - [x] нет ПДн в логах, нет реальных данных, нет секретов - [x] общие файлы не тронуты (кроме записи ADR и строки в config/README.md) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Eleboba added 1 commit 2026-10-04 04:12:57 +03:00
- docs/source/rag: PDF sources (KR PTSD 2023, KR depression 2024, meds module spec),
  pdf->txt converter (tables as markdown, page markers, hand-transcribed figures),
  word-level check against pdftotext; fixes HAM-D/MADRS fake headers and split rows
- config/rag: corpus txt + sources.yaml (documents, audiences, retrieval params, synonyms)
- app/llm/rag: Snowball stemmer, section-aware chunker with page citations,
  BM25 + synonym expansion + densest-passage reranking, extractive answer()
  with coverage gate, patient dose/prescribing filter, optional LLM rephrasing
  rejected when it adds content; CLI python -m app.llm.rag
- tests: gold retrieval set (hit@3 >= 15/18), off-topic, safety, faithfulness
- ADR-011

Refs #60

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eleboba merged commit 6c212d560c into dev 2026-10-04 04:14:53 +03:00
Eleboba deleted branch feat/60-rag 2026-10-04 04:14:53 +03:00
Sign in to join this conversation.