NODEDC_1C/IN/TZ_LLM_Normalizer_v1.1.1.md

414 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TZ_LLM_Normalizer_v1.1.1.md
Да, ты правильно понимаешь.
Сейчас у вас набор **типизированный и управляемый**:
* кейсы уже разложены по классам;
* видно, где именно остаточные промахи;
* промахи уже не системные, а **пограничные**;
* значит, текущий этап — это именно **шлифовка на известных типах**, а не поиск всей правды о мире.
Именно поэтому сейчас есть смысл делать **v1.1.1 polish**:
не большой новый этап, а аккуратную доводку по 35 остаточным паттернам, с минимальным риском деградации и минимальным бюджетом.
---
# Главное про риск деградации
Риск деградации тут **есть**, но он уже локальный, не катастрофический.
## Откуда риск
Сейчас normalizer уже хорошо держит:
* schema,
* route,
* causal semantics,
* cross-entity.
Если начать слишком агрессивно править promptы, можно:
* случайно сломать уже хорошие `cross_entity`;
* ухудшить `route_hint_accuracy`;
* вернуть лишние переэскалации;
* попортить confidence-policy.
## Поэтому правильный режим такой
Нужно делать не “ещё один большой тюнинг”, а:
* **не трогать то, что уже даёт 100%**
* править только:
* `period_close_risk` vs `heavy_analytical`
* `drilldown_explain` vs лишний `needs_cross_entity_join`
* `anomaly_probe` vs лишний `batch_refresh_then_store`
То есть это именно **surgical patch**, а не новая версия всего normalizerа.
---
# ТЗ для Codex: Normalizer v1.1.1 Polish
## 1. Цель этапа
Провести точечную доводку `normalizer_v1_1` до `normalizer_v1_1_1`, чтобы улучшить остаточные показатели **без деградации уже работающих классов** и без дорогих повторных прогонов.
Цели:
* убрать оставшиеся пограничные mismatchи;
* улучшить согласованность `intent_class` и `requires`;
* уменьшить лишнюю route escalation;
* сохранить текущие сильные результаты:
* `schema_validation_pass_rate = 100`
* `route_hint_accuracy = 96.67`
* `cross_entity = 100%`
* `high_confidence_error_rate = 0`
---
## 2. Scope этапа
### В scope входит
* точечный forensic-аудит остаточных mismatchов;
* минимальная правка taxonomy logic;
* минимальная правка few-shot и developer prompt;
* контрольный микро-прогон на узком наборе кейсов;
* оценка риска деградации относительно v1.1.
### В scope не входит
* новый большой eval на 30+ новых кейсах;
* переписывание всей схемы;
* переписывание всего prompt manager;
* новая архитектура normalizer;
* массовый prompt sweep;
* расширение доменного словаря во все стороны.
---
## 3. Что именно надо чинить
## Паттерн 1. `period_close_risk` уезжает в `heavy_analytical`
### Симптом
Вопросы про предзакрытие/конец периода/что взорвётся в последний день:
* понимаются по route правильно;
* но получают `intent_class = heavy_analytical` вместо `period_close_risk`.
### Что нужно сделать
Уточнить taxonomy:
Если вопрос содержит смысл:
* предзакрытие,
* конец периода,
* перед сдачей отчетности,
* в последний день,
* что взорвётся,
* что критично перед закрытием,
* где опасные хвосты перед закрытием,
то primary intent должен быть:
* `period_close_risk`
Даже если при этом:
* нужен обзор,
* нужна приоритизация,
* нужен batch route.
### Важно
`period_close_risk` не должен исчезать внутрь `heavy_analytical`.
`heavy_analytical` — это обзорный/рейтинговый класс.
`period_close_risk` — это специальный предметный класс с периодной угрозой.
---
## Паттерн 2. В точечном drilldown лишне поднимается `needs_cross_entity_join = true`
### Симптом
Для вопросов вида:
* “покажи документ №... и связанную проводку”
* “покажи карточку конкретной операции и связанную проводку”
маршрут правильный:
* `live_mcp_drilldown`
intent тоже правильный:
* `drilldown_explain`
Но в `requires` появляется лишнее:
* `needs_cross_entity_join = true`
### Что нужно сделать
Уточнить правило:
Если вопрос:
* про **один конкретный объект**
* и у него есть идентификатор / номер / ref / карточка / конкретная операция / конкретный документ,
* и задача — точечно показать source-of-record / связанную проводку / один связанный объект,
то:
* `needs_exact_object_trace = true`
* `needs_runtime_truth = true`
* `needs_cross_entity_join = false`
Даже если в вопросе упоминается “связанная проводка”.
### Логика
Связанный объект в точечном drilldown — это ещё не multi-entity join в смысле causal report.
---
## Паттерн 3. `anomaly_probe` местами переэскалирует в `batch_refresh_then_store`
### Симптом
Есть вопрос уровня:
* “где по июню выглядит подозрительно, но без точечного документа, просто дай зоны риска”
Ожидание:
* `anomaly_probe`
* `store_feature_risk`
Факт:
* `anomaly_probe`
* но route уходит в `batch_refresh_then_store`
### Что нужно сделать
Уточнить правило route hint:
Если:
* вопрос аномальный / риск-ориентированный,
* не требует ranking,
* не требует whole-company overview,
* не требует full prioritized review,
* не требует batch-scale summary,
то:
* route должен оставаться `store_feature_risk`
Даже если:
* есть `needs_period_cut = true`
* есть общая риск-лексика.
### Логика
Сам по себе “июнь” или “зоны риска” не должен автоматически толкать всё в batch.
---
## 4. Что надо поменять в promptах
## 4.1 Developer prompt
Нужно добавить 3 точечных блока правил:
### Блок A. `period_close_risk`
```text
Если вопрос явно относится к предзакрытию, закрытию периода, сдаче отчетности, концу месяца или рискам последнего дня, primary intent_class должен быть period_close_risk, а не heavy_analytical, даже если требуется обзор или приоритизация.
```
### Блок B. exact drilldown
```text
Если вопрос относится к одному конкретному документу, операции, номеру, ref или объекту и просит показать связанную проводку или источник, это exact object trace. В таком случае needs_cross_entity_join не поднимается, если не требуется анализ множества сущностей или нескольких кейсов.
```
### Блок C. anomaly without heavy batch
```text
Если вопрос просит показать зоны риска, подозрительные случаи или аномалии без рейтинга, без full overview и без company-wide aggregation, route_hint должен быть store_feature_risk, а не batch_refresh_then_store.
```
---
## 4.2 Few-shot
Добавить **ровно 3 новых few-shot**:
### Few-shot 1
`period_close_risk` vs `heavy_analytical`
Пример:
* “Перед закрытием периода что у нас может взорваться в последний день?”
Ожидание:
* `intent_class = period_close_risk`
* `route_hint = batch_refresh_then_store`
### Few-shot 2
точечный drilldown без `needs_cross_entity_join`
Пример:
* “Покажи документ №TRX-88 и связанную проводку по 51”
Ожидание:
* `intent_class = drilldown_explain`
* `needs_exact_object_trace = true`
* `needs_cross_entity_join = false`
* `route_hint = live_mcp_drilldown`
### Few-shot 3
anomaly without batch escalation
Пример:
* “Где по июню выглядит подозрительно, просто дай зоны риска без детального разбора”
Ожидание:
* `intent_class = anomaly_probe`
* `route_hint = store_feature_risk`
---
## 5. Что нельзя трогать
Codex запрещено:
* ухудшать cross-entity rules;
* переписывать causal language interpretation;
* менять schema;
* трогать confidence logic, если это не требуется точечно;
* добавлять много новых few-shot;
* делать большие перестройки domain prompt.
Сильные зоны v1.1:
* `cross_entity`
* `heavy_analytical`
* `rule_based_account_control`
* общий `route_hint`
Их надо **сохранять**, а не “переосмыслять”.
---
## 6. Прогоны и бюджет
### Режим
Только **микро-проверка**, очень экономно.
### Лимит
* максимум **5 API-вызовов** на весь этап polish;
* один кейс = один запрос;
* без повторов, кроме технического fail;
* `temperature = 0`
### Контрольный набор
Проверить только эти кейсы:
1. `NQ-008`
2. `V11-DD-005`
3. `V11-OT-003`
4. `V11-OT-004`
5. `V11-OT-005`
### Зачем именно они
Они покрывают все три остаточных паттерна:
* drilldown overspecification,
* taxonomy drift,
* route over-escalation.
---
## 7. Что должен выдать Codex
### Артефакты
1. `docs/normalizer_v1_1_1_patch_notes.md`
2. обновлённый:
* `prompts/developer/normalizer_v1_1_1.txt`
* `prompts/fewshot/normalizer_fewshot_v1_1_1.txt`
3. `reports/normalizer_v1_1_1_micro_eval.json`
4. `reports/normalizer_v1_1_1_micro_eval.md`
### В patch notes обязательно указать
* что именно было изменено;
* какие 3 паттерна лечили;
* почему изменения безопасны;
* сколько API-вызовов реально потрачено;
* были ли ретраи;
* что улучшилось;
* что осталось как есть.
---
## 8. Критерии приёмки
Этап считается принятым, если:
1. не превышен лимит в 5 запросов;
2. schema validation остаётся 100;
3. `NQ-008` и `V11-DD-005` больше не поднимают лишний `needs_cross_entity_join`;
4. `V11-OT-003` и `V11-OT-005` получают `intent_class = period_close_risk`;
5. `V11-OT-004` получает `route_hint = store_feature_risk`;
6. не возникает деградации на уже сильных классах;
7. patch описан прозрачно и без “магических” неясных изменений.
---
## 9. Честная цель этапа
Не надо ставить задачу “добить всё до 99”.
Правильная цель этого этапа:
* подчистить остаточные пограничные ошибки,
* не поломать working core,
* зафиксировать устойчивую v1.1.1,
* после этого уже собирать **новую пачку других кейсов** на следующем этапе.
То есть сейчас:
**не расширение мира, а полировка известной карты.**
---
## 10. Короткая версия для Codex
Сделать v1.1.1 patch:
* точечно поправить `period_close_risk` vs `heavy_analytical`,
* убрать лишний `needs_cross_entity_join` в точечном drilldown,
* убрать лишнюю batch-эскалацию для мягкого anomaly-probe,
* добавить 3 few-shot,
* сделать микро-прогон на 5 кейсах,
* не потратить больше 5 запросов,
* не трогать сильные части модели.