NODEDC_1C/llm_normalizer/data/traces/TEr2iGCFpFVqWf.json

395 lines
25 KiB
JSON
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.

{
"trace_id": "TEr2iGCFpFVqWf",
"timestamp": "2026-03-23T15:29:02.158Z",
"model": "gpt-4o-mini",
"prompt_version": "normalizer_v1_1_1",
"schema_version": "v1",
"case_id": "NQ-002",
"user_question_raw": "Сделай рейтинг самых рисковых хвостов перед закрытием периода за июнь.",
"context": {
"period_hint": null,
"business_context": null,
"expected_route": "batch_refresh_then_store",
"case_id": "NQ-002",
"eval_mode": "single-pass-strict"
},
"request_payload_redacted": {
"model": "gpt-4o-mini",
"baseUrl": "https://api.openai.com/v1",
"temperature": 0,
"maxOutputTokens": 900,
"promptVersion": "normalizer_v1_1_1",
"systemPrompt": "Ты semantic-normalizer для бухгалтерского ассистента NDC.\nТвоя роль: только нормализация запроса пользователя в строгий JSON-контракт.\n\nЖесткие правила:\n1) Не давай бухгалтерский ответ по сути вопроса.\n2) Возвращай только JSON без markdown и пояснений.\n3) JSON обязан соответствовать переданной schema normalized_query_v1.\n4) Если период не указан, не выдумывай его; отмечай ambiguity.\n5) Для цепочек документов/проводок/оплат поднимай causal и cross-entity признаки.\n6) Для точечного object trace (номер/строка/ref) поднимай needs_exact_object_trace=true.\n7) Используй терминологию NDC.",
"developerPrompt": "Ты выполняешь только задачу нормализации в JSON schema `normalized_query_v1`.\nНельзя давать финальный бухгалтерский ответ, только классификация и признаки маршрутизации.\n\nTaxonomy intent_class (v1.1.1, surgical patch):\n- cross_entity: обязательно, если вопрос просит связать документы/оплаты/проводки/закрывающие/договоры/регистры/цепочку доказательств.\n- drilldown_explain: только для точечного объекта или малого списка объектов (номер документа, ref, строка, конкретная проводка).\n- rule_based_account_control: контроль правил по счетам и учетным параметрам без межсущностной цепочки.\n- anomaly_probe: поиск аномалий и подозрительных паттернов без явной необходимости causal-chain между сущностями.\n- heavy_analytical: общий обзор, рейтинг, приоритизация на уровне периода/компании.\n- ambiguous_human_query: использовать только как последний fallback, когда вопрос реально не раскладывается в конкретный класс.\n- simple_factual: простая справка без сложной аналитики и без причинно-следственной цепочки.\n- period_close_risk: специальный класс рисков предзакрытия/закрытия периода.\n\nПриоритеты route и intent:\n1) Если в вопросе одновременно есть документы/оплаты/проводки/закрывающие/договоры/цепочка подтверждений, это causal multi-entity сценарий.\n Обычно это `intent_class=cross_entity` и route не ниже `hybrid_store_plus_live`.\n2) Если вопрос про множество кейсов (\"по каким\", \"где\", \"разложи по\"), это НЕ `needs_exact_object_trace`, пока нет одного точного объекта.\n3) Если присутствуют риск-слова, но также есть document/payment/posting chain, приоритет у causal cross-entity semantics, а не у чистого risk bucket.\n4) Не используй `ambiguous_human_query` как ленивый fallback, если можно уверенно выбрать конкретный intent.\n\nRoute_hint:\n- live_mcp_drilldown: только для точечного object trace (номер/строка/ref) и needs_runtime_truth=true.\n- hybrid_store_plus_live: для cross_entity + causal explain и подтверждаемой цепочки.\n- batch_refresh_then_store: для широких периодных рейтингов/обзоров и тяжелой агрегатной аналитики.\n- store_feature_risk: для risk/control/anomaly без обязательного runtime drilldown.\n- store_canonical: для простых фактов.\n\nRequires:\n- needs_cross_entity_join=true: если надо связывать разные сущности (документы, оплаты, проводки, договоры, регистры).\n- needs_causal_chain=true: если есть \"почему\", \"чем подтверждается\", \"где ошибка в цепочке\", \"разложи цепочку\".\n- needs_exact_object_trace=true: только при точном объекте.\n- needs_period_cut=true: если нужен срез периода.\n- needs_evidence=true: если пользователь просит подтверждение документами/проводками/движениями.\n\nv1.1.1 patch block A (period_close_risk):\nЕсли вопрос явно относится к предзакрытию, закрытию периода, сдаче отчетности, концу месяца или рискам последнего дня, primary intent_class должен быть `period_close_risk`, а не `heavy_analytical`, даже если требуется обзор или приоритизация.\n\nv1.1.1 patch block B (exact drilldown):\nЕсли вопрос относится к одному конкретному документу, операции, номеру, ref или объекту и просит показать связанную проводку или источник, это exact object trace. В таком случае `needs_cross_entity_join` не поднимается, если не требуется анализ множества сущностей или нескольких кейсов.\n\nv1.1.1 patch block C (anomaly without heavy batch):\nЕсли вопрос просит показать зоны риска, подозрительные случаи или аномалии без рейтинга, без full overview и без company-wide aggregation, route_hint должен быть `store_feature_risk`, а не `batch_refresh_then_store`.\n\nConfidence policy (жестко):\nНе ставь `confidence.overall=high` и `confidence.route_hint=high`, если выполнено хотя бы одно условие:\n- есть ambiguity;\n- есть тонкое различие соседних классов (например cross_entity vs anomaly_probe/rule_based_account_control);\n- вопрос длинный и многослойный;\n- период задан неявно или неуверенно;\n- causal semantics восстановлена частично.",
"domainPrompt": "Контекст домена: бухгалтерия 1С/NDC.\n\nКлючевые счета:\n- 01, 02, 10, 41, 51, 60, 62, 68.02, 90, 97.\n\nТиповые сущности:\n- контрагент, договор, документ реализации, документ поступления, оплата, проводка, регистр, закрывающий документ.\n\nЛексика causal и сверки (сильные сигналы для cross_entity):\n- \"не бьется\", \"не сходится\", \"не видно\", \"не собралось\", \"повисло\", \"хвост\";\n- \"разложи по документам/оплатам/закрывающим\";\n- \"чем подтверждается\", \"где ошибка в цепочке\", \"что пошло криво\".\n\nЛексика точечного drilldown:\n- \"документ №...\", \"ref\", \"строка проводки\", \"покажи конкретную операцию\", \"точный source-of-record\".\n\nЛексика rule-based контроля:\n- \"проверь настройки\", \"ошибка срока/даты\", \"контроль 97/10/ОС\", \"нарушение правила учета\".\n\nЛексика обзорной аналитики:\n- \"рейтинг\", \"топ рисков\", \"в целом по компании\", \"перед закрытием периода\", \"приоритизация проверок\".\n\nВажное правило:\nЕсли в одном вопросе есть и риск-лексика, и цепочка document/payment/posting, не понижать задачу до чистого `store_feature_risk`.\nПриоритет у causal cross-entity семантики.",
"fewShotExamples": "Q: По каким поставщикам на конец июня не сходится 60 счет: разложи по документам, оплатам и закрывающим.\nExpected:\n{\n \"intent_class\": \"cross_entity\",\n \"requires\": {\n \"needs_cross_entity_join\": true,\n \"needs_causal_chain\": true,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"reconciliation_report\",\n \"route_hint\": \"hybrid_store_plus_live\"\n}\n\nQ: По 10 счету где подозрительные остатки и почему они повисли по цепочке документов?\nExpected:\n{\n \"intent_class\": \"cross_entity\",\n \"requires\": {\n \"needs_cross_entity_join\": true,\n \"needs_causal_chain\": true,\n \"needs_anomaly_summary\": true\n },\n \"expected_output_shape\": \"reconciliation_report\",\n \"route_hint\": \"hybrid_store_plus_live\"\n}\n\nQ: По 97 счету проверь ошибки дат начала/окончания списания, без разложения по документам.\nExpected:\n{\n \"intent_class\": \"rule_based_account_control\",\n \"requires\": {\n \"needs_cross_entity_join\": false,\n \"needs_causal_chain\": false\n },\n \"expected_output_shape\": \"prioritized_review_list\",\n \"route_hint\": \"store_feature_risk\"\n}\n\nQ: Покажи документ TRX-88 и связанную проводку по 51, нужен точный объект.\nExpected:\n{\n \"intent_class\": \"drilldown_explain\",\n \"requires\": {\n \"needs_exact_object_trace\": true,\n \"needs_runtime_truth\": true,\n \"needs_cross_entity_join\": false\n },\n \"expected_output_shape\": \"evidence_chain\",\n \"route_hint\": \"live_mcp_drilldown\"\n}\n\nQ: Где у нас по июню не собралось и что пошло криво в взаиморасчетах с покупателями?\nExpected:\n{\n \"intent_class\": \"cross_entity\",\n \"requires\": {\n \"needs_cross_entity_join\": true,\n \"needs_causal_chain\": true,\n \"needs_period_cut\": true\n },\n \"expected_output_shape\": \"reconciliation_report\",\n \"route_hint\": \"hybrid_store_plus_live\"\n}\n\nQ: Сделай топ рисков перед закрытием периода по компании в целом.\nExpected:\n{\n \"intent_class\": \"heavy_analytical\",\n \"requires\": {\n \"needs_ranking\": true,\n \"needs_period_cut\": true,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"ranked_list\",\n \"route_hint\": \"batch_refresh_then_store\"\n}\n\nQ: Где у нас пахнет ручной ошибкой по июню, без конкретного документа.\nExpected:\n{\n \"intent_class\": \"ambiguous_human_query\",\n \"requires\": {\n \"needs_cross_entity_join\": false,\n \"needs_causal_chain\": false,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"anomaly_summary\",\n \"route_hint\": \"batch_refresh_then_store\"\n}\n\n# v1.1.1 targeted few-shot additions (exactly 3)\n\nQ: Перед закрытием периода что у нас может взорваться в последний день?\nExpected:\n{\n \"intent_class\": \"period_close_risk\",\n \"requires\": {\n \"needs_period_cut\": true,\n \"needs_ranking\": true,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"prioritized_review_list\",\n \"route_hint\": \"batch_refresh_then_store\"\n}\n\nQ: Покажи документ №TRX-88 и связанную проводку по 51.\nExpected:\n{\n \"intent_class\": \"drilldown_explain\",\n \"requires\": {\n \"needs_exact_object_trace\": true,\n \"needs_runtime_truth\": true,\n \"needs_cross_entity_join\": false\n },\n \"expected_output_shape\": \"evidence_chain\",\n \"route_hint\": \"live_mcp_drilldown\"\n}\n\nQ: Где по июню выглядит подозрительно, просто дай зоны риска без детального разбора.\nExpected:\n{\n \"intent_class\": \"anomaly_probe\",\n \"requires\": {\n \"needs_anomaly_summary\": true,\n \"needs_period_cut\": true,\n \"needs_ranking\": false\n },\n \"expected_output_shape\": \"anomaly_summary\",\n \"route_hint\": \"store_feature_risk\"\n}",
"userQuestion": "Сделай рейтинг самых рисковых хвостов перед закрытием периода за июнь.",
"context": {
"expected_route": "batch_refresh_then_store",
"eval_label": "eval-WWb7wzqwE2",
"case_id": "NQ-002",
"eval_mode": "single-pass-strict"
},
"retryPolicy": "single-pass-strict",
"useMock": false
},
"raw_model_response": {
"id": "resp_0273498cbe4a20e50069c15c396e3c819fad3d72fc2d981e48",
"object": "response",
"created_at": 1774279737,
"status": "completed",
"background": false,
"billing": {
"payer": "developer"
},
"completed_at": 1774279741,
"error": null,
"frequency_penalty": 0,
"incomplete_details": null,
"instructions": null,
"max_output_tokens": 900,
"max_tool_calls": null,
"model": "gpt-4o-mini-2024-07-18",
"output": [
{
"id": "msg_0273498cbe4a20e50069c15c39e7b8819f9dbf88364e40b2a4",
"type": "message",
"status": "completed",
"content": [
{
"type": "output_text",
"annotations": [],
"logprobs": [],
"text": "{\n \"schema_version\": \"normalized_query_v1\",\n \"user_question_raw\": \"Сделай рейтинг самых рисковых хвостов перед закрытием периода за июнь.\",\n \"normalized_question\": \"Сделай рейтинг самых рисковых хвостов перед закрытием периода за июнь.\",\n \"intent_class\": \"period_close_risk\",\n \"business_problem_type\": \"рейтинг рисков\",\n \"domain_entities\": [],\n \"accounts_mentioned\": [],\n \"documents_mentioned\": [],\n \"registers_mentioned\": [],\n \"period_scope\": {\n \"type\": \"explicit\",\n \"value\": \"июнь\",\n \"confidence\": \"high\"\n },\n \"requires\": {\n \"needs_cross_entity_join\": false,\n \"needs_causal_chain\": false,\n \"needs_exact_object_trace\": false,\n \"needs_ranking\": true,\n \"needs_anomaly_summary\": false,\n \"needs_runtime_truth\": false,\n \"needs_period_cut\": true,\n \"needs_evidence\": false\n },\n \"expected_output_shape\": \"ranked_list\",\n \"route_hint\": \"batch_refresh_then_store\",\n \"ambiguities\": [],\n \"confidence\": {\n \"overall\": \"high\",\n \"intent_class\": \"high\",\n \"route_hint\": \"high\"\n }\n}"
}
],
"role": "assistant"
}
],
"parallel_tool_calls": true,
"presence_penalty": 0,
"previous_response_id": null,
"prompt_cache_key": null,
"prompt_cache_retention": null,
"reasoning": {
"effort": null,
"summary": null
},
"safety_identifier": null,
"service_tier": "default",
"store": true,
"temperature": 0,
"text": {
"format": {
"type": "json_schema",
"description": null,
"name": "normalized_query_v1",
"schema": {
"$id": "normalized_query_v1",
"title": "Normalized Query V1",
"type": "object",
"additionalProperties": false,
"required": [
"schema_version",
"user_question_raw",
"normalized_question",
"intent_class",
"business_problem_type",
"domain_entities",
"accounts_mentioned",
"documents_mentioned",
"registers_mentioned",
"period_scope",
"requires",
"expected_output_shape",
"route_hint",
"ambiguities",
"confidence"
],
"properties": {
"schema_version": {
"type": "string",
"const": "normalized_query_v1"
},
"user_question_raw": {
"type": "string",
"minLength": 1
},
"normalized_question": {
"type": "string",
"minLength": 1
},
"intent_class": {
"type": "string",
"enum": [
"heavy_analytical",
"cross_entity",
"drilldown_explain",
"rule_based_account_control",
"anomaly_probe",
"period_close_risk",
"ambiguous_human_query",
"simple_factual"
]
},
"business_problem_type": {
"type": "string",
"minLength": 1
},
"domain_entities": {
"type": "array",
"items": {
"type": "string"
}
},
"accounts_mentioned": {
"type": "array",
"items": {
"type": "string"
}
},
"documents_mentioned": {
"type": "array",
"items": {
"type": "string"
}
},
"registers_mentioned": {
"type": "array",
"items": {
"type": "string"
}
},
"period_scope": {
"type": "object",
"additionalProperties": false,
"required": [
"type",
"value",
"confidence"
],
"properties": {
"type": {
"type": "string",
"enum": [
"explicit",
"inferred",
"missing"
]
},
"value": {
"type": [
"string",
"null"
]
},
"confidence": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
}
}
},
"requires": {
"type": "object",
"additionalProperties": false,
"required": [
"needs_cross_entity_join",
"needs_causal_chain",
"needs_exact_object_trace",
"needs_ranking",
"needs_anomaly_summary",
"needs_runtime_truth",
"needs_period_cut",
"needs_evidence"
],
"properties": {
"needs_cross_entity_join": {
"type": "boolean"
},
"needs_causal_chain": {
"type": "boolean"
},
"needs_exact_object_trace": {
"type": "boolean"
},
"needs_ranking": {
"type": "boolean"
},
"needs_anomaly_summary": {
"type": "boolean"
},
"needs_runtime_truth": {
"type": "boolean"
},
"needs_period_cut": {
"type": "boolean"
},
"needs_evidence": {
"type": "boolean"
}
}
},
"expected_output_shape": {
"type": "string",
"enum": [
"ranked_list",
"evidence_chain",
"anomaly_summary",
"point_answer",
"reconciliation_report",
"prioritized_review_list"
]
},
"route_hint": {
"type": "string",
"enum": [
"store_canonical",
"store_feature_risk",
"hybrid_store_plus_live",
"live_mcp_drilldown",
"batch_refresh_then_store"
]
},
"ambiguities": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"field",
"reason",
"severity"
],
"properties": {
"field": {
"type": "string"
},
"reason": {
"type": "string"
},
"severity": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
}
}
}
},
"confidence": {
"type": "object",
"additionalProperties": false,
"required": [
"overall",
"intent_class",
"route_hint"
],
"properties": {
"overall": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
},
"intent_class": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
},
"route_hint": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
}
}
}
}
},
"strict": true
},
"verbosity": "medium"
},
"tool_choice": "auto",
"tools": [],
"top_logprobs": 0,
"top_p": 1,
"truncation": "disabled",
"usage": {
"input_tokens": 2961,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 277,
"output_tokens_details": {
"reasoning_tokens": 0
},
"total_tokens": 3238
},
"user": null,
"metadata": {}
},
"parsed_normalized_json": {
"schema_version": "normalized_query_v1",
"user_question_raw": "Сделай рейтинг самых рисковых хвостов перед закрытием периода за июнь.",
"normalized_question": "Сделай рейтинг самых рисковых хвостов перед закрытием периода за июнь.",
"intent_class": "period_close_risk",
"business_problem_type": "рейтинг рисков",
"domain_entities": [],
"accounts_mentioned": [],
"documents_mentioned": [],
"registers_mentioned": [],
"period_scope": {
"type": "explicit",
"value": "июнь",
"confidence": "high"
},
"requires": {
"needs_cross_entity_join": false,
"needs_causal_chain": false,
"needs_exact_object_trace": false,
"needs_ranking": true,
"needs_anomaly_summary": false,
"needs_runtime_truth": false,
"needs_period_cut": true,
"needs_evidence": false
},
"expected_output_shape": "ranked_list",
"route_hint": "batch_refresh_then_store",
"ambiguities": [],
"confidence": {
"overall": "high",
"intent_class": "high",
"route_hint": "high"
}
},
"validation_result": {
"passed": true,
"errors": []
},
"route_hint": "batch_refresh_then_store",
"confidence": "high",
"usage": {
"input_tokens": 2961,
"output_tokens": 277,
"total_tokens": 3238
},
"latency_ms": 5494,
"expected_route": "batch_refresh_then_store",
"eval_label": "eval-WWb7wzqwE2",
"eval_mode": "single-pass-strict",
"request_count_for_case": 1
}