[bot][A] med_qa: ответы о препарате только по выдержкам ГРЛС #15

Closed
opened 2026-10-03 14:38:55 +03:00 by Eleboba · 2 comments
Owner

Описание

Дни 2, 5, 10 демо: тошнота на сертралине, «брошу», алкоголь. SPEC §7 п.5: только по инструкции через DrugInfo; если ответа нет — «уточните у врача».

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

app/llm/med_qa.py: med_qa(inn, question_scrubbed) -> Answer(text, source_ref) | None — поиск раздела выдержки по ключевым словам, LLM только перефразирует найденный фрагмент (фильтр запретов шлюза). Без изменения доз и советов по препаратам. Тесты на mock.

Зона и владение файлами

Lane A (бот, Егор) — владеет: app/dialog/**, app/channels/**, app/llm/**, config/texts/**, tests/test_dialog_*.py, tests/test_telegram*.py.

Замороженные контракты (менять только отдельным мелким PR с пингом всех): app/core/types.py, app/dialog/contracts.py, app/api/schemas.py, app/integrations/base.py, app/services/contracts.py, app/main.py, app/config.py, config/modules.yaml, config/rules.yaml, config/scales/*, pyproject.toml/uv.lock, docker-compose.yml, Makefile.


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

2026-10-03

2026-10-03

  • Что сделано: app/llm/med_qa.py — med_qa(inn, question, *, topic=None, drug_info=None) -> MedAnswer | None (text, section, source, phrased_by_llm) и fallback_text(). Тема берётся из явного topic движка (поддерживаются коды разделов и алиасы quit_intent→onset, alcohol_interaction→alcohol, nausea→side_effects) либо из классификатора по ключевым словам. Раздел берётся через integrations.drug_info.sections(inn), из него выбираются до 3 самых релевантных предложений (группы симптомов, ключевые слова раздела, пересечение основ слов). LLM только перефразирует выдержку через gateway.phrase("med_answer"). Тексты (запасной ответ, вступление, приписка про врача) лежат в config/texts/med_qa.yaml, в phrases.yaml добавлен шаблон med_answer: "{excerpt}".
  • Результат: 29 тестов в tests/test_llm_med_qa.py (демо-дни 2/5/10, явная тема важнее классификатора, выбор раздела, нет раздела → None, вопросы о дозе → None, запрещённый или «выдуманный» ответ LLM → показывается сама выдержка, mock офлайн). make lint test — 500 passed.
  • Заметки/решения: предложения с режимом дозирования (мг, «доза может увеличиваться») не показываются никогда. Любой вопрос о дозе уходит к врачу. Перефразировка LLM отклоняется, если в ней появились новые числа или больше половины основ слов отсутствуют в выдержке. Приписка «любые изменения решает ваш врач» добавляется вне LLM. Реальных выдержек ГРЛС в коде нет: до #14 NoDrugInfo возвращает [], и med_qa отдаёт None (тогда вызывающий отправляет fallback_text()).
## Описание Дни 2, 5, 10 демо: тошнота на сертралине, «брошу», алкоголь. SPEC §7 п.5: только по инструкции через `DrugInfo`; если ответа нет — «уточните у врача». ## Желаемый результат `app/llm/med_qa.py`: `med_qa(inn, question_scrubbed) -> Answer(text, source_ref) | None` — поиск раздела выдержки по ключевым словам, LLM только перефразирует найденный фрагмент (фильтр запретов шлюза). Без изменения доз и советов по препаратам. Тесты на mock. ## Зона и владение файлами **Lane A (бот, Егор)** — владеет: `app/dialog/**`, `app/channels/**`, `app/llm/**`, `config/texts/**`, `tests/test_dialog_*.py`, `tests/test_telegram*.py`. **Замороженные контракты** (менять только отдельным мелким PR с пингом всех): `app/core/types.py`, `app/dialog/contracts.py`, `app/api/schemas.py`, `app/integrations/base.py`, `app/services/contracts.py`, `app/main.py`, `app/config.py`, `config/modules.yaml`, `config/rules.yaml`, `config/scales/*`, `pyproject.toml`/`uv.lock`, `docker-compose.yml`, `Makefile`. --- ## Лог выполнения ### 2026-10-03 ### 2026-10-03 - **Что сделано:** `app/llm/med_qa.py` — `med_qa(inn, question, *, topic=None, drug_info=None) -> MedAnswer | None` (`text`, `section`, `source`, `phrased_by_llm`) и `fallback_text()`. Тема берётся из явного `topic` движка (поддерживаются коды разделов и алиасы `quit_intent`→onset, `alcohol_interaction`→alcohol, `nausea`→side_effects) либо из классификатора по ключевым словам. Раздел берётся через `integrations.drug_info.sections(inn)`, из него выбираются до 3 самых релевантных предложений (группы симптомов, ключевые слова раздела, пересечение основ слов). LLM только перефразирует выдержку через `gateway.phrase("med_answer")`. Тексты (запасной ответ, вступление, приписка про врача) лежат в `config/texts/med_qa.yaml`, в `phrases.yaml` добавлен шаблон `med_answer: "{excerpt}"`. - **Результат:** 29 тестов в `tests/test_llm_med_qa.py` (демо-дни 2/5/10, явная тема важнее классификатора, выбор раздела, нет раздела → None, вопросы о дозе → None, запрещённый или «выдуманный» ответ LLM → показывается сама выдержка, mock офлайн). `make lint test` — 500 passed. - **Заметки/решения:** предложения с режимом дозирования (`мг`, «доза может увеличиваться») не показываются никогда. Любой вопрос о дозе уходит к врачу. Перефразировка LLM отклоняется, если в ней появились новые числа или больше половины основ слов отсутствуют в выдержке. Приписка «любые изменения решает ваш врач» добавляется вне LLM. Реальных выдержек ГРЛС в коде нет: до #14 `NoDrugInfo` возвращает [], и `med_qa` отдаёт None (тогда вызывающий отправляет `fallback_text()`).
Eleboba added this to the Этап 1 · Ветераны СВО milestone 2026-10-03 14:38:55 +03:00
Eleboba added the P1botsize/0.5feature labels 2026-10-03 14:38:55 +03:00
Eleboba self-assigned this 2026-10-03 14:38:55 +03:00
Eleboba changed title from [bot] med_qa: ответы о препарате только по выдержкам ГРЛС to [bot][A] med_qa: ответы о препарате только по выдержкам ГРЛС 2026-10-03 15:16:27 +03:00
Eleboba added the lane/Astage/veterans labels 2026-10-03 15:16:28 +03:00
Author
Owner

Сделано в PR #48 (смержен); закрываю вручную — в описании PR не было Closes.

Сделано в PR #48 (смержен); закрываю вручную — в описании PR не было `Closes`.
Author
Owner

Сделано в PR #48 (смержен). Закрываю вручную: в описании PR не было Closes. Зависимость от #14 снята: med_qa работает через протокол DrugInfo, настоящие выдержки ГРЛС подключит #14.

Сделано в PR #48 (смержен). Закрываю вручную: в описании PR не было `Closes`. Зависимость от #14 снята: `med_qa` работает через протокол `DrugInfo`, настоящие выдержки ГРЛС подключит #14.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#15