395 lines
23 KiB
JSON
395 lines
23 KiB
JSON
{
|
||
"trace_id": "EOC53b0jxaUlLD",
|
||
"timestamp": "2026-03-23T14:54:36.588Z",
|
||
"model": "gpt-4o-mini",
|
||
"prompt_version": "normalizer_v1_1",
|
||
"schema_version": "v1",
|
||
"case_id": "V11-HA-003",
|
||
"user_question_raw": "Собери топ-10 риск-зон учета по июню и приоритизируй, куда лезть сначала.",
|
||
"context": {
|
||
"period_hint": null,
|
||
"business_context": null,
|
||
"expected_route": "batch_refresh_then_store",
|
||
"case_id": "V11-HA-003",
|
||
"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",
|
||
"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, усиленная):\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\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}",
|
||
"userQuestion": "Собери топ-10 риск-зон учета по июню и приоритизируй, куда лезть сначала.",
|
||
"context": {
|
||
"expected_route": "batch_refresh_then_store",
|
||
"eval_label": "eval-xQU7mHgdgo",
|
||
"case_id": "V11-HA-003",
|
||
"eval_mode": "single-pass-strict"
|
||
},
|
||
"retryPolicy": "single-pass-strict",
|
||
"useMock": false
|
||
},
|
||
"raw_model_response": {
|
||
"id": "resp_05049cd9e5231ae60069c15426f16881a289408f0c0f1dd8e8",
|
||
"object": "response",
|
||
"created_at": 1774277670,
|
||
"status": "completed",
|
||
"background": false,
|
||
"billing": {
|
||
"payer": "developer"
|
||
},
|
||
"completed_at": 1774277676,
|
||
"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_05049cd9e5231ae60069c1542792e481a2b7949f84c04bb375",
|
||
"type": "message",
|
||
"status": "completed",
|
||
"content": [
|
||
{
|
||
"type": "output_text",
|
||
"annotations": [],
|
||
"logprobs": [],
|
||
"text": "{\n \"schema_version\": \"normalized_query_v1\",\n \"user_question_raw\": \"Собери топ-10 риск-зон учета по июню и приоритизируй, куда лезть сначала.\",\n \"normalized_question\": \"Собрать топ-10 риск-зон учета за июнь и приоритизировать проверки.\",\n \"intent_class\": \"heavy_analytical\",\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": 2465,
|
||
"input_tokens_details": {
|
||
"cached_tokens": 0
|
||
},
|
||
"output_tokens": 291,
|
||
"output_tokens_details": {
|
||
"reasoning_tokens": 0
|
||
},
|
||
"total_tokens": 2756
|
||
},
|
||
"user": null,
|
||
"metadata": {}
|
||
},
|
||
"parsed_normalized_json": {
|
||
"schema_version": "normalized_query_v1",
|
||
"user_question_raw": "Собери топ-10 риск-зон учета по июню и приоритизируй, куда лезть сначала.",
|
||
"normalized_question": "Собрать топ-10 риск-зон учета за июнь и приоритизировать проверки.",
|
||
"intent_class": "heavy_analytical",
|
||
"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": 2465,
|
||
"output_tokens": 291,
|
||
"total_tokens": 2756
|
||
},
|
||
"latency_ms": 6425,
|
||
"expected_route": "batch_refresh_then_store",
|
||
"eval_label": "eval-xQU7mHgdgo",
|
||
"eval_mode": "single-pass-strict",
|
||
"request_count_for_case": 1
|
||
} |