[bot][A] fix(rag): страницы в цитатах, метки scrub, выбор документа по заболеванию #62

Closed
opened 2026-10-04 04:24:23 +03:00 by Eleboba · 0 comments
Owner

Описание

Аудит RAG (#60) после мержа нашёл три подтверждённых дефекта:

  1. Страница в цитате на единицу меньше реальной у ~1.2% предложений (27 из ~2300). Когда «Комментарии: ...» или продолжение абзаца приклеивается к абзацу с предыдущей страницы, page_end фрагмента не обновляется. Пример: «[КР ПТСР 2023, стр. 22]», а текст на стр. 23.
  2. Метки обезличивания ломают ответ. После scrub() остаются [NAME], [PHONE], и поиск считает их словами, которых нет в корпусе. «Иван Петров, 89161234567, что такое ПТСР» → покрытие 0.06 → «ответа нет». В боте scrub() вызывается всегда.
  3. Ответ из чужого документа. «ТМС при депрессии» → цитата из КР ПТСР про пациентов с ПТСР. Если в вопросе названо заболевание, приоритет должен быть у профильной КР.

Желаемый результат

  • page_end учитывает страницу последней приклеенной строки; проверка по тексту PDF постранично — 0 ошибок вне страниц со схемами.
  • Метки [A-Z_] не участвуют в поиске и покрытии.
  • Заболевание в вопросе (депрессия / ПТСР) повышает профильный документ (config/rag/sources.yaml, doc_cues).
  • Регрессионные тесты на все три пункта.

Анализ

Затрагиваемые файлы

Файл Что меняется
app/llm/rag/corpus.py page_end у юнитов
app/llm/rag/index.py фильтр меток, буст документа по заболеванию
config/rag/sources.yaml doc_cues
tests/test_llm_rag.py регрессии

Ограничения и риски

Офлайн, детерминизм, без новых зависимостей. Выявленное, но не входящее сюда: часть разговорных вопросов уходит в «уточните у врача»; лексический поиск иногда пропускает в ответ нерелевантный отрывок («обильное питьё» на вопрос про алкоголь). Это отдельная задача.

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

make lint && make test; uv run python -m app.llm.rag "Иван Петров, что такое ПТСР" → ответ.


Лог выполнения

2026-10-04

  • Что сделано: метка ⟦стр. N⟧ в конвертере + учёт страниц в чанкере; фильтр меток scrub в токенизаторе; doc_cues (буст профильной КР ×2 в поиске и при выборе отрывка). Регрессионные тесты.
  • Результат: ошибочных страниц в цитатах 24 → 3 (остались строки бланков шкал, разорванные страницей); вопрос с [NAME]/[PHONE] получает тот же ответ; «ТМС при депрессии» → КР Депрессия. Отложенный набор (22 новых вопроса): hit@3 врач 10/11 → 11/11, пациент 6/11 → 7/11; контрольный набор без изменений (15/18).
  • Осталось (вне задачи): разговорные вопросы пациента часто уходят в «уточните у врача» (11 из 27); иногда в ответ проходит нерелевантный, но дословный отрывок.
## Описание Аудит RAG (#60) после мержа нашёл три подтверждённых дефекта: 1. **Страница в цитате на единицу меньше реальной** у ~1.2% предложений (27 из ~2300). Когда «Комментарии: ...» или продолжение абзаца приклеивается к абзацу с предыдущей страницы, `page_end` фрагмента не обновляется. Пример: «[КР ПТСР 2023, стр. 22]», а текст на стр. 23. 2. **Метки обезличивания ломают ответ.** После `scrub()` остаются `[NAME]`, `[PHONE]`, и поиск считает их словами, которых нет в корпусе. «Иван Петров, 89161234567, что такое ПТСР» → покрытие 0.06 → «ответа нет». В боте `scrub()` вызывается всегда. 3. **Ответ из чужого документа.** «ТМС при депрессии» → цитата из КР ПТСР про пациентов с ПТСР. Если в вопросе названо заболевание, приоритет должен быть у профильной КР. ## Желаемый результат - `page_end` учитывает страницу последней приклеенной строки; проверка по тексту PDF постранично — 0 ошибок вне страниц со схемами. - Метки `[A-Z_]` не участвуют в поиске и покрытии. - Заболевание в вопросе (депрессия / ПТСР) повышает профильный документ (`config/rag/sources.yaml`, `doc_cues`). - Регрессионные тесты на все три пункта. ## Анализ ### Затрагиваемые файлы | Файл | Что меняется | |---|---| | `app/llm/rag/corpus.py` | page_end у юнитов | | `app/llm/rag/index.py` | фильтр меток, буст документа по заболеванию | | `config/rag/sources.yaml` | `doc_cues` | | `tests/test_llm_rag.py` | регрессии | ### Ограничения и риски Офлайн, детерминизм, без новых зависимостей. Выявленное, но не входящее сюда: часть разговорных вопросов уходит в «уточните у врача»; лексический поиск иногда пропускает в ответ нерелевантный отрывок («обильное питьё» на вопрос про алкоголь). Это отдельная задача. ## Как проверить `make lint && make test`; `uv run python -m app.llm.rag "Иван Петров, что такое ПТСР"` → ответ. --- ## Лог выполнения ### 2026-10-04 - **Что сделано:** метка ⟦стр. N⟧ в конвертере + учёт страниц в чанкере; фильтр меток scrub в токенизаторе; doc_cues (буст профильной КР ×2 в поиске и при выборе отрывка). Регрессионные тесты. - **Результат:** ошибочных страниц в цитатах 24 → 3 (остались строки бланков шкал, разорванные страницей); вопрос с [NAME]/[PHONE] получает тот же ответ; «ТМС при депрессии» → КР Депрессия. Отложенный набор (22 новых вопроса): hit@3 врач 10/11 → 11/11, пациент 6/11 → 7/11; контрольный набор без изменений (15/18). - **Осталось (вне задачи):** разговорные вопросы пациента часто уходят в «уточните у врача» (11 из 27); иногда в ответ проходит нерелевантный, но дословный отрывок.
Eleboba added this to the Этап 1 · Ветераны СВО milestone 2026-10-04 04:24:23 +03:00
Eleboba added the lane/Astage/veteransP0botsize/0.5fix labels 2026-10-04 04:24:23 +03:00
Eleboba self-assigned this 2026-10-04 04:24:23 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MedITron/PTSRaiAgent#62