Исправления по аудиту RAG: верные страницы в цитатах, корректная работа с текстом после scrub(), приоритет профильной КР, если в вопросе названо заболевание.
A (app/llm/rag, config/rag, tests/test_llm_rag.py); конвертер в docs/source/rag. Корпус изменился только вставкой меток ⟦стр. N⟧ (проверено diff-ом).
Как проверить
make lint && make test
uv run python -m app.llm.rag "Иван Петров, 89161234567, что такое ПТСР"# раньше: «ответа нет»
uv run python -m app.llm.rag "транскраниальная магнитная стимуляция при депрессии"# раньше: цитата из КР ПТСР
Цифры: ошибочных страниц 24 → 3 (из ~2300 предложений, сверка постранично с pdftotext); отложенный набор hit@3: врач 11/11, пациент 7/11.
Чек-лист
rebase на origin/dev
make lint + make test зелёные (757 passed)
лог в issue (### 2026-10-04)
нет ПДн в логах, нет реальных данных, нет секретов
## Что меняется
Исправления по аудиту RAG: верные страницы в цитатах, корректная работа с текстом после `scrub()`, приоритет профильной КР, если в вопросе названо заболевание.
Closes #62
## Зона
A (`app/llm/rag`, `config/rag`, `tests/test_llm_rag.py`); конвертер в `docs/source/rag`. Корпус изменился только вставкой меток ⟦стр. N⟧ (проверено diff-ом).
## Как проверить
```bash
make lint && make test
uv run python -m app.llm.rag "Иван Петров, 89161234567, что такое ПТСР" # раньше: «ответа нет»
uv run python -m app.llm.rag "транскраниальная магнитная стимуляция при депрессии" # раньше: цитата из КР ПТСР
```
Цифры: ошибочных страниц 24 → 3 (из ~2300 предложений, сверка постранично с pdftotext); отложенный набор hit@3: врач 11/11, пациент 7/11.
## Чек-лист
- [x] rebase на origin/dev
- [x] make lint + make test зелёные (757 passed)
- [x] лог в issue (### 2026-10-04)
- [x] нет ПДн в логах, нет реальных данных, нет секретов
- [x] общие файлы не тронуты
🤖 Generated with [Claude Code](https://claude.com/claude-code)
- converter marks a paragraph glued across a page break with ⟦стр. N⟧; the chunker
strips the marker and extends the chunk's page range (wrong-page citations 24 -> 3,
the rest are scale-form table rows split by a page)
- [NAME]/[PHONE] placeholders from privacy.scrub() no longer count as unknown words
(a scrubbed question used to fall below the coverage gate)
- a question naming one disease boosts its guideline in retrieval and passage choice
("ТМС при депрессии" was answered from the PTSD guideline); "антидепрессант" is not a cue
Refs #62
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что меняется
Исправления по аудиту RAG: верные страницы в цитатах, корректная работа с текстом после
scrub(), приоритет профильной КР, если в вопросе названо заболевание.Closes #62
Зона
A (
app/llm/rag,config/rag,tests/test_llm_rag.py); конвертер вdocs/source/rag. Корпус изменился только вставкой меток ⟦стр. N⟧ (проверено diff-ом).Как проверить
Цифры: ошибочных страниц 24 → 3 (из ~2300 предложений, сверка постранично с pdftotext); отложенный набор hit@3: врач 11/11, пациент 7/11.
Чек-лист
🤖 Generated with Claude Code
- converter marks a paragraph glued across a page break with ⟦стр. N⟧; the chunker strips the marker and extends the chunk's page range (wrong-page citations 24 -> 3, the rest are scale-form table rows split by a page) - [NAME]/[PHONE] placeholders from privacy.scrub() no longer count as unknown words (a scrubbed question used to fall below the coverage gate) - a question naming one disease boosts its guideline in retrieval and passage choice ("ТМС при депрессии" was answered from the PTSD guideline); "антидепрессант" is not a cue Refs #62 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>