Initial import NDC_1C
This commit is contained in:
@@ -0,0 +1,413 @@
|
||||
TZ_LLM_Normalizer_v1.1.1.md
|
||||
|
||||
Да, ты правильно понимаешь.
|
||||
|
||||
Сейчас у вас набор **типизированный и управляемый**:
|
||||
|
||||
* кейсы уже разложены по классам;
|
||||
* видно, где именно остаточные промахи;
|
||||
* промахи уже не системные, а **пограничные**;
|
||||
* значит, текущий этап — это именно **шлифовка на известных типах**, а не поиск всей правды о мире.
|
||||
|
||||
Именно поэтому сейчас есть смысл делать **v1.1.1 polish**:
|
||||
не большой новый этап, а аккуратную доводку по 3–5 остаточным паттернам, с минимальным риском деградации и минимальным бюджетом.
|
||||
|
||||
---
|
||||
|
||||
# Главное про риск деградации
|
||||
|
||||
Риск деградации тут **есть**, но он уже локальный, не катастрофический.
|
||||
|
||||
## Откуда риск
|
||||
|
||||
Сейчас 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 запросов,
|
||||
* не трогать сильные части модели.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user