18 KiB
TZ_LLM_Normalizer_v1.md
Ниже даю жёсткое ТЗ для Codex на точечную доводку LLM-normalizer с очень экономным режимом прогонов.
ТЗ для Codex: точечная доводка LLM Normalizer v1 → v1.1
1. Цель этапа
Довести текущий LLM-normalizer до более стабильного качества на реальных бухгалтерских человеческих запросах, не раздувая бюджет на API-прогоны.
Главная цель этапа:
- поднять качество нормализации;
- убрать текущие semantic-промахи по
intent_class,route_hintиcausal flags; - сохранить 100% schema validation;
- сделать это через точечные изменения prompt/few-shot/eval, без массовых дорогих прогонов.
2. Текущий статус
Текущий eval дал:
schema_validation_pass_rate = 100intent_class_accuracy = 72.73route_hint_accuracy = 90.91causal_flag_accuracy = 81.82high_confidence_error_rate = 9.09
Проблемные кейсы:
NQ-004NQ-008NQ-009
Тип проблемы:
- schema уже держится хорошо;
- route_hint уже близок к рабочему;
- основное слабое место —
intent_class; - часть ошибок связана с неправильной трактовкой causal/cross-entity языка;
- минимум один кейс даёт ошибку route при при этом пойманной causal-семантике.
3. Главный принцип этапа
Очень важно
Не делать дорогую “перестрелку запросами”.
Нельзя:
- гонять большие автоматические sweep’ы;
- отправлять много повторов на один и тот же кейс;
- делать temperature-sampling по 10–20 вариантов;
- прогонять сотни запросов на каждую мелкую правку.
Нужно:
- сделать точечную forensic-доработку;
- разобрать 3 проблемных кейса;
- внести минимальные, но сильные изменения;
- прогнать ровно один запрос на кейс в контрольном eval-наборе;
- максимум 30 запросов на финальный контроль.
4. Budget constraints / лимиты на прогоны
Codex обязан соблюдать жёсткий лимит.
Допустимый лимит API-вызовов на этот этап
- до 10 вызовов на forensic/ручную проверку;
- до 30 вызовов на финальный eval-run;
- итого целевой потолок: не более 40 внешних LLM-запросов на весь этап.
Правила
-
Один кейс = один запрос.
-
Не делать повторные запросы на тот же кейс без явной необходимости.
-
Ретраи разрешены только:
- при техническом fail,
- при невалидном JSON,
- не более 1 повтора на кейс.
-
Не делать random sampling.
-
temperature = 0на всех eval-запусках. -
Не делать “прогоны для красоты” после достижения приемлемого результата.
5. Что нужно сделать по шагам
Этап A. Forensic-аудит проблемных кейсов
Задача A1
Разобрать вручную кейсы:
NQ-004NQ-008NQ-009
Что нужно собрать по каждому кейсу
Для каждого кейса составить мини-таблицу:
case_idraw_questionexpected.intent_classactual.intent_classexpected.route_hintactual.route_hintexpected.requiresactual.requiresкакие признаки модель не увиделакакие признаки модель увидела лишниепредполагаемая причина ошибкикакая минимальная правка должна это исправить
Ожидаемый результат
Файл:
docs/normalizer_forensic_audit_v1_1.md
Ограничение по вызовам
Новые API-вызовы для этого этапа делать только если не хватает уже существующих trace/result-данных. Цель: по возможности 0 новых запросов, максимум 3.
Этап B. Точечная доработка taxonomy и route logic в prompt-слое
Задача B1
Уточнить developer prompt так, чтобы он:
-
жёстче различал:
cross_entityanomaly_proberule_based_account_controldrilldown_explainambiguous_human_query
-
не сваливал causal cross-entity в соседние классы.
Задача B2
Добавить/исправить правила приоритетов:
Приоритет 1
Если вопрос требует связать:
- документы,
- оплаты,
- проводки,
- закрывающие,
- договоры,
- регистры,
- даты,
- подтверждение цепочки,
то это не simple_factual и обычно не store_feature_risk,
а causal multi-entity scenario.
Приоритет 2
Если вопрос про множество кейсов, даже если просит “объяснить”, это не needs_exact_object_trace, если нет одного конкретного документа/проводки/объекта.
Приоритет 3
Если в вопросе есть риск/аномалия-лексика, но одновременно есть document/payment/posting chain, то приоритет у causal cross-entity semantics, а не у risk-bucket.
Приоритет 4
ambiguous_human_query использовать только когда вопрос действительно не раскладывается в конкретный intent-class, а не как ленивый fallback.
Задача B3
Уточнить domain prompt:
-
расширить словарь фраз:
- “не бьётся”
- “не сходится”
- “не видно”
- “не собралось”
- “повисло”
- “хвост”
- “разложи по документам / оплатам / закрывающим”
- “чем подтверждается”
- “где ошибка в цепочке”
- “что пошло криво”
-
привязать их к causal semantics.
Ожидаемый результат
Обновить:
prompts/developer/normalizer_v1_1.txtprompts/domain/normalizer_domain_v1_1.txt
Этап C. Few-shot patch вместо большого переписывания
Задача C1
Не переписывать весь prompt заново. Добавить только 5–7 новых few-shot примеров, которые закрывают пограничные случаи.
Обязательные типы новых few-shot
Нужно минимум по одному примеру на каждый паттерн:
cross_entityvsanomaly_probecross_entityvsrule_based_account_controlcross_entity multiple explainvsdrilldown_explaincausal human language+risk wordsambiguous human wording, которое всё равно надо класть в нормальный intent-classrule-based controlбез causal chainheavy overviewбез точечного explain
Требование
Few-shot должны быть короткими. Не делать огромные простыни.
Ожидаемый результат
Обновить:
prompts/fewshot/normalizer_fewshot_v1_1.txt
Этап D. Ужесточить confidence policy
Задача D1
Снизить долю high-confidence ошибок.
Что нужно сделать
Добавить в developer prompt правило:
Модель не должна ставить:
confidence.overall = highconfidence.route_hint = high
если одновременно:
- есть ambiguity,
- route зависит от тонкого различия между соседними классами,
- вопрос длинный и многослойный,
- модель не уверена в period scope,
- causal semantics частично восстановлена, но не полностью.
Цель
Снизить high_confidence_error_rate.
Ожидаемый результат
Правка внутри:
developer prompt- опционально: post-validation rule на backend, который помечает suspicious confidence
Этап E. Подготовить экономный eval-набор из 30 кейсов
Задача E1
Собрать один контрольный eval-набор:
eval_cases/normalizer_eval_v1_1_30cases.json
Размер
Ровно 30 кейсов, не больше.
Ограничение
Один кейс = один запрос.
Состав набора
Сделать сбалансированно:
cross_entity— 10 кейсовheavy_analytical— 5 кейсовdrilldown_explain— 5 кейсовrule_based_account_control— 5 кейсовanomaly_probe / ambiguous_human_query / period_close_risk— 5 кейсов
Обязательные условия
- включить
NQ-004,NQ-008,NQ-009в переработанном виде или их исходные кейсы; - включить минимум 5 человеческих формулировок из creative-stress стиля;
- не делать дубли почти одинаковых вопросов.
Этап F. Сделать один контрольный прогон
Задача F1
Запустить один eval-run по 30 кейсам.
Правила прогона
-
temperature = 0 -
один запрос на кейс
-
без multi-sampling
-
без повторов, кроме:
- технического fail
- invalid JSON
-
максимум 1 retry на кейс
Ожидаемый файл отчёта
reports/normalizer_eval_v1_1_run.md
Ожидаемый JSON
reports/normalizer_eval_v1_1_run.json
6. Что нужно измерять в финальном отчёте
В отчёт обязательно вывести:
cases_totalschema_validation_pass_rateintent_class_accuracyroute_hint_accuracycausal_flag_accuracyhigh_confidence_error_rate
Дополнительно:
-
accuracy по каждому классу:
cross_entityheavy_analyticaldrilldown_explainrule_based_account_controlanomaly_probe
-
список всех mismatch’ов
-
короткий комментарий по каждому mismatch’у
-
сравнение до / после относительно текущих baseline-метрик
7. Целевые метрики этапа
Ниже не “идеальный мир”, а реальные целевые ориентиры.
Минимально приемлемо
schema_validation_pass_rate >= 95intent_class_accuracy >= 85route_hint_accuracy >= 92causal_flag_accuracy >= 88high_confidence_error_rate <= 7
Хороший результат
schema_validation_pass_rate >= 98intent_class_accuracy >= 88route_hint_accuracy >= 94causal_flag_accuracy >= 90high_confidence_error_rate <= 5
Отличный результат
schema_validation_pass_rate = 100intent_class_accuracy >= 90route_hint_accuracy >= 95causal_flag_accuracy >= 92high_confidence_error_rate <= 3
Важно
Цель “95+ везде” можно держать как aspirational target, но Codex не должен ради этого устраивать дорогую перестрелку запросами. Сначала нужен максимально дешёвый и умный рост качества.
8. Что нельзя делать
Codex запрещено:
- Делать массовый prompt sweep.
- Прогонять десятки вариантов одного и того же кейса.
- Использовать temperature > 0 для eval.
- Делать скрытые повторные запросы “на всякий случай”.
- Увеличивать eval set выше 30 кейсов без явной необходимости.
- Пытаться лечить всё переписыванием backend-логики, если проблема решается prompt/few-shot таксономией.
- Ломать уже рабочую schema validation ради intent tuning.
9. Что нужно поправить в коде
Codex должен проверить и при необходимости обновить:
A. Prompt manager
-
версионирование prompt’ов:
normalizer_v1normalizer_v1_1
-
возможность быстро переключать presets
B. Eval runner
-
добавить режим:
single-pass-strict
-
который гарантирует:
- один запрос на кейс,
- без повторов,
- лог явных retries
C. Report generator
- добавить сравнение baseline vs current
- отдельно выводить mismatch table
- отдельно выводить bad confidence cases
D. Storage / trace
-
сохранить привязку:
case_idtrace_idprompt_versionschema_versionmodelrequest_count_for_case
Это нужно, чтобы контролировать бюджет реально.
10. Какие артефакты должен выдать Codex
Codex обязан выдать:
-
docs/normalizer_forensic_audit_v1_1.md -
обновлённые prompt-файлы:
prompts/developer/normalizer_v1_1.txtprompts/domain/normalizer_domain_v1_1.txtprompts/fewshot/normalizer_fewshot_v1_1.txt
-
новый eval-набор:
eval_cases/normalizer_eval_v1_1_30cases.json
-
обновлённый экономный eval runner
-
отчёты:
reports/normalizer_eval_v1_1_run.mdreports/normalizer_eval_v1_1_run.json
-
краткий changelog:
docs/normalizer_v1_1_changes.md
11. Формат changelog
В changelog обязательно указать:
- что именно было изменено в prompt’ах;
- какие linguistic patterns добавлены;
- какие few-shot кейсы добавлены;
- какие кейсы были проблемными в baseline;
- сколько API-вызовов было потрачено на этап;
- итоговые метрики до/после;
- что осталось проблемным после тюнинга.
12. Приёмка этапа
Этап считается принятым, если одновременно выполнены условия:
-
Не превышен лимит внешних API-вызовов:
- желательно до 40,
- жёсткий потолок 45 только при техфейлах.
-
Есть forensic-аудит 3 проблемных baseline-кейсов.
-
Есть обновлённые prompt/few-shot файлы.
-
Есть новый eval-набор из 30 кейсов.
-
Есть один финальный eval-run.
-
Schema validation не просела.
-
route_hint_accuracyне стала хуже baseline. -
intent_class_accuracyвыросла заметно относительно baseline. -
high_confidence_error_rateне вырос, а лучше — снизился. -
В отчёте есть честный список оставшихся mismatch’ов.
13. Короткий practical summary для Codex
Что делать по сути:
- Разобрать 3 плохих кейса.
- Точечно усилить taxonomy и causal-language interpretation.
- Добавить 5–7 сильных few-shot примеров.
- Не трогать лишнего.
- Собрать 30-кейсовый eval set.
- Прогнать его одним проходом.
- Сравнить с baseline.
- Выдать отчёт и changelog.
- Не жечь бюджет.
14. Самый важный акцент
Главная задача Codex сейчас — не сделать “идеальную исследовательскую систему”, а сделать дешёвую и умную доводку уже рабочего normalizer’а.
То есть нужно:
- чинить только то, что реально болит;
- не трогать то, что уже работает;
- не плодить дорогие прогоны;
- улучшать качество через forensic + prompt/few-shot patching.