[bot] LLM-шлюз: GigaChat + mock, extract / risk_classify / phrase / summarize #7
Notifications
Due Date
No due date set.
Blocks
Depends on
#10 [bot][A] Движок диалога: конвейер scrub → safety → FSM → мониторинг, согласие, возраст, кризис
MedITron/PTSRaiAgent
#15 [bot][A] med_qa: ответы о препарате только по выдержкам ГРЛС
MedITron/PTSRaiAgent
#19 [bot][A] LLM-саммари динамики для врача по структурированным данным
MedITron/PTSRaiAgent
#24 [core] Eval извлечения и safety на размеченном наборе → цифры для слайда
MedITron/PTSRaiAgent
#2 [core] privacy: scrub() и pseudo_id() + тесты
MedITron/PTSRaiAgent
Reference: MedITron/PTSRaiAgent#7
Reference in New Issue
Block a user
Описание
SPEC §7. Провайдер за протоколом, офлайн
mockпо умолчанию (ADR-004). Всё входное — только послеscrub().Желаемый результат
app/llm/gateway.py:LLMProviderProtocol + фабрика поLLM_PROVIDER. Единственная точка вызова LLM; assert что текст прошёл scrub (маркер/типScrubbedText).app/llm/giga.py: пакетgigachat, temperature 0.1, JSON-ответ, валидация pydantic, 2 ретрая, таймаут, при неудачеNone.app/llm/mock.py: правило-ориентированные ответы (ключевые слова → ItemScore / флаги), покрывает все реплики демо-сценария.extract_item(item, text) -> ItemScore|None;extract_checkin(text) -> CheckinFacts(побочки, намерение бросить, алкоголь, сон, кошмары) с confidence;risk_classify(text) -> none|possible|acute;phrase(intent, context) -> str(короткая эмпатичная реплика без советов/диагнозов);summarize_for_doctor(structured) -> str.app/llm/prompts.py— системные промпты с запретами SPEC §7.Как проверить
Тесты на mock + валидацию; ручной прогон
python -m app.llm.cli extract "сплю плохо, кошмары почти каждую ночь"сLLM_PROVIDER=gigachatпри наличии ключа.Лог выполнения
2026-10-03
2026-10-03
Что сделано
app/llm/gateway.py— единственная точка входа:extract_item,extract_checkin,risk_classify,phrase,summarize_for_doctor; фабрикаget_gateway()/build_gateway(settings)поLLM_PROVIDER.LLMProvider(транспорт:complete_json/complete_text, реализован GigaChat) иLLMTasks(задачи:PromptedTasksповерх провайдера или rule-basedMockTasks). Mock работает на уровне задач, а не разбирает промпты, поэтому политика шлюза одинакова для обоих провайдеров.app/llm/giga.py— GigaChat: temperature 0.1, таймаут 8 с, до 2 ретраев, снятие ```json, валидация pydantic, при неудачеNone; в логах только попытка, латентность, токены, класс ошибки.app/llm/mock.py— регулярные выражения по русскому тексту; покрыты все реплики демо-персоны.app/llm/prompts.py— системные промпты с запретами SPEC §7 + защита от prompt injection.app/llm/guard.py—assert_scrubbed: эшелонированная защита (телефон, e-mail, СНИЛС) перед отправкой в провайдер.config/texts/phrases.yaml— шаблоны реплик (база для перефразирования, ответ mock, fallback) и подписи для саммари врачу.python -m app.llm.cli extract|item|risk— безscrub()отказывается работать (exit 2).Результат
tests/test_llm.py: 52 теста (+1 live, пропускается безGIGACHAT_CREDENTIALS).make lint testзелёный.Заметки/решения
ITEM_CONFIDENCE_THRESHOLD = 0.5; балл выше максимума пункта отбрасывается.risk_classifyпри ошибке →RiskLevel.NONE(вспомогательный сигнал, основной — лексикон).LLM_PROVIDER=gigachatпри пустом ключе → mock с предупреждением (офлайн-первый, ADR-004).1-2(минимальная корзина, кнопка уточняет).phrases.yamlнужно вычитать психиатру (зона clinical).