АДРЕСНЫЙ РЕЖИМ -ADDRESS: убран ложный factual fallback в open_items при неподтвержденном якоре + добавлен регресс-тест
This commit is contained in:
parent
4dff069ae3
commit
cc7fcabf05
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Global Execution Checklist V1
|
||||||
|
|
||||||
|
Дата старта: 2026-04-02
|
||||||
|
Цель: последовательное закрытие V1 без архитектурного дрейфа и без company-specific хардкода.
|
||||||
|
|
||||||
|
## Правило выполнения
|
||||||
|
|
||||||
|
- Идем по пунктам сверху вниз.
|
||||||
|
- Каждый пункт закрываем только после live-прогона и фиксации артефакта в `docs/ADDRESS/runs/...`.
|
||||||
|
- Критерий качества: `strict_policy=route`, `false_factual_rate=0`, объяснимый debug trace.
|
||||||
|
|
||||||
|
## Текущий статус (срез)
|
||||||
|
|
||||||
|
- [x] `OPEN_ITEMS` стабилизация (as_of, recovery, fallback) + фокус-прогон `7/7`.
|
||||||
|
Артефакт: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_11-54-08/run_summary.json`
|
||||||
|
- [x] Полный live regression по `address_slang_stress_full_2026-04-02.json` (102 кейса) выполнен.
|
||||||
|
Артефакт: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31/run_summary.json`
|
||||||
|
Результат: `route_pass=79/102 (77.45%)`, `factual=74`, `partial=28`.
|
||||||
|
- [ ] Единый acceptance baseline для релизного gate.
|
||||||
|
- [ ] Дожать follow-up цепочки (контекстные короткие реплики).
|
||||||
|
- [ ] Domain expansion без деградации текущих intents.
|
||||||
|
- [ ] CI/nightly automation для обязательного прогона regression-пака.
|
||||||
|
|
||||||
|
## Очередь задач
|
||||||
|
|
||||||
|
1. Full regression baseline (102 кейса)
|
||||||
|
- Прогон полного вопросника в live.
|
||||||
|
- Сохранение `run_summary.json`, `full_live_results.json`, `failures_only.json`.
|
||||||
|
- Фиксация pass-rate и топ-ошибок.
|
||||||
|
- Статус: выполнено, нужна итерация hardening до целевого gate.
|
||||||
|
|
||||||
|
2. Follow-up hardening
|
||||||
|
- Проверка цепей вида: «а теперь ...», «на ту же дату», «по тому же договору».
|
||||||
|
- Закрытие системных кейсов в tests + live-pack.
|
||||||
|
|
||||||
|
3. Resolver hardening (metadata-first)
|
||||||
|
- Усилить резолв якорей через live-данные, без словарей под конкретную базу.
|
||||||
|
- Снизить `materialized_but_not_anchor_matched` без ложных factual.
|
||||||
|
|
||||||
|
4. Domain expansion
|
||||||
|
- Расширить покрытие intents по матрице readiness.
|
||||||
|
- Для каждого нового intent: recipe + tests + live acceptance.
|
||||||
|
|
||||||
|
5. Release gate automation
|
||||||
|
- Закрепить обязательный регресс-порог перед релизом.
|
||||||
|
- Добавить nightly запуск полного пака и сводный отчет.
|
||||||
|
|
||||||
|
## Ближайший шаг
|
||||||
|
|
||||||
|
`Step-2`: закрыть кластеры из `failures_only.json` (top: `empty_match` в by-counterparty/by-contract) и поднять `route_pass` до релизного порога.
|
||||||
|
|
||||||
|
## Latest Update (2026-04-02)
|
||||||
|
|
||||||
|
- Full live stress rerun: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`
|
||||||
|
- Result: `route_pass=102/102 (100%)`, `strict_pass(route)=102/102`, `semantic_pass=102/102`
|
||||||
|
- Hardening applied:
|
||||||
|
- safer document-intent recipe filter fallback (avoid zeroing matched rows when registrator labels are noisy)
|
||||||
|
- contract anchor cleanup for tails like `year 2020` / trailing separated year
|
||||||
|
- Acceptance baseline for current 102-case pack: reached.
|
||||||
|
|
||||||
|
## Next Step
|
||||||
|
|
||||||
|
`Step-3`: follow-up context chains and domain expansion under the same release gate (`strict_policy=route`, no blocked routes).
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
[
|
||||||
|
"Покажи открытые позиции по договору 15/24",
|
||||||
|
"Есть ли незакрытые позиции по договору 15/24 на 2020-12",
|
||||||
|
"Есть ли незакрытые позиции по договору 15/24 на 2020-11",
|
||||||
|
"Есть ли незакрытые позиции по договору 15/24 на 2022-12",
|
||||||
|
"Есть ли незакрытые позиции по договору 15/24 на 2014-12-31"
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,140 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "S001",
|
||||||
|
"text": "свк доки за 2020 покаж пж",
|
||||||
|
"expected_intent": "list_documents_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S004",
|
||||||
|
"text": "какие у свк есть доки за 2020?",
|
||||||
|
"expected_intent": "list_documents_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S009",
|
||||||
|
"text": "docs by counterparty svk year 2020",
|
||||||
|
"expected_intent": "list_documents_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S011",
|
||||||
|
"text": "плс доки по свк 2020",
|
||||||
|
"expected_intent": "list_documents_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S018",
|
||||||
|
"text": "че у свк по банку за 2020",
|
||||||
|
"expected_intent": "bank_operations_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S019",
|
||||||
|
"text": "свк списания/поступления за 2020",
|
||||||
|
"expected_intent": "bank_operations_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S036",
|
||||||
|
"text": "из чего состоит остаток по счету 60 на 2020.05",
|
||||||
|
"expected_intent": "documents_forming_balance",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S040",
|
||||||
|
"text": "бля, какие доки формируют остаток 60.01 на 2020-05-31",
|
||||||
|
"expected_intent": "documents_forming_balance",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S043",
|
||||||
|
"text": "покажи документы по договору 15/24 за 2020",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S046",
|
||||||
|
"text": "docs by contract 15/24 year 2020",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S049",
|
||||||
|
"text": "плс документы договор №15/24",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "S054",
|
||||||
|
"text": "bank ops by contract 15/24",
|
||||||
|
"expected_intent": "bank_operations_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X001",
|
||||||
|
"text": "СЃРІРє РґРѕРєРё РєРёРЅСЊ Р·Р° 2020",
|
||||||
|
"expected_intent": "list_documents_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X006",
|
||||||
|
"text": "бля покаж свк документы 2020",
|
||||||
|
"expected_intent": "list_documents_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X007",
|
||||||
|
"text": "свк банк операции за 2020",
|
||||||
|
"expected_intent": "bank_operations_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X008",
|
||||||
|
"text": "по свк выписку банка за 2020 выведи",
|
||||||
|
"expected_intent": "bank_operations_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X009",
|
||||||
|
"text": "свк платежки за 2020",
|
||||||
|
"expected_intent": "bank_operations_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X012",
|
||||||
|
"text": "ёпт по свк че по банку 2020",
|
||||||
|
"expected_intent": "bank_operations_by_counterparty",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X028",
|
||||||
|
"text": "бля из чего состоит остаток по 60.01 на 2020-05-31",
|
||||||
|
"expected_intent": "documents_forming_balance",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X029",
|
||||||
|
"text": "РґРѕРєРё РїРѕ РґРѕРіРѕРІРѕСЂСѓ 15/24 Р·Р° 2020",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X033",
|
||||||
|
"text": "договор 15/24 выведи доки",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X038",
|
||||||
|
"text": "bank ops by contract 15/24",
|
||||||
|
"expected_intent": "bank_operations_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "X039",
|
||||||
|
"text": "покажи банк опер по дог 15/24 пж",
|
||||||
|
"expected_intent": "bank_operations_by_contract",
|
||||||
|
"expected_mode": "address_query"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Assistant conversation export
|
||||||
|
session_id: wave13-chat20-1775126062978
|
||||||
|
exported_at: 2026-04-02T10:34:32.613Z
|
||||||
|
|
||||||
|
## 1. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Покажи открытые позиции по договору 15/24
|
||||||
|
|
||||||
|
## 2. assistant
|
||||||
|
message_id: msg-BYRQm9nr66
|
||||||
|
created_at: 2026-04-02T10:34:24.625Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-_MiEWNRqbX
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 3. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2020-12
|
||||||
|
|
||||||
|
## 4. assistant
|
||||||
|
message_id: msg-Sy2FeXL7BJ
|
||||||
|
created_at: 2026-04-02T10:34:26.562Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-7TnGVSBbAN
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 5. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2020-11
|
||||||
|
|
||||||
|
## 6. assistant
|
||||||
|
message_id: msg-7wG-3gqDYn
|
||||||
|
created_at: 2026-04-02T10:34:28.529Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-TuD-HTz5gZ
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 7. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2022-12
|
||||||
|
|
||||||
|
## 8. assistant
|
||||||
|
message_id: msg-kDLkjnm1OX
|
||||||
|
created_at: 2026-04-02T10:34:30.550Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-gC5K4IEX-M
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 9. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2014-12-31
|
||||||
|
|
||||||
|
## 10. assistant
|
||||||
|
message_id: msg-KZ-gXsKJo2
|
||||||
|
created_at: 2026-04-02T10:34:32.610Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-uCS8z5ZCYE
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
@ -0,0 +1,589 @@
|
||||||
|
{
|
||||||
|
"session_id": "wave13-chat20-1775126062978",
|
||||||
|
"exported_at": "2026-04-02T10:34:32.613Z",
|
||||||
|
"cases_total": 5,
|
||||||
|
"rows": [
|
||||||
|
{
|
||||||
|
"case_id": "t01",
|
||||||
|
"user_message": "Покажи открытые позиции по договору 15/24",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"message_id": "msg-BYRQm9nr66",
|
||||||
|
"created_at": "2026-04-02T10:34:24.625Z",
|
||||||
|
"trace_id": "address-_MiEWNRqbX",
|
||||||
|
"http_status": 200,
|
||||||
|
"debug": {
|
||||||
|
"trace_id": "address-_MiEWNRqbX",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"object_signal_detected",
|
||||||
|
"open_items_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "OBJECT_LOOKUP",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "open_items_by_counterparty_or_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_open_items_by_party_or_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": true,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24",
|
||||||
|
"anchor_value_resolved": "15/24",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"raw_rows_received": 20,
|
||||||
|
"rows_after_account_scope": 20,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": null,
|
||||||
|
"llm_decomposition_trace_id": null,
|
||||||
|
"llm_decomposition_effective_message": "Покажи открытые позиции по договору 15/24",
|
||||||
|
"llm_decomposition_reason": "error:OpenAI API key is missing.",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "покажи открытые позиции по договору 15/24",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"case_id": "t02",
|
||||||
|
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-12",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"message_id": "msg-Sy2FeXL7BJ",
|
||||||
|
"created_at": "2026-04-02T10:34:26.562Z",
|
||||||
|
"trace_id": "address-7TnGVSBbAN",
|
||||||
|
"http_status": 200,
|
||||||
|
"debug": {
|
||||||
|
"trace_id": "address-7TnGVSBbAN",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"verify_signal_detected",
|
||||||
|
"open_items_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "VERIFY_FACTUAL",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "open_items_by_counterparty_or_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24",
|
||||||
|
"period_from": "2020-12-01",
|
||||||
|
"period_to": "2020-12-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_open_items_by_party_or_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": true,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24",
|
||||||
|
"anchor_value_resolved": "15/24",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"raw_rows_received": 20,
|
||||||
|
"rows_after_account_scope": 20,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": null,
|
||||||
|
"llm_decomposition_trace_id": null,
|
||||||
|
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-12",
|
||||||
|
"llm_decomposition_reason": "error:OpenAI API key is missing.",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2020-12",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"case_id": "t03",
|
||||||
|
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-11",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"message_id": "msg-7wG-3gqDYn",
|
||||||
|
"created_at": "2026-04-02T10:34:28.529Z",
|
||||||
|
"trace_id": "address-TuD-HTz5gZ",
|
||||||
|
"http_status": 200,
|
||||||
|
"debug": {
|
||||||
|
"trace_id": "address-TuD-HTz5gZ",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"verify_signal_detected",
|
||||||
|
"open_items_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "VERIFY_FACTUAL",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "open_items_by_counterparty_or_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24",
|
||||||
|
"period_from": "2020-11-01",
|
||||||
|
"period_to": "2020-11-30"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_open_items_by_party_or_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": true,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24",
|
||||||
|
"anchor_value_resolved": "15/24",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"raw_rows_received": 20,
|
||||||
|
"rows_after_account_scope": 20,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": null,
|
||||||
|
"llm_decomposition_trace_id": null,
|
||||||
|
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-11",
|
||||||
|
"llm_decomposition_reason": "error:OpenAI API key is missing.",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2020-11",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"case_id": "t04",
|
||||||
|
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2022-12",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"message_id": "msg-kDLkjnm1OX",
|
||||||
|
"created_at": "2026-04-02T10:34:30.550Z",
|
||||||
|
"trace_id": "address-gC5K4IEX-M",
|
||||||
|
"http_status": 200,
|
||||||
|
"debug": {
|
||||||
|
"trace_id": "address-gC5K4IEX-M",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"verify_signal_detected",
|
||||||
|
"open_items_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "VERIFY_FACTUAL",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "open_items_by_counterparty_or_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24",
|
||||||
|
"period_from": "2022-12-01",
|
||||||
|
"period_to": "2022-12-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_open_items_by_party_or_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": true,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24",
|
||||||
|
"anchor_value_resolved": "15/24",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 10,
|
||||||
|
"raw_rows_received": 10,
|
||||||
|
"rows_after_account_scope": 10,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 10,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": null,
|
||||||
|
"llm_decomposition_trace_id": null,
|
||||||
|
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2022-12",
|
||||||
|
"llm_decomposition_reason": "error:OpenAI API key is missing.",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2022-12",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"case_id": "t05",
|
||||||
|
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2014-12-31",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"message_id": "msg-KZ-gXsKJo2",
|
||||||
|
"created_at": "2026-04-02T10:34:32.610Z",
|
||||||
|
"trace_id": "address-uCS8z5ZCYE",
|
||||||
|
"http_status": 200,
|
||||||
|
"debug": {
|
||||||
|
"trace_id": "address-uCS8z5ZCYE",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"verify_signal_detected",
|
||||||
|
"open_items_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "VERIFY_FACTUAL",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "open_items_by_counterparty_or_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24",
|
||||||
|
"as_of_date": "2014-12-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_open_items_by_party_or_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": false,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24",
|
||||||
|
"anchor_value_resolved": "15/24",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"raw_rows_received": 20,
|
||||||
|
"rows_after_account_scope": 2,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 2,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": null,
|
||||||
|
"llm_decomposition_trace_id": null,
|
||||||
|
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2014-12-31",
|
||||||
|
"llm_decomposition_reason": "error:OpenAI API key is missing.",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2014-12-31",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
1. Покажи открытые позиции по договору 15/24
|
||||||
|
|
||||||
|
2. Есть ли незакрытые позиции по договору 15/24 на 2020-12
|
||||||
|
|
||||||
|
3. Есть ли незакрытые позиции по договору 15/24 на 2020-11
|
||||||
|
|
||||||
|
4. Есть ли незакрытые позиции по договору 15/24 на 2022-12
|
||||||
|
|
||||||
|
5. Есть ли незакрытые позиции по договору 15/24 на 2014-12-31
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Assistant conversation export
|
||||||
|
session_id: wave13-chat20-1775126062978
|
||||||
|
exported_at: 2026-04-02T10:34:32.613Z
|
||||||
|
|
||||||
|
## 1. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Покажи открытые позиции по договору 15/24
|
||||||
|
|
||||||
|
## 2. assistant
|
||||||
|
message_id: msg-BYRQm9nr66
|
||||||
|
created_at: 2026-04-02T10:34:24.625Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-_MiEWNRqbX
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 3. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2020-12
|
||||||
|
|
||||||
|
## 4. assistant
|
||||||
|
message_id: msg-Sy2FeXL7BJ
|
||||||
|
created_at: 2026-04-02T10:34:26.562Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-7TnGVSBbAN
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 5. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2020-11
|
||||||
|
|
||||||
|
## 6. assistant
|
||||||
|
message_id: msg-7wG-3gqDYn
|
||||||
|
created_at: 2026-04-02T10:34:28.529Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-TuD-HTz5gZ
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 7. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2022-12
|
||||||
|
|
||||||
|
## 8. assistant
|
||||||
|
message_id: msg-kDLkjnm1OX
|
||||||
|
created_at: 2026-04-02T10:34:30.550Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-gC5K4IEX-M
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
||||||
|
## 9. user
|
||||||
|
message_id: pending
|
||||||
|
created_at: pending
|
||||||
|
reply_type: n/a
|
||||||
|
|
||||||
|
Есть ли незакрытые позиции по договору 15/24 на 2014-12-31
|
||||||
|
|
||||||
|
## 10. assistant
|
||||||
|
message_id: msg-KZ-gXsKJo2
|
||||||
|
created_at: 2026-04-02T10:34:32.610Z
|
||||||
|
reply_type: partial_coverage
|
||||||
|
trace_id: address-uCS8z5ZCYE
|
||||||
|
|
||||||
|
В live-данных по текущему фильтру записи не найдены.
|
||||||
|
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
|
||||||
|
Что нужно уточнить: уточните период или снимите часть фильтров.
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-13-28
|
||||||
|
|
||||||
|
Generated at: 2026-04-02T12:23:31
|
||||||
|
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
|
||||||
|
Backend URL: http://127.0.0.1:8787/api/assistant/message
|
||||||
|
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
|
||||||
|
Strict policy: route
|
||||||
|
|
||||||
|
## Totals
|
||||||
|
- questions_total: 102
|
||||||
|
- ok_200_count: 102
|
||||||
|
- semantic_pass_count: 102
|
||||||
|
- semantic_pass_rate: 1.0
|
||||||
|
- route_pass_count: 70
|
||||||
|
- route_pass_rate: 0.6863
|
||||||
|
- strict_pass_count: 70
|
||||||
|
- strict_pass_rate: 0.6863
|
||||||
|
- factual_count: 67
|
||||||
|
- partial_coverage_count: 35
|
||||||
|
- clarification_required_count: 0
|
||||||
|
- http_error_count: 0
|
||||||
|
- llm_decomposition_applied_count: 77
|
||||||
|
- avg_elapsed_ms: 5911.1
|
||||||
|
|
||||||
|
## Files
|
||||||
|
- run_summary.json
|
||||||
|
- full_live_results.json
|
||||||
|
- failures_only.json
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,106 @@
|
||||||
|
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-13-28
|
||||||
|
|
||||||
|
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| S001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки за 2020 покаж пж | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S004 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | какие у свк есть доки за 2020? | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S009 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | docs by counterparty svk year 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S011 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | плс доки по свк 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S018 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | че у свк по банку за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S019 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | свк списания/поступления за 2020 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S036 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | из чего состоит остаток по счету 60 на 2020.05 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| S037 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | раскрой остаток 60.01 по документам на конец июля 2020 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| S038 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | доки под остатком 60.01 на 2020-07-31 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S040 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S043 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | покажи документы по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S044 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | доки по дог. 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S046 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 year 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S049 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | плс документы договор №15/24 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S053 | False | blocked_execution_error | partial_coverage | bank_operations_by_contract | execution_error | выписка по договору 15/24 | Не удалось выполнить адресный live-запрос в V1. |
|
||||||
|
| S054 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки кинь за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X006 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | бля покаж свк документы 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X007 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк банк операции за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X008 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | по свк выписку банка за 2020 выведи | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X009 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк платежки за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X012 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | ёпт по свк че по банку 2020 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X019 | False | blocked_missing_anchor | partial_coverage | account_balance_snapshot | missing_anchor | скока по 60.02 на конец 2020-12 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X021 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | раскрой остаток 60.01 по документам на конец июля 2020 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| X022 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | доки под остатком 60.01 на 2020-07-31 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X026 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | раскидай остаток 62.01 по докам на 2020-12-31 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X028 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | бля из чего состоит остаток по 60.01 на 2020-05-31 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| X029 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | доки по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X031 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X033 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | договор 15/24 выведи доки | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X038 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X039 | False | blocked_execution_error | partial_coverage | bank_operations_by_contract | execution_error | покажи банк опер по дог 15/24 пж | Не удалось выполнить адресный live-запрос в V1. |
|
||||||
|
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
{
|
||||||
|
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-13-28",
|
||||||
|
"generated_at": "2026-04-02T12:23:31",
|
||||||
|
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
|
||||||
|
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
|
||||||
|
"llm_provider": "local",
|
||||||
|
"llm_model": "qwen2.5-14b-instruct-1m",
|
||||||
|
"llm_base_url": "http://127.0.0.1:1234",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"totals": {
|
||||||
|
"questions_total": 102,
|
||||||
|
"ok_200_count": 102,
|
||||||
|
"semantic_pass_count": 102,
|
||||||
|
"semantic_pass_rate": 1.0,
|
||||||
|
"route_pass_count": 70,
|
||||||
|
"route_pass_rate": 0.6863,
|
||||||
|
"strict_pass_count": 70,
|
||||||
|
"strict_pass_rate": 0.6863,
|
||||||
|
"factual_count": 67,
|
||||||
|
"partial_coverage_count": 35,
|
||||||
|
"clarification_required_count": 0,
|
||||||
|
"http_error_count": 0,
|
||||||
|
"llm_decomposition_applied_count": 77,
|
||||||
|
"avg_elapsed_ms": 5911.1
|
||||||
|
},
|
||||||
|
"distributions": {
|
||||||
|
"reply_type": {
|
||||||
|
"partial_coverage": 35,
|
||||||
|
"factual": 67
|
||||||
|
},
|
||||||
|
"actual_intent": {
|
||||||
|
"list_documents_by_counterparty": 18,
|
||||||
|
"bank_operations_by_counterparty": 16,
|
||||||
|
"account_balance_snapshot": 26,
|
||||||
|
"documents_forming_balance": 16,
|
||||||
|
"list_documents_by_contract": 14,
|
||||||
|
"bank_operations_by_contract": 12
|
||||||
|
},
|
||||||
|
"actual_mode": {
|
||||||
|
"address_query": 102
|
||||||
|
},
|
||||||
|
"mcp_call_status": {
|
||||||
|
"materialized_but_not_anchor_matched": 20,
|
||||||
|
"matched_non_empty": 67,
|
||||||
|
"skipped": 8,
|
||||||
|
"no_raw_rows": 3,
|
||||||
|
"materialized_but_filtered_out_by_recipe": 2,
|
||||||
|
"error": 2
|
||||||
|
},
|
||||||
|
"limited_reason_category": {
|
||||||
|
"empty_match": 22,
|
||||||
|
"missing_anchor": 9,
|
||||||
|
"recipe_visibility_gap": 2,
|
||||||
|
"execution_error": 2
|
||||||
|
},
|
||||||
|
"route_health": {
|
||||||
|
"likely_blocked_route": 19,
|
||||||
|
"ok_or_factual": 67,
|
||||||
|
"blocked_missing_anchor": 9,
|
||||||
|
"partial_non_blocking": 3,
|
||||||
|
"blocked_recipe_visibility_gap": 2,
|
||||||
|
"blocked_execution_error": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31
|
||||||
|
|
||||||
|
Generated at: 2026-04-02T12:38:40
|
||||||
|
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
|
||||||
|
Backend URL: http://127.0.0.1:8787/api/assistant/message
|
||||||
|
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
|
||||||
|
Strict policy: route
|
||||||
|
|
||||||
|
## Totals
|
||||||
|
- questions_total: 102
|
||||||
|
- ok_200_count: 102
|
||||||
|
- semantic_pass_count: 102
|
||||||
|
- semantic_pass_rate: 1.0
|
||||||
|
- route_pass_count: 79
|
||||||
|
- route_pass_rate: 0.7745
|
||||||
|
- strict_pass_count: 79
|
||||||
|
- strict_pass_rate: 0.7745
|
||||||
|
- factual_count: 74
|
||||||
|
- partial_coverage_count: 28
|
||||||
|
- clarification_required_count: 0
|
||||||
|
- http_error_count: 0
|
||||||
|
- llm_decomposition_applied_count: 77
|
||||||
|
- avg_elapsed_ms: 5968.4
|
||||||
|
|
||||||
|
## Files
|
||||||
|
- run_summary.json
|
||||||
|
- full_live_results.json
|
||||||
|
- failures_only.json
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,106 @@
|
||||||
|
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31
|
||||||
|
|
||||||
|
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| S001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки за 2020 покаж пж | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S004 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | какие у свк есть доки за 2020? | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S009 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | docs by counterparty svk year 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S011 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | плс доки по свк 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S018 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | че у свк по банку за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S019 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк списания/поступления за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S036 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | из чего состоит остаток по счету 60 на 2020.05 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| S037 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S038 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S040 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S043 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | покажи документы по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S044 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по дог. 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S046 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 year 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S049 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | плс документы договор №15/24 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S053 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S054 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки кинь за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X006 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | бля покаж свк документы 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X007 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк банк операции за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X008 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | по свк выписку банка за 2020 выведи | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X009 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк платежки за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X012 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | ёпт по свк че по банку 2020 | Для точного адресного поиска не хватает обязательного якоря. |
|
||||||
|
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X019 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | скока по 60.02 на конец 2020-12 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X021 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X022 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X026 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | раскидай остаток 62.01 по докам на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X028 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля из чего состоит остаток по 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| X029 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | доки по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X031 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 15/24 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X033 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | договор 15/24 выведи доки | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X038 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X039 | False | blocked_execution_error | partial_coverage | bank_operations_by_contract | execution_error | покажи банк опер по дог 15/24 пж | Не удалось выполнить адресный live-запрос в V1. |
|
||||||
|
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
{
|
||||||
|
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31",
|
||||||
|
"generated_at": "2026-04-02T12:38:40",
|
||||||
|
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
|
||||||
|
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
|
||||||
|
"llm_provider": "local",
|
||||||
|
"llm_model": "qwen2.5-14b-instruct-1m",
|
||||||
|
"llm_base_url": "http://127.0.0.1:1234",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"totals": {
|
||||||
|
"questions_total": 102,
|
||||||
|
"ok_200_count": 102,
|
||||||
|
"semantic_pass_count": 102,
|
||||||
|
"semantic_pass_rate": 1.0,
|
||||||
|
"route_pass_count": 79,
|
||||||
|
"route_pass_rate": 0.7745,
|
||||||
|
"strict_pass_count": 79,
|
||||||
|
"strict_pass_rate": 0.7745,
|
||||||
|
"factual_count": 74,
|
||||||
|
"partial_coverage_count": 28,
|
||||||
|
"clarification_required_count": 0,
|
||||||
|
"http_error_count": 0,
|
||||||
|
"llm_decomposition_applied_count": 77,
|
||||||
|
"avg_elapsed_ms": 5968.4
|
||||||
|
},
|
||||||
|
"distributions": {
|
||||||
|
"reply_type": {
|
||||||
|
"partial_coverage": 28,
|
||||||
|
"factual": 74
|
||||||
|
},
|
||||||
|
"actual_intent": {
|
||||||
|
"list_documents_by_counterparty": 18,
|
||||||
|
"bank_operations_by_counterparty": 16,
|
||||||
|
"account_balance_snapshot": 26,
|
||||||
|
"documents_forming_balance": 16,
|
||||||
|
"list_documents_by_contract": 14,
|
||||||
|
"bank_operations_by_contract": 12
|
||||||
|
},
|
||||||
|
"actual_mode": {
|
||||||
|
"address_query": 102
|
||||||
|
},
|
||||||
|
"mcp_call_status": {
|
||||||
|
"materialized_but_not_anchor_matched": 19,
|
||||||
|
"matched_non_empty": 74,
|
||||||
|
"no_raw_rows": 5,
|
||||||
|
"materialized_but_filtered_out_by_recipe": 3,
|
||||||
|
"error": 1
|
||||||
|
},
|
||||||
|
"limited_reason_category": {
|
||||||
|
"empty_match": 23,
|
||||||
|
"recipe_visibility_gap": 3,
|
||||||
|
"missing_anchor": 1,
|
||||||
|
"execution_error": 1
|
||||||
|
},
|
||||||
|
"route_health": {
|
||||||
|
"likely_blocked_route": 18,
|
||||||
|
"ok_or_factual": 74,
|
||||||
|
"partial_non_blocking": 5,
|
||||||
|
"blocked_recipe_visibility_gap": 3,
|
||||||
|
"blocked_missing_anchor": 1,
|
||||||
|
"blocked_execution_error": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54
|
||||||
|
|
||||||
|
Generated at: 2026-04-02T12:50:55
|
||||||
|
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
|
||||||
|
Backend URL: http://127.0.0.1:8787/api/assistant/message
|
||||||
|
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
|
||||||
|
Strict policy: route
|
||||||
|
|
||||||
|
## Totals
|
||||||
|
- questions_total: 102
|
||||||
|
- ok_200_count: 102
|
||||||
|
- semantic_pass_count: 102
|
||||||
|
- semantic_pass_rate: 1.0
|
||||||
|
- route_pass_count: 96
|
||||||
|
- route_pass_rate: 0.9412
|
||||||
|
- strict_pass_count: 96
|
||||||
|
- strict_pass_rate: 0.9412
|
||||||
|
- factual_count: 91
|
||||||
|
- partial_coverage_count: 11
|
||||||
|
- clarification_required_count: 0
|
||||||
|
- http_error_count: 0
|
||||||
|
- llm_decomposition_applied_count: 77
|
||||||
|
- avg_elapsed_ms: 5892.0
|
||||||
|
|
||||||
|
## Files
|
||||||
|
- run_summary.json
|
||||||
|
- full_live_results.json
|
||||||
|
- failures_only.json
|
||||||
|
|
@ -0,0 +1,915 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"index": 36,
|
||||||
|
"id": "S036",
|
||||||
|
"question": "из чего состоит остаток по счету 60 на 2020.05",
|
||||||
|
"session": null,
|
||||||
|
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s036",
|
||||||
|
"status_code": 200,
|
||||||
|
"ok": true,
|
||||||
|
"elapsed_ms": 6079,
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"trace_id": "address-Osl2bR4Te_",
|
||||||
|
"assistant_reply": "Текущий live recipe не дает нужную видимость данных для этого сценария.\nПричина: строки по якорю найдены, но отфильтрованы intent-specific recipe.\nЧто нужно уточнить: сузьте период, уточните контрагента или документный тип.",
|
||||||
|
"assistant_reply_first_line": "Текущий live recipe не дает нужную видимость данных для этого сценария.",
|
||||||
|
"expected_intent": "documents_forming_balance",
|
||||||
|
"actual_intent": "documents_forming_balance",
|
||||||
|
"intent_match": true,
|
||||||
|
"expected_mode": "address_query",
|
||||||
|
"actual_mode": "address_query",
|
||||||
|
"mode_match": true,
|
||||||
|
"expected_reply_type": null,
|
||||||
|
"reply_match": true,
|
||||||
|
"semantic_pass": true,
|
||||||
|
"route_pass": false,
|
||||||
|
"route_health": "blocked_recipe_visibility_gap",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"strict_pass": false,
|
||||||
|
"selected_recipe": "address_documents_forming_balance_v1",
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
|
||||||
|
"rows_fetched": 6,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"limited_reason_category": "recipe_visibility_gap",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"debug_payload": {
|
||||||
|
"trace_id": "address-Osl2bR4Te_",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"drilldown_signal_detected",
|
||||||
|
"documents_forming_balance_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "DRILLDOWN_REQUEST",
|
||||||
|
"query_shape_confidence": "high",
|
||||||
|
"detected_intent": "documents_forming_balance",
|
||||||
|
"detected_intent_confidence": "high",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"account": "60",
|
||||||
|
"period_from": "2020-05-01",
|
||||||
|
"period_to": "2020-05-31",
|
||||||
|
"as_of_date": "2020-05-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_documents_forming_balance_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "strict",
|
||||||
|
"account_scope_fallback_applied": false,
|
||||||
|
"anchor_type": "account",
|
||||||
|
"anchor_value_raw": "60",
|
||||||
|
"anchor_value_resolved": "60",
|
||||||
|
"resolver_confidence": "high",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
|
||||||
|
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"rows_fetched": 6,
|
||||||
|
"raw_rows_received": 6,
|
||||||
|
"rows_after_account_scope": 6,
|
||||||
|
"rows_after_recipe_filter": 6,
|
||||||
|
"rows_materialized": 6,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": "60",
|
||||||
|
"account_token_normalized": "60",
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "rows_remaining_after_scope_filter",
|
||||||
|
"runtime_readiness": "REQUIRES_SPECIALIZED_RECIPE",
|
||||||
|
"limited_reason_category": "recipe_visibility_gap",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": "local",
|
||||||
|
"llm_decomposition_trace_id": "W7lp6O8KPbuB3o",
|
||||||
|
"llm_decomposition_effective_message": "из чего состоит остаток по счету 60 на 2020.05",
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "из чего состоит остаток по счету 60 на 2020.05",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": {
|
||||||
|
"trace_id": "W7lp6O8KPbuB3o",
|
||||||
|
"prompt_version": "normalizer_v2_0_2",
|
||||||
|
"applied": false,
|
||||||
|
"effective_message": "из чего состоит остаток по счету 60 на 2020.05"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error_code": null,
|
||||||
|
"error_message": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 40,
|
||||||
|
"id": "S040",
|
||||||
|
"question": "бля, какие доки формируют остаток 60.01 на 2020-05-31",
|
||||||
|
"session": null,
|
||||||
|
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s040",
|
||||||
|
"status_code": 200,
|
||||||
|
"ok": true,
|
||||||
|
"elapsed_ms": 6110,
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"trace_id": "address-O-GCQ6lVKK",
|
||||||
|
"assistant_reply": "Текущий live recipe не дает нужную видимость данных для этого сценария.\nПричина: строки по якорю найдены, но отфильтрованы intent-specific recipe.\nЧто нужно уточнить: сузьте период, уточните контрагента или документный тип.",
|
||||||
|
"assistant_reply_first_line": "Текущий live recipe не дает нужную видимость данных для этого сценария.",
|
||||||
|
"expected_intent": "documents_forming_balance",
|
||||||
|
"actual_intent": "documents_forming_balance",
|
||||||
|
"intent_match": true,
|
||||||
|
"expected_mode": "address_query",
|
||||||
|
"actual_mode": "address_query",
|
||||||
|
"mode_match": true,
|
||||||
|
"expected_reply_type": null,
|
||||||
|
"reply_match": true,
|
||||||
|
"semantic_pass": true,
|
||||||
|
"route_pass": false,
|
||||||
|
"route_health": "blocked_recipe_visibility_gap",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"strict_pass": false,
|
||||||
|
"selected_recipe": "address_documents_forming_balance_v1",
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
|
||||||
|
"rows_fetched": 5,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"limited_reason_category": "recipe_visibility_gap",
|
||||||
|
"llm_decomposition_applied": true,
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_applied",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"debug_payload": {
|
||||||
|
"trace_id": "address-O-GCQ6lVKK",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"drilldown_signal_detected",
|
||||||
|
"documents_forming_balance_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "DRILLDOWN_REQUEST",
|
||||||
|
"query_shape_confidence": "high",
|
||||||
|
"detected_intent": "documents_forming_balance",
|
||||||
|
"detected_intent_confidence": "high",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"account": "60.01",
|
||||||
|
"period_from": "2020-05-01",
|
||||||
|
"period_to": "2020-05-31",
|
||||||
|
"as_of_date": "2020-05-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_documents_forming_balance_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "strict",
|
||||||
|
"account_scope_fallback_applied": false,
|
||||||
|
"anchor_type": "account",
|
||||||
|
"anchor_value_raw": "60.01",
|
||||||
|
"anchor_value_resolved": "60.01",
|
||||||
|
"resolver_confidence": "high",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
|
||||||
|
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"rows_fetched": 5,
|
||||||
|
"raw_rows_received": 5,
|
||||||
|
"rows_after_account_scope": 5,
|
||||||
|
"rows_after_recipe_filter": 5,
|
||||||
|
"rows_materialized": 5,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": "60.01",
|
||||||
|
"account_token_normalized": "60.1",
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "rows_remaining_after_scope_filter",
|
||||||
|
"runtime_readiness": "REQUIRES_SPECIALIZED_RECIPE",
|
||||||
|
"limited_reason_category": "recipe_visibility_gap",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": true,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": "local",
|
||||||
|
"llm_decomposition_trace_id": "VRv49EU2MYVPNh",
|
||||||
|
"llm_decomposition_effective_message": "какие документы формируют остаток по счету 60.01 на 2020-05-31",
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_applied",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "какие доки формируют остаток 60.01 на 2020-05-31",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": {
|
||||||
|
"trace_id": "VRv49EU2MYVPNh",
|
||||||
|
"prompt_version": "normalizer_v2_0_2",
|
||||||
|
"applied": true,
|
||||||
|
"effective_message": "какие документы формируют остаток по счету 60.01 на 2020-05-31"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error_code": null,
|
||||||
|
"error_message": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 43,
|
||||||
|
"id": "S043",
|
||||||
|
"question": "покажи документы по договору 15/24 за 2020",
|
||||||
|
"session": null,
|
||||||
|
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s043",
|
||||||
|
"status_code": 200,
|
||||||
|
"ok": true,
|
||||||
|
"elapsed_ms": 8329,
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"trace_id": "address-xQI5GQkOLC",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"assistant_reply_first_line": "В live-данных по текущему фильтру записи не найдены.",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"actual_intent": "list_documents_by_contract",
|
||||||
|
"intent_match": true,
|
||||||
|
"expected_mode": "address_query",
|
||||||
|
"actual_mode": "address_query",
|
||||||
|
"mode_match": true,
|
||||||
|
"expected_reply_type": null,
|
||||||
|
"reply_match": true,
|
||||||
|
"semantic_pass": true,
|
||||||
|
"route_pass": false,
|
||||||
|
"route_health": "likely_blocked_route",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"strict_pass": false,
|
||||||
|
"selected_recipe": "address_documents_by_contract_v1",
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"llm_decomposition_applied": true,
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_applied",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"debug_payload": {
|
||||||
|
"trace_id": "address-xQI5GQkOLC",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"document_list_signal_detected",
|
||||||
|
"documents_by_contract_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "DOCUMENT_LIST",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "list_documents_by_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24",
|
||||||
|
"period_from": "2020-01-01",
|
||||||
|
"period_to": "2020-12-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_documents_by_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": true,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24",
|
||||||
|
"anchor_value_resolved": "15/24",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"raw_rows_received": 20,
|
||||||
|
"rows_after_account_scope": 20,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": true,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": "local",
|
||||||
|
"llm_decomposition_trace_id": "o9lF35fLk7mxPL",
|
||||||
|
"llm_decomposition_effective_message": "Показать документы по договору 15/24 за период 2020 года.",
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_applied",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "покажи документы по договору 15/24 за 2020",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": {
|
||||||
|
"trace_id": "o9lF35fLk7mxPL",
|
||||||
|
"prompt_version": "normalizer_v2_0_2",
|
||||||
|
"applied": true,
|
||||||
|
"effective_message": "Показать документы по договору 15/24 за период 2020 года."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error_code": null,
|
||||||
|
"error_message": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 46,
|
||||||
|
"id": "S046",
|
||||||
|
"question": "docs by contract 15/24 year 2020",
|
||||||
|
"session": null,
|
||||||
|
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s046",
|
||||||
|
"status_code": 200,
|
||||||
|
"ok": true,
|
||||||
|
"elapsed_ms": 8154,
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"trace_id": "address-mlhQGV9rWU",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"assistant_reply_first_line": "В live-данных по текущему фильтру записи не найдены.",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"actual_intent": "list_documents_by_contract",
|
||||||
|
"intent_match": true,
|
||||||
|
"expected_mode": "address_query",
|
||||||
|
"actual_mode": "address_query",
|
||||||
|
"mode_match": true,
|
||||||
|
"expected_reply_type": null,
|
||||||
|
"reply_match": true,
|
||||||
|
"semantic_pass": true,
|
||||||
|
"route_pass": false,
|
||||||
|
"route_health": "likely_blocked_route",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"strict_pass": false,
|
||||||
|
"selected_recipe": "address_documents_by_contract_v1",
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_same",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"debug_payload": {
|
||||||
|
"trace_id": "address-mlhQGV9rWU",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_entity_detected",
|
||||||
|
"object_signal_detected",
|
||||||
|
"documents_by_contract_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "medium",
|
||||||
|
"query_shape": "OBJECT_LOOKUP",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "list_documents_by_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24 year 2020",
|
||||||
|
"period_from": "2020-01-01",
|
||||||
|
"period_to": "2020-12-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_documents_by_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": true,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24 year 2020",
|
||||||
|
"anchor_value_resolved": "15/24 year 2020",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"raw_rows_received": 20,
|
||||||
|
"rows_after_account_scope": 20,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": "local",
|
||||||
|
"llm_decomposition_trace_id": "bdfZi1D7CmwQom",
|
||||||
|
"llm_decomposition_effective_message": "docs by contract 15/24 year 2020",
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_same",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "документы by contract 15/2024 год 2020",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": {
|
||||||
|
"trace_id": "bdfZi1D7CmwQom",
|
||||||
|
"prompt_version": "normalizer_v2_0_2",
|
||||||
|
"applied": false,
|
||||||
|
"effective_message": "docs by contract 15/24 year 2020"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error_code": null,
|
||||||
|
"error_message": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 88,
|
||||||
|
"id": "X028",
|
||||||
|
"question": "бля из чего состоит остаток по 60.01 на 2020-05-31",
|
||||||
|
"session": null,
|
||||||
|
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-x028",
|
||||||
|
"status_code": 200,
|
||||||
|
"ok": true,
|
||||||
|
"elapsed_ms": 7108,
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"trace_id": "address-qDWVyw0CNL",
|
||||||
|
"assistant_reply": "Текущий live recipe не дает нужную видимость данных для этого сценария.\nПричина: строки по якорю найдены, но отфильтрованы intent-specific recipe.\nЧто нужно уточнить: сузьте период, уточните контрагента или документный тип.",
|
||||||
|
"assistant_reply_first_line": "Текущий live recipe не дает нужную видимость данных для этого сценария.",
|
||||||
|
"expected_intent": "documents_forming_balance",
|
||||||
|
"actual_intent": "documents_forming_balance",
|
||||||
|
"intent_match": true,
|
||||||
|
"expected_mode": "address_query",
|
||||||
|
"actual_mode": "address_query",
|
||||||
|
"mode_match": true,
|
||||||
|
"expected_reply_type": null,
|
||||||
|
"reply_match": true,
|
||||||
|
"semantic_pass": true,
|
||||||
|
"route_pass": false,
|
||||||
|
"route_health": "blocked_recipe_visibility_gap",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"strict_pass": false,
|
||||||
|
"selected_recipe": "address_documents_forming_balance_v1",
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
|
||||||
|
"rows_fetched": 5,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"limited_reason_category": "recipe_visibility_gap",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"debug_payload": {
|
||||||
|
"trace_id": "address-qDWVyw0CNL",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_action_detected",
|
||||||
|
"address_entity_detected",
|
||||||
|
"drilldown_signal_detected",
|
||||||
|
"documents_forming_balance_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "high",
|
||||||
|
"query_shape": "DRILLDOWN_REQUEST",
|
||||||
|
"query_shape_confidence": "high",
|
||||||
|
"detected_intent": "documents_forming_balance",
|
||||||
|
"detected_intent_confidence": "high",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"account": "60.01",
|
||||||
|
"period_from": "2020-05-01",
|
||||||
|
"period_to": "2020-05-31",
|
||||||
|
"as_of_date": "2020-05-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_documents_forming_balance_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "strict",
|
||||||
|
"account_scope_fallback_applied": false,
|
||||||
|
"anchor_type": "account",
|
||||||
|
"anchor_value_raw": "60.01",
|
||||||
|
"anchor_value_resolved": "60.01",
|
||||||
|
"resolver_confidence": "high",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
|
||||||
|
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
|
||||||
|
"rows_fetched": 5,
|
||||||
|
"raw_rows_received": 5,
|
||||||
|
"rows_after_account_scope": 5,
|
||||||
|
"rows_after_recipe_filter": 5,
|
||||||
|
"rows_materialized": 5,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": "60.01",
|
||||||
|
"account_token_normalized": "60.1",
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "rows_remaining_after_scope_filter",
|
||||||
|
"runtime_readiness": "REQUIRES_SPECIALIZED_RECIPE",
|
||||||
|
"limited_reason_category": "recipe_visibility_gap",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": "local",
|
||||||
|
"llm_decomposition_trace_id": "GbMdJJbzBPUruk",
|
||||||
|
"llm_decomposition_effective_message": "бля из чего состоит остаток по 60.01 на 2020-05-31",
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "из чего состоит остаток по 60.01 на 2020-05-31",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": {
|
||||||
|
"trace_id": "GbMdJJbzBPUruk",
|
||||||
|
"prompt_version": "normalizer_v2_0_2",
|
||||||
|
"applied": false,
|
||||||
|
"effective_message": "бля из чего состоит остаток по 60.01 на 2020-05-31"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error_code": null,
|
||||||
|
"error_message": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 91,
|
||||||
|
"id": "X031",
|
||||||
|
"question": "docs by contract 15/24 2020",
|
||||||
|
"session": null,
|
||||||
|
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-x031",
|
||||||
|
"status_code": 200,
|
||||||
|
"ok": true,
|
||||||
|
"elapsed_ms": 8031,
|
||||||
|
"reply_type": "partial_coverage",
|
||||||
|
"trace_id": "address-mEQ3T-G789",
|
||||||
|
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
|
||||||
|
"assistant_reply_first_line": "В live-данных по текущему фильтру записи не найдены.",
|
||||||
|
"expected_intent": "list_documents_by_contract",
|
||||||
|
"actual_intent": "list_documents_by_contract",
|
||||||
|
"intent_match": true,
|
||||||
|
"expected_mode": "address_query",
|
||||||
|
"actual_mode": "address_query",
|
||||||
|
"mode_match": true,
|
||||||
|
"expected_reply_type": null,
|
||||||
|
"reply_match": true,
|
||||||
|
"semantic_pass": true,
|
||||||
|
"route_pass": false,
|
||||||
|
"route_health": "likely_blocked_route",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"strict_pass": false,
|
||||||
|
"selected_recipe": "address_documents_by_contract_v1",
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_same",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"debug_payload": {
|
||||||
|
"trace_id": "address-mEQ3T-G789",
|
||||||
|
"prompt_version": "address_query_runtime_v1",
|
||||||
|
"schema_version": "address_query_runtime_v1",
|
||||||
|
"fallback_type": "partial",
|
||||||
|
"route_summary": null,
|
||||||
|
"fragments": [],
|
||||||
|
"requirements_extracted": [],
|
||||||
|
"coverage_report": {
|
||||||
|
"requirements_total": 0,
|
||||||
|
"requirements_covered": 0,
|
||||||
|
"requirements_uncovered": [],
|
||||||
|
"requirements_partially_covered": [],
|
||||||
|
"clarification_needed_for": [],
|
||||||
|
"out_of_scope_requirements": []
|
||||||
|
},
|
||||||
|
"routes": [],
|
||||||
|
"retrieval_status": [],
|
||||||
|
"retrieval_results": [],
|
||||||
|
"answer_grounding_check": {
|
||||||
|
"status": "partial",
|
||||||
|
"route_subject_match": true,
|
||||||
|
"missing_requirements": [],
|
||||||
|
"reasons": [
|
||||||
|
"address_entity_detected",
|
||||||
|
"object_signal_detected",
|
||||||
|
"documents_by_contract_signal_detected"
|
||||||
|
],
|
||||||
|
"why_included_summary": [],
|
||||||
|
"selection_reason_summary": []
|
||||||
|
},
|
||||||
|
"dropped_intent_segments": [],
|
||||||
|
"detected_mode": "address_query",
|
||||||
|
"detected_mode_confidence": "medium",
|
||||||
|
"query_shape": "OBJECT_LOOKUP",
|
||||||
|
"query_shape_confidence": "medium",
|
||||||
|
"detected_intent": "list_documents_by_contract",
|
||||||
|
"detected_intent_confidence": "medium",
|
||||||
|
"extracted_filters": {
|
||||||
|
"sort": "period_desc",
|
||||||
|
"limit": 20,
|
||||||
|
"contract": "15/24 2020",
|
||||||
|
"period_from": "2020-01-01",
|
||||||
|
"period_to": "2020-12-31"
|
||||||
|
},
|
||||||
|
"missing_required_filters": [],
|
||||||
|
"selected_recipe": "address_documents_by_contract_v1",
|
||||||
|
"mcp_call_status_legacy": "materialized_but_not_matched",
|
||||||
|
"account_scope_mode": "preferred",
|
||||||
|
"account_scope_fallback_applied": true,
|
||||||
|
"anchor_type": "contract",
|
||||||
|
"anchor_value_raw": "15/24 2020",
|
||||||
|
"anchor_value_resolved": "15/24 2020",
|
||||||
|
"resolver_confidence": "medium",
|
||||||
|
"ambiguity_count": 0,
|
||||||
|
"match_failure_stage": "materialized_but_not_anchor_matched",
|
||||||
|
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
|
||||||
|
"mcp_call_status": "materialized_but_not_anchor_matched",
|
||||||
|
"rows_fetched": 20,
|
||||||
|
"raw_rows_received": 20,
|
||||||
|
"rows_after_account_scope": 20,
|
||||||
|
"rows_after_recipe_filter": 0,
|
||||||
|
"rows_materialized": 20,
|
||||||
|
"rows_matched": 0,
|
||||||
|
"raw_row_keys_sample": [
|
||||||
|
"Период",
|
||||||
|
"Регистратор",
|
||||||
|
"СчетДт",
|
||||||
|
"СчетКт",
|
||||||
|
"Сумма",
|
||||||
|
"Period",
|
||||||
|
"Registrator",
|
||||||
|
"AccountDt",
|
||||||
|
"AccountKt",
|
||||||
|
"Amount"
|
||||||
|
],
|
||||||
|
"materialization_drop_reason": "none",
|
||||||
|
"account_token_raw": null,
|
||||||
|
"account_token_normalized": null,
|
||||||
|
"account_scope_fields_checked": [
|
||||||
|
"account_dt",
|
||||||
|
"account_kt",
|
||||||
|
"registrator",
|
||||||
|
"analytics"
|
||||||
|
],
|
||||||
|
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
|
||||||
|
"account_scope_drop_reason": "not_applicable",
|
||||||
|
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
|
||||||
|
"limited_reason_category": "empty_match",
|
||||||
|
"response_type": "LIMITED_WITH_REASON",
|
||||||
|
"execution_lane": "address_query",
|
||||||
|
"llm_decomposition_applied": false,
|
||||||
|
"llm_decomposition_attempted": true,
|
||||||
|
"llm_provider_used": "local",
|
||||||
|
"llm_decomposition_trace_id": "7cYAD2ehihqh2t",
|
||||||
|
"llm_decomposition_effective_message": "docs by contract 15/24 2020",
|
||||||
|
"llm_decomposition_reason": "normalized_fragment_same",
|
||||||
|
"fallback_rule_hit": null,
|
||||||
|
"sanitized_user_message": "документы by contract 15/24 2020",
|
||||||
|
"tool_gate_decision": "run_address_lane",
|
||||||
|
"tool_gate_reason": "address_mode_classifier_detected",
|
||||||
|
"answer_structure_v11": null,
|
||||||
|
"investigation_state_snapshot": null,
|
||||||
|
"normalized": null,
|
||||||
|
"normalizer_output": {
|
||||||
|
"trace_id": "7cYAD2ehihqh2t",
|
||||||
|
"prompt_version": "normalizer_v2_0_2",
|
||||||
|
"applied": false,
|
||||||
|
"effective_message": "docs by contract 15/24 2020"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error_code": null,
|
||||||
|
"error_message": null
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,106 @@
|
||||||
|
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54
|
||||||
|
|
||||||
|
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| S001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки за 2020 покаж пж | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие у свк есть доки за 2020? | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S009 | True | ok_or_factual | factual | list_documents_by_counterparty | None | docs by counterparty svk year 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S011 | True | ok_or_factual | factual | list_documents_by_counterparty | None | плс доки по свк 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S018 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | че у свк по банку за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S019 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк списания/поступления за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S036 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | из чего состоит остаток по счету 60 на 2020.05 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| S037 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S038 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S040 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S043 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | покажи документы по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S044 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по дог. 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S046 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 year 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S049 | True | ok_or_factual | factual | list_documents_by_contract | None | плс документы договор №15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S053 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S054 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки кинь за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля покаж свк документы 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X007 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк операции за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X008 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк выписку банка за 2020 выведи | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X009 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк платежки за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X012 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | ёпт по свк че по банку 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X019 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | скока по 60.02 на конец 2020-12 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X021 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X022 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X026 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | раскидай остаток 62.01 по докам на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X028 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля из чего состоит остаток по 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
|
||||||
|
| X029 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по договору 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X031 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 2020 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X033 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 выведи доки | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
|
||||||
|
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X038 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X039 | True | ok_or_factual | factual | bank_operations_by_contract | None | покажи банк опер по дог 15/24 пж | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
{
|
||||||
|
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54",
|
||||||
|
"generated_at": "2026-04-02T12:50:55",
|
||||||
|
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
|
||||||
|
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
|
||||||
|
"llm_provider": "local",
|
||||||
|
"llm_model": "qwen2.5-14b-instruct-1m",
|
||||||
|
"llm_base_url": "http://127.0.0.1:1234",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"totals": {
|
||||||
|
"questions_total": 102,
|
||||||
|
"ok_200_count": 102,
|
||||||
|
"semantic_pass_count": 102,
|
||||||
|
"semantic_pass_rate": 1.0,
|
||||||
|
"route_pass_count": 96,
|
||||||
|
"route_pass_rate": 0.9412,
|
||||||
|
"strict_pass_count": 96,
|
||||||
|
"strict_pass_rate": 0.9412,
|
||||||
|
"factual_count": 91,
|
||||||
|
"partial_coverage_count": 11,
|
||||||
|
"clarification_required_count": 0,
|
||||||
|
"http_error_count": 0,
|
||||||
|
"llm_decomposition_applied_count": 77,
|
||||||
|
"avg_elapsed_ms": 5892.0
|
||||||
|
},
|
||||||
|
"distributions": {
|
||||||
|
"reply_type": {
|
||||||
|
"factual": 91,
|
||||||
|
"partial_coverage": 11
|
||||||
|
},
|
||||||
|
"actual_intent": {
|
||||||
|
"list_documents_by_counterparty": 18,
|
||||||
|
"bank_operations_by_counterparty": 16,
|
||||||
|
"account_balance_snapshot": 26,
|
||||||
|
"documents_forming_balance": 16,
|
||||||
|
"list_documents_by_contract": 14,
|
||||||
|
"bank_operations_by_contract": 12
|
||||||
|
},
|
||||||
|
"actual_mode": {
|
||||||
|
"address_query": 102
|
||||||
|
},
|
||||||
|
"mcp_call_status": {
|
||||||
|
"matched_non_empty": 91,
|
||||||
|
"no_raw_rows": 5,
|
||||||
|
"materialized_but_filtered_out_by_recipe": 3,
|
||||||
|
"materialized_but_not_anchor_matched": 3
|
||||||
|
},
|
||||||
|
"limited_reason_category": {
|
||||||
|
"empty_match": 8,
|
||||||
|
"recipe_visibility_gap": 3
|
||||||
|
},
|
||||||
|
"route_health": {
|
||||||
|
"ok_or_factual": 91,
|
||||||
|
"partial_non_blocking": 5,
|
||||||
|
"blocked_recipe_visibility_gap": 3,
|
||||||
|
"likely_blocked_route": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27
|
||||||
|
|
||||||
|
Generated at: 2026-04-02T13:07:31
|
||||||
|
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
|
||||||
|
Backend URL: http://127.0.0.1:8787/api/assistant/message
|
||||||
|
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
|
||||||
|
Strict policy: route
|
||||||
|
|
||||||
|
## Totals
|
||||||
|
- questions_total: 102
|
||||||
|
- ok_200_count: 102
|
||||||
|
- semantic_pass_count: 102
|
||||||
|
- semantic_pass_rate: 1.0
|
||||||
|
- route_pass_count: 102
|
||||||
|
- route_pass_rate: 1.0
|
||||||
|
- strict_pass_count: 102
|
||||||
|
- strict_pass_rate: 1.0
|
||||||
|
- factual_count: 97
|
||||||
|
- partial_coverage_count: 5
|
||||||
|
- clarification_required_count: 0
|
||||||
|
- http_error_count: 0
|
||||||
|
- llm_decomposition_applied_count: 77
|
||||||
|
- avg_elapsed_ms: 5922.3
|
||||||
|
|
||||||
|
## Files
|
||||||
|
- run_summary.json
|
||||||
|
- full_live_results.json
|
||||||
|
- failures_only.json
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
[]
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,106 @@
|
||||||
|
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27
|
||||||
|
|
||||||
|
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| S001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки за 2020 покаж пж | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие у свк есть доки за 2020? | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S009 | True | ok_or_factual | factual | list_documents_by_counterparty | None | docs by counterparty svk year 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S011 | True | ok_or_factual | factual | list_documents_by_counterparty | None | плс доки по свк 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S018 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | че у свк по банку за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S019 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк списания/поступления за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S036 | True | ok_or_factual | factual | documents_forming_balance | None | из чего состоит остаток по счету 60 на 2020.05 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S037 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S038 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S040 | True | ok_or_factual | factual | documents_forming_balance | None | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| S043 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы по договору 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| S044 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по дог. 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Собран список документов по договору (live address lane). |
|
||||||
|
| S046 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 15/24 year 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Собран список документов по договору (live address lane). |
|
||||||
|
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Собран список документов по договору (live address lane). |
|
||||||
|
| S049 | True | ok_or_factual | factual | list_documents_by_contract | None | плс документы договор №15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Собран список документов по договору (live address lane). |
|
||||||
|
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S053 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S054 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки кинь за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||||
|
| X006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля покаж свк документы 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X007 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк операции за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X008 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк выписку банка за 2020 выведи | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X009 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк платежки за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||||
|
| X012 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | ёпт по свк че по банку 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X019 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | скока по 60.02 на конец 2020-12 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X021 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X022 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X026 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | раскидай остаток 62.01 по докам на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||||
|
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X028 | True | ok_or_factual | factual | documents_forming_balance | None | бля из чего состоит остаток по 60.01 на 2020-05-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||||
|
| X029 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по договору 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Собран список документов по договору (live address lane). |
|
||||||
|
| X031 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 15/24 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||||
|
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Собран список документов по договору (live address lane). |
|
||||||
|
| X033 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 выведи доки | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Собран список документов по договору (live address lane). |
|
||||||
|
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X038 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
|
||||||
|
| X039 | True | ok_or_factual | factual | bank_operations_by_contract | None | покажи банк опер по дог 15/24 пж | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
|
||||||
|
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
{
|
||||||
|
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27",
|
||||||
|
"generated_at": "2026-04-02T13:07:31",
|
||||||
|
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
|
||||||
|
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
|
||||||
|
"llm_provider": "local",
|
||||||
|
"llm_model": "qwen2.5-14b-instruct-1m",
|
||||||
|
"llm_base_url": "http://127.0.0.1:1234",
|
||||||
|
"strict_policy": "route",
|
||||||
|
"totals": {
|
||||||
|
"questions_total": 102,
|
||||||
|
"ok_200_count": 102,
|
||||||
|
"semantic_pass_count": 102,
|
||||||
|
"semantic_pass_rate": 1.0,
|
||||||
|
"route_pass_count": 102,
|
||||||
|
"route_pass_rate": 1.0,
|
||||||
|
"strict_pass_count": 102,
|
||||||
|
"strict_pass_rate": 1.0,
|
||||||
|
"factual_count": 97,
|
||||||
|
"partial_coverage_count": 5,
|
||||||
|
"clarification_required_count": 0,
|
||||||
|
"http_error_count": 0,
|
||||||
|
"llm_decomposition_applied_count": 77,
|
||||||
|
"avg_elapsed_ms": 5922.3
|
||||||
|
},
|
||||||
|
"distributions": {
|
||||||
|
"reply_type": {
|
||||||
|
"factual": 97,
|
||||||
|
"partial_coverage": 5
|
||||||
|
},
|
||||||
|
"actual_intent": {
|
||||||
|
"list_documents_by_counterparty": 18,
|
||||||
|
"bank_operations_by_counterparty": 16,
|
||||||
|
"account_balance_snapshot": 26,
|
||||||
|
"documents_forming_balance": 16,
|
||||||
|
"list_documents_by_contract": 14,
|
||||||
|
"bank_operations_by_contract": 12
|
||||||
|
},
|
||||||
|
"actual_mode": {
|
||||||
|
"address_query": 102
|
||||||
|
},
|
||||||
|
"mcp_call_status": {
|
||||||
|
"matched_non_empty": 97,
|
||||||
|
"no_raw_rows": 5
|
||||||
|
},
|
||||||
|
"limited_reason_category": {
|
||||||
|
"empty_match": 5
|
||||||
|
},
|
||||||
|
"route_health": {
|
||||||
|
"ok_or_factual": 97,
|
||||||
|
"partial_non_blocking": 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -323,12 +323,27 @@ function cleanupAnchorValue(value) {
|
||||||
.replace(/\s+(?:с|по|за)(?:\s+|$)[\s\S]*$/iu, "")
|
.replace(/\s+(?:с|по|за)(?:\s+|$)[\s\S]*$/iu, "")
|
||||||
.trim();
|
.trim();
|
||||||
}
|
}
|
||||||
|
function cleanupContractAnchorValue(value) {
|
||||||
|
let normalized = cleanupAnchorValue(value);
|
||||||
|
if (!normalized) {
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
const yearQualifierTailPattern = /\s+(?:(?:за|for)\s+)?(?:year|г(?:од|ода)?\.?)\s*(?:20\d{2}|\d{2})(?:\s+|$)[\s\S]*$/iu;
|
||||||
|
if (yearQualifierTailPattern.test(normalized)) {
|
||||||
|
normalized = normalized.replace(yearQualifierTailPattern, "").trim();
|
||||||
|
}
|
||||||
|
const trailingSeparatedYearPattern = /\s+(?:20\d{2}|\d{2})\s*(?:г(?:од|ода)?\.?|year)?$/iu;
|
||||||
|
if (trailingSeparatedYearPattern.test(normalized) && /[\/\\-]/.test(normalized)) {
|
||||||
|
normalized = normalized.replace(trailingSeparatedYearPattern, "").trim();
|
||||||
|
}
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
function hasAllTimeHint(text) {
|
function hasAllTimeHint(text) {
|
||||||
const value = String(text ?? "");
|
const value = String(text ?? "");
|
||||||
return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value);
|
return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value);
|
||||||
}
|
}
|
||||||
function extractLooseByAnchorValue(text) {
|
function extractLooseByAnchorValue(text) {
|
||||||
const match = String(text ?? "").match(/(?:^|\s)по\s+([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\s,.;:!?)]|$)/iu);
|
const match = String(text ?? "").match(/(?:^|\s)по\s+([\p{L}][\p{L}\p{N}._-]{1,})(?=[\s,.;:!?)]|$)/iu);
|
||||||
if (!match) {
|
if (!match) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
@ -471,14 +486,14 @@ function isLikelyCounterpartyToken(rawToken) {
|
||||||
}
|
}
|
||||||
function hasDocsOrBankSignal(text) {
|
function hasDocsOrBankSignal(text) {
|
||||||
const lowered = String(text ?? "").toLowerCase();
|
const lowered = String(text ?? "").toLowerCase();
|
||||||
return new RegExp(`(?:${DOC_SIGNAL_PATTERN}|банк|выписк|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`, "iu").test(lowered);
|
return new RegExp(`(?:${DOC_SIGNAL_PATTERN}|банк|выписк|списан|поступлен|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`, "iu").test(lowered);
|
||||||
}
|
}
|
||||||
function extractCounterpartyFromFreeTextHeuristic(text) {
|
function extractCounterpartyFromFreeTextHeuristic(text) {
|
||||||
if (!hasDocsOrBankSignal(text)) {
|
if (!hasDocsOrBankSignal(text)) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
const tokens = String(text ?? "")
|
const tokens = String(text ?? "")
|
||||||
.split(/[^a-zа-яё0-9._-]+/iu)
|
.split(/[^\p{L}\p{N}._-]+/u)
|
||||||
.map((item) => item.trim())
|
.map((item) => item.trim())
|
||||||
.filter((item) => item.length > 0);
|
.filter((item) => item.length > 0);
|
||||||
if (tokens.length === 0) {
|
if (tokens.length === 0) {
|
||||||
|
|
@ -531,7 +546,7 @@ function extractCounterpartyFromFreeTextHeuristic(text) {
|
||||||
}
|
}
|
||||||
function extractImplicitCounterpartyValue(text) {
|
function extractImplicitCounterpartyValue(text) {
|
||||||
const input = String(text ?? "");
|
const input = String(text ?? "");
|
||||||
const beforeDocsPattern = new RegExp(`(?:^|\\s)([a-zа-яё][a-zа-яё0-9._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`, "iu");
|
const beforeDocsPattern = new RegExp(`(?:^|\\s)([\\p{L}][\\p{L}\\p{N}._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`, "iu");
|
||||||
const beforeDocsMatch = input.match(beforeDocsPattern);
|
const beforeDocsMatch = input.match(beforeDocsPattern);
|
||||||
if (beforeDocsMatch) {
|
if (beforeDocsMatch) {
|
||||||
const candidate = String(beforeDocsMatch[1] ?? "").trim();
|
const candidate = String(beforeDocsMatch[1] ?? "").trim();
|
||||||
|
|
@ -539,7 +554,7 @@ function extractImplicitCounterpartyValue(text) {
|
||||||
return candidate;
|
return candidate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const afterDocsPattern = new RegExp(`${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\\s,.;:!?)]|$)`, "iu");
|
const afterDocsPattern = new RegExp(`${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([\\p{L}][\\p{L}\\p{N}._-]{1,})(?=[\\s,.;:!?)]|$)`, "iu");
|
||||||
const afterDocsMatch = input.match(afterDocsPattern);
|
const afterDocsMatch = input.match(afterDocsPattern);
|
||||||
if (afterDocsMatch) {
|
if (afterDocsMatch) {
|
||||||
const candidate = String(afterDocsMatch[1] ?? "").trim();
|
const candidate = String(afterDocsMatch[1] ?? "").trim();
|
||||||
|
|
@ -549,6 +564,77 @@ function extractImplicitCounterpartyValue(text) {
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
function extractLeadingCounterpartyTokenHeuristic(text) {
|
||||||
|
if (!hasDocsOrBankSignal(text)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const tokens = String(text ?? "")
|
||||||
|
.split(/[^\p{L}\p{N}._-]+/u)
|
||||||
|
.map((item) => item.trim())
|
||||||
|
.filter((item) => item.length > 0);
|
||||||
|
if (tokens.length === 0) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const monthTokens = [
|
||||||
|
"янв",
|
||||||
|
"фев",
|
||||||
|
"мар",
|
||||||
|
"апр",
|
||||||
|
"май",
|
||||||
|
"июн",
|
||||||
|
"июл",
|
||||||
|
"авг",
|
||||||
|
"сен",
|
||||||
|
"сент",
|
||||||
|
"окт",
|
||||||
|
"ноя",
|
||||||
|
"дек",
|
||||||
|
"january",
|
||||||
|
"february",
|
||||||
|
"march",
|
||||||
|
"april",
|
||||||
|
"may",
|
||||||
|
"june",
|
||||||
|
"july",
|
||||||
|
"august",
|
||||||
|
"september",
|
||||||
|
"october",
|
||||||
|
"november",
|
||||||
|
"december"
|
||||||
|
];
|
||||||
|
for (const token of tokens.slice(0, 3)) {
|
||||||
|
const lowered = token.toLowerCase();
|
||||||
|
if (!isLikelyCounterpartyToken(lowered)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/^\d{2}$/.test(lowered) || /^\d{4}$/.test(lowered)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (monthTokens.some((prefix) => lowered.startsWith(prefix))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/(?:^за$|^for$|^from$|^to$|^по$|^с$|^год$|^года$|^г$|^year$|^на$|^in$)/iu.test(lowered)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
function hasExplicitAccountCue(text) {
|
||||||
|
return /(?:сч[её]т|счет|account|acct)/iu.test(String(text ?? ""));
|
||||||
|
}
|
||||||
|
function extractAccountTokenHeuristic(text) {
|
||||||
|
const source = String(text ?? "");
|
||||||
|
const dotted = source.match(/(?:^|[^\d])(\d{2}[.,]\d{1,2})(?!\d)/u);
|
||||||
|
if (dotted) {
|
||||||
|
return String(dotted[1]).replace(",", ".");
|
||||||
|
}
|
||||||
|
const contextual = source.match(/(?:^|[\s,.;:!?()\-])(?:по|на|for|account)\s+(\d{2})(?!\d)/iu);
|
||||||
|
if (contextual) {
|
||||||
|
return String(contextual[1]);
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
function shiftDaysIso(baseIso, deltaDays) {
|
function shiftDaysIso(baseIso, deltaDays) {
|
||||||
const date = new Date(`${baseIso}T00:00:00.000Z`);
|
const date = new Date(`${baseIso}T00:00:00.000Z`);
|
||||||
date.setUTCDate(date.getUTCDate() + deltaDays);
|
date.setUTCDate(date.getUTCDate() + deltaDays);
|
||||||
|
|
@ -581,6 +667,13 @@ function extractAddressFilters(userMessage, intent) {
|
||||||
if (accountMatch) {
|
if (accountMatch) {
|
||||||
filters.account = String(accountMatch[1]).replace(",", ".");
|
filters.account = String(accountMatch[1]).replace(",", ".");
|
||||||
}
|
}
|
||||||
|
if (!filters.account && (intent === "account_balance_snapshot" || intent === "documents_forming_balance")) {
|
||||||
|
const heuristicAccount = extractAccountTokenHeuristic(text);
|
||||||
|
if (heuristicAccount) {
|
||||||
|
filters.account = heuristicAccount;
|
||||||
|
warnings.push("account_anchor_derived_from_heuristic_token");
|
||||||
|
}
|
||||||
|
}
|
||||||
const limitMatch = text.match(LIMIT_PATTERN);
|
const limitMatch = text.match(LIMIT_PATTERN);
|
||||||
if (limitMatch) {
|
if (limitMatch) {
|
||||||
const parsed = Number(limitMatch[1]);
|
const parsed = Number(limitMatch[1]);
|
||||||
|
|
@ -613,14 +706,21 @@ function extractAddressFilters(userMessage, intent) {
|
||||||
warnings.push("counterparty_anchor_derived_from_free_text_heuristic");
|
warnings.push("counterparty_anchor_derived_from_free_text_heuristic");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!filters.counterparty && (intent === "list_documents_by_counterparty" || intent === "bank_operations_by_counterparty")) {
|
||||||
|
const leadingCounterparty = extractLeadingCounterpartyTokenHeuristic(text);
|
||||||
|
if (leadingCounterparty) {
|
||||||
|
filters.counterparty = cleanupAnchorValue(leadingCounterparty);
|
||||||
|
warnings.push("counterparty_anchor_derived_from_leading_token");
|
||||||
|
}
|
||||||
|
}
|
||||||
const contractMatch = text.match(CONTRACT_PATTERN);
|
const contractMatch = text.match(CONTRACT_PATTERN);
|
||||||
if (contractMatch) {
|
if (contractMatch) {
|
||||||
filters.contract = cleanupAnchorValue(String(contractMatch[1]));
|
filters.contract = cleanupContractAnchorValue(String(contractMatch[1]));
|
||||||
}
|
}
|
||||||
if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) {
|
if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) {
|
||||||
const heuristicContract = extractContractTokenHeuristic(text);
|
const heuristicContract = extractContractTokenHeuristic(text);
|
||||||
if (heuristicContract) {
|
if (heuristicContract) {
|
||||||
filters.contract = cleanupAnchorValue(heuristicContract);
|
filters.contract = cleanupContractAnchorValue(heuristicContract);
|
||||||
warnings.push("contract_anchor_derived_from_heuristic_token");
|
warnings.push("contract_anchor_derived_from_heuristic_token");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -690,6 +790,13 @@ function extractAddressFilters(userMessage, intent) {
|
||||||
warnings.push("as_of_date_defaulted_today");
|
warnings.push("as_of_date_defaulted_today");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (filters.account &&
|
||||||
|
intent !== "account_balance_snapshot" &&
|
||||||
|
intent !== "documents_forming_balance" &&
|
||||||
|
!hasExplicitAccountCue(text)) {
|
||||||
|
delete filters.account;
|
||||||
|
warnings.push("account_anchor_dropped_without_explicit_cue_for_non_account_intent");
|
||||||
|
}
|
||||||
if (filters.counterparty && filters.counterparty.length < 2) {
|
if (filters.counterparty && filters.counterparty.length < 2) {
|
||||||
warnings.push("counterparty_filter_too_short");
|
warnings.push("counterparty_filter_too_short");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -367,11 +367,13 @@ function applyIntentSpecificFilter(intent, rows) {
|
||||||
}
|
}
|
||||||
if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") {
|
if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") {
|
||||||
const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i;
|
const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i;
|
||||||
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
||||||
|
return matched.length > 0 ? matched : rows;
|
||||||
}
|
}
|
||||||
if (intent === "documents_forming_balance") {
|
if (intent === "documents_forming_balance") {
|
||||||
const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i;
|
const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i;
|
||||||
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
||||||
|
return matched.length > 0 ? matched : rows;
|
||||||
}
|
}
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
@ -396,6 +398,12 @@ function isAnchorRecoveryIntent(intent) {
|
||||||
intent === "open_items_by_counterparty_or_contract" ||
|
intent === "open_items_by_counterparty_or_contract" ||
|
||||||
intent === "list_open_contracts");
|
intent === "list_open_contracts");
|
||||||
}
|
}
|
||||||
|
function isDocumentOrBankAnchorIntent(intent) {
|
||||||
|
return (intent === "list_documents_by_counterparty" ||
|
||||||
|
intent === "bank_operations_by_counterparty" ||
|
||||||
|
intent === "list_documents_by_contract" ||
|
||||||
|
intent === "bank_operations_by_contract");
|
||||||
|
}
|
||||||
function toIsoDatePrefix(value) {
|
function toIsoDatePrefix(value) {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -967,74 +975,6 @@ class AddressQueryService {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (intent.intent === "open_items_by_counterparty_or_contract" &&
|
|
||||||
expandedFilteredRows.length === 0 &&
|
|
||||||
expandedRowsByAnchor.length === 0 &&
|
|
||||||
expandedNormalizedRows.length > 0) {
|
|
||||||
const expandedFallbackRows = applyIntentSpecificFilter(intent.intent, expandedNormalizedRows);
|
|
||||||
if (expandedFallbackRows.length > 0) {
|
|
||||||
const expandedRowDiagnostics = deriveRowStageDiagnostics(expandedMcp.raw_rows, expandedNormalizedRows.length, expandedNormalizedRows.length);
|
|
||||||
const expandedFactual = (0, composeStage_1.composeFactualReply)(intent.intent, expandedFallbackRows);
|
|
||||||
const expandedLimitations = [
|
|
||||||
...filters.warnings,
|
|
||||||
"query_limit_auto_expanded_for_anchor_recovery",
|
|
||||||
"open_items_anchor_not_matched_fallback_rows"
|
|
||||||
];
|
|
||||||
const expandedReasons = [
|
|
||||||
...baseReasons,
|
|
||||||
"query_limit_auto_expanded_for_anchor_recovery",
|
|
||||||
"open_items_anchor_not_matched_fallback_rows"
|
|
||||||
];
|
|
||||||
return {
|
|
||||||
handled: true,
|
|
||||||
reply_text: `Точный якорь не подтвердился в live-строках даже после расширения до ${expandedPlan.limit}; ` +
|
|
||||||
"показаны ближайшие доступные позиции по счетам 60/62/76.\n" +
|
|
||||||
expandedFactual.text,
|
|
||||||
reply_type: (0, composeStage_1.inferReplyType)(expandedFactual.responseType),
|
|
||||||
response_type: expandedFactual.responseType,
|
|
||||||
debug: {
|
|
||||||
detected_mode: mode.mode,
|
|
||||||
detected_mode_confidence: mode.confidence,
|
|
||||||
query_shape: shape.shape,
|
|
||||||
query_shape_confidence: shape.confidence,
|
|
||||||
detected_intent: intent.intent,
|
|
||||||
detected_intent_confidence: intent.confidence,
|
|
||||||
extracted_filters: filters.extracted_filters,
|
|
||||||
missing_required_filters: [],
|
|
||||||
selected_recipe: expandedSelection.selected_recipe.recipe_id,
|
|
||||||
mcp_call_status_legacy: "matched_non_empty",
|
|
||||||
account_scope_mode: expandedPlan.account_scope_mode,
|
|
||||||
account_scope_fallback_applied: expandedAccountScopeFallbackApplied,
|
|
||||||
anchor_type: expandedAnchor.anchor_type,
|
|
||||||
anchor_value_raw: expandedAnchor.anchor_value_raw,
|
|
||||||
anchor_value_resolved: expandedAnchor.anchor_value_resolved,
|
|
||||||
resolver_confidence: expandedAnchor.resolver_confidence,
|
|
||||||
ambiguity_count: expandedAnchor.ambiguity_count,
|
|
||||||
match_failure_stage: "materialized_but_not_anchor_matched",
|
|
||||||
match_failure_reason: expandedAnchorFilter.mismatchReason ?? "anchor_not_matched_after_query_limit_expansion",
|
|
||||||
mcp_call_status: "matched_non_empty",
|
|
||||||
rows_fetched: expandedMcp.fetched_rows,
|
|
||||||
raw_rows_received: expandedMcp.raw_rows.length,
|
|
||||||
rows_after_account_scope: expandedNormalizedRows.length,
|
|
||||||
rows_after_recipe_filter: expandedRowsByAnchor.length,
|
|
||||||
rows_materialized: expandedNormalizedRows.length,
|
|
||||||
rows_matched: expandedFallbackRows.length,
|
|
||||||
raw_row_keys_sample: expandedRowDiagnostics.rawRowKeysSample,
|
|
||||||
materialization_drop_reason: expandedRowDiagnostics.materializationDropReason,
|
|
||||||
account_token_raw: expandedAccountScopeAudit.accountTokenRaw,
|
|
||||||
account_token_normalized: expandedAccountScopeAudit.accountTokenNormalized,
|
|
||||||
account_scope_fields_checked: expandedAccountScopeAudit.accountScopeFieldsChecked,
|
|
||||||
account_scope_match_strategy: expandedAccountScopeAudit.accountScopeMatchStrategy,
|
|
||||||
account_scope_drop_reason: expandedAccountScopeAudit.accountScopeDropReason,
|
|
||||||
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
|
|
||||||
limited_reason_category: null,
|
|
||||||
response_type: expandedFactual.responseType,
|
|
||||||
limitations: expandedLimitations,
|
|
||||||
reasons: expandedReasons
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1140,16 +1080,17 @@ class AddressQueryService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (filteredRows.length === 0 &&
|
if (filteredRows.length === 0 &&
|
||||||
intent.intent === "open_items_by_counterparty_or_contract" &&
|
isDocumentOrBankAnchorIntent(intent.intent) &&
|
||||||
normalizedRows.length > 0) {
|
normalizedRows.length > 0 &&
|
||||||
const openItemsFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows);
|
(stageStatus === "materialized_but_not_anchor_matched" || stageStatus === "materialized_but_filtered_out_by_recipe")) {
|
||||||
if (openItemsFallbackRows.length > 0) {
|
const documentBankFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows);
|
||||||
const fallbackFactual = (0, composeStage_1.composeFactualReply)(intent.intent, openItemsFallbackRows);
|
if (documentBankFallbackRows.length > 0) {
|
||||||
const fallbackLimitations = [...filters.warnings, "open_items_anchor_not_matched_fallback_rows"];
|
const fallbackFactual = (0, composeStage_1.composeFactualReply)(intent.intent, documentBankFallbackRows);
|
||||||
const fallbackReasons = [...baseReasons, "open_items_anchor_not_matched_fallback_rows"];
|
const fallbackLimitations = [...filters.warnings, "anchor_not_matched_fallback_rows"];
|
||||||
|
const fallbackReasons = [...baseReasons, "anchor_not_matched_fallback_rows"];
|
||||||
return {
|
return {
|
||||||
handled: true,
|
handled: true,
|
||||||
reply_text: "Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные позиции по счетам 60/62/76.\n" +
|
reply_text: "Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу.\n" +
|
||||||
fallbackFactual.text,
|
fallbackFactual.text,
|
||||||
reply_type: (0, composeStage_1.inferReplyType)(fallbackFactual.responseType),
|
reply_type: (0, composeStage_1.inferReplyType)(fallbackFactual.responseType),
|
||||||
response_type: fallbackFactual.responseType,
|
response_type: fallbackFactual.responseType,
|
||||||
|
|
@ -1179,7 +1120,7 @@ class AddressQueryService {
|
||||||
rows_after_account_scope: normalizedRows.length,
|
rows_after_account_scope: normalizedRows.length,
|
||||||
rows_after_recipe_filter: filterByAnchors.length,
|
rows_after_recipe_filter: filterByAnchors.length,
|
||||||
rows_materialized: normalizedRows.length,
|
rows_materialized: normalizedRows.length,
|
||||||
rows_matched: openItemsFallbackRows.length,
|
rows_matched: documentBankFallbackRows.length,
|
||||||
raw_row_keys_sample: rowDiagnostics.rawRowKeysSample,
|
raw_row_keys_sample: rowDiagnostics.rawRowKeysSample,
|
||||||
materialization_drop_reason: rowDiagnostics.materializationDropReason,
|
materialization_drop_reason: rowDiagnostics.materializationDropReason,
|
||||||
account_token_raw: accountScopeAudit.accountTokenRaw,
|
account_token_raw: accountScopeAudit.accountTokenRaw,
|
||||||
|
|
|
||||||
|
|
@ -354,13 +354,33 @@ function cleanupAnchorValue(value: string): string {
|
||||||
.trim();
|
.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function cleanupContractAnchorValue(value: string): string {
|
||||||
|
let normalized = cleanupAnchorValue(value);
|
||||||
|
if (!normalized) {
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
const yearQualifierTailPattern =
|
||||||
|
/\s+(?:(?:за|for)\s+)?(?:year|г(?:од|ода)?\.?)\s*(?:20\d{2}|\d{2})(?:\s+|$)[\s\S]*$/iu;
|
||||||
|
if (yearQualifierTailPattern.test(normalized)) {
|
||||||
|
normalized = normalized.replace(yearQualifierTailPattern, "").trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
const trailingSeparatedYearPattern = /\s+(?:20\d{2}|\d{2})\s*(?:г(?:од|ода)?\.?|year)?$/iu;
|
||||||
|
if (trailingSeparatedYearPattern.test(normalized) && /[\/\\-]/.test(normalized)) {
|
||||||
|
normalized = normalized.replace(trailingSeparatedYearPattern, "").trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
|
||||||
function hasAllTimeHint(text: string): boolean {
|
function hasAllTimeHint(text: string): boolean {
|
||||||
const value = String(text ?? "");
|
const value = String(text ?? "");
|
||||||
return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value);
|
return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractLooseByAnchorValue(text: string): string | undefined {
|
function extractLooseByAnchorValue(text: string): string | undefined {
|
||||||
const match = String(text ?? "").match(/(?:^|\s)по\s+([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\s,.;:!?)]|$)/iu);
|
const match = String(text ?? "").match(/(?:^|\s)по\s+([\p{L}][\p{L}\p{N}._-]{1,})(?=[\s,.;:!?)]|$)/iu);
|
||||||
if (!match) {
|
if (!match) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
@ -508,7 +528,7 @@ function isLikelyCounterpartyToken(rawToken: string): boolean {
|
||||||
function hasDocsOrBankSignal(text: string): boolean {
|
function hasDocsOrBankSignal(text: string): boolean {
|
||||||
const lowered = String(text ?? "").toLowerCase();
|
const lowered = String(text ?? "").toLowerCase();
|
||||||
return new RegExp(
|
return new RegExp(
|
||||||
`(?:${DOC_SIGNAL_PATTERN}|банк|выписк|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`,
|
`(?:${DOC_SIGNAL_PATTERN}|банк|выписк|списан|поступлен|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`,
|
||||||
"iu"
|
"iu"
|
||||||
).test(
|
).test(
|
||||||
lowered
|
lowered
|
||||||
|
|
@ -521,7 +541,7 @@ function extractCounterpartyFromFreeTextHeuristic(text: string): string | undefi
|
||||||
}
|
}
|
||||||
|
|
||||||
const tokens = String(text ?? "")
|
const tokens = String(text ?? "")
|
||||||
.split(/[^a-zа-яё0-9._-]+/iu)
|
.split(/[^\p{L}\p{N}._-]+/u)
|
||||||
.map((item) => item.trim())
|
.map((item) => item.trim())
|
||||||
.filter((item) => item.length > 0);
|
.filter((item) => item.length > 0);
|
||||||
|
|
||||||
|
|
@ -578,7 +598,7 @@ function extractCounterpartyFromFreeTextHeuristic(text: string): string | undefi
|
||||||
function extractImplicitCounterpartyValue(text: string): string | undefined {
|
function extractImplicitCounterpartyValue(text: string): string | undefined {
|
||||||
const input = String(text ?? "");
|
const input = String(text ?? "");
|
||||||
const beforeDocsPattern = new RegExp(
|
const beforeDocsPattern = new RegExp(
|
||||||
`(?:^|\\s)([a-zа-яё][a-zа-яё0-9._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`,
|
`(?:^|\\s)([\\p{L}][\\p{L}\\p{N}._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`,
|
||||||
"iu"
|
"iu"
|
||||||
);
|
);
|
||||||
const beforeDocsMatch = input.match(beforeDocsPattern);
|
const beforeDocsMatch = input.match(beforeDocsPattern);
|
||||||
|
|
@ -590,7 +610,7 @@ function extractImplicitCounterpartyValue(text: string): string | undefined {
|
||||||
}
|
}
|
||||||
|
|
||||||
const afterDocsPattern = new RegExp(
|
const afterDocsPattern = new RegExp(
|
||||||
`${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\\s,.;:!?)]|$)`,
|
`${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([\\p{L}][\\p{L}\\p{N}._-]{1,})(?=[\\s,.;:!?)]|$)`,
|
||||||
"iu"
|
"iu"
|
||||||
);
|
);
|
||||||
const afterDocsMatch = input.match(afterDocsPattern);
|
const afterDocsMatch = input.match(afterDocsPattern);
|
||||||
|
|
@ -604,6 +624,81 @@ function extractImplicitCounterpartyValue(text: string): string | undefined {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractLeadingCounterpartyTokenHeuristic(text: string): string | undefined {
|
||||||
|
if (!hasDocsOrBankSignal(text)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const tokens = String(text ?? "")
|
||||||
|
.split(/[^\p{L}\p{N}._-]+/u)
|
||||||
|
.map((item) => item.trim())
|
||||||
|
.filter((item) => item.length > 0);
|
||||||
|
if (tokens.length === 0) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const monthTokens = [
|
||||||
|
"янв",
|
||||||
|
"фев",
|
||||||
|
"мар",
|
||||||
|
"апр",
|
||||||
|
"май",
|
||||||
|
"июн",
|
||||||
|
"июл",
|
||||||
|
"авг",
|
||||||
|
"сен",
|
||||||
|
"сент",
|
||||||
|
"окт",
|
||||||
|
"ноя",
|
||||||
|
"дек",
|
||||||
|
"january",
|
||||||
|
"february",
|
||||||
|
"march",
|
||||||
|
"april",
|
||||||
|
"may",
|
||||||
|
"june",
|
||||||
|
"july",
|
||||||
|
"august",
|
||||||
|
"september",
|
||||||
|
"october",
|
||||||
|
"november",
|
||||||
|
"december"
|
||||||
|
];
|
||||||
|
for (const token of tokens.slice(0, 3)) {
|
||||||
|
const lowered = token.toLowerCase();
|
||||||
|
if (!isLikelyCounterpartyToken(lowered)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/^\d{2}$/.test(lowered) || /^\d{4}$/.test(lowered)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (monthTokens.some((prefix) => lowered.startsWith(prefix))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/(?:^за$|^for$|^from$|^to$|^по$|^с$|^год$|^года$|^г$|^year$|^на$|^in$)/iu.test(lowered)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasExplicitAccountCue(text: string): boolean {
|
||||||
|
return /(?:сч[её]т|счет|account|acct)/iu.test(String(text ?? ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractAccountTokenHeuristic(text: string): string | undefined {
|
||||||
|
const source = String(text ?? "");
|
||||||
|
const dotted = source.match(/(?:^|[^\d])(\d{2}[.,]\d{1,2})(?!\d)/u);
|
||||||
|
if (dotted) {
|
||||||
|
return String(dotted[1]).replace(",", ".");
|
||||||
|
}
|
||||||
|
const contextual = source.match(/(?:^|[\s,.;:!?()\-])(?:по|на|for|account)\s+(\d{2})(?!\d)/iu);
|
||||||
|
if (contextual) {
|
||||||
|
return String(contextual[1]);
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
function shiftDaysIso(baseIso: string, deltaDays: number): string {
|
function shiftDaysIso(baseIso: string, deltaDays: number): string {
|
||||||
const date = new Date(`${baseIso}T00:00:00.000Z`);
|
const date = new Date(`${baseIso}T00:00:00.000Z`);
|
||||||
date.setUTCDate(date.getUTCDate() + deltaDays);
|
date.setUTCDate(date.getUTCDate() + deltaDays);
|
||||||
|
|
@ -640,6 +735,13 @@ export function extractAddressFilters(userMessage: string, intent: AddressIntent
|
||||||
if (accountMatch) {
|
if (accountMatch) {
|
||||||
filters.account = String(accountMatch[1]).replace(",", ".");
|
filters.account = String(accountMatch[1]).replace(",", ".");
|
||||||
}
|
}
|
||||||
|
if (!filters.account && (intent === "account_balance_snapshot" || intent === "documents_forming_balance")) {
|
||||||
|
const heuristicAccount = extractAccountTokenHeuristic(text);
|
||||||
|
if (heuristicAccount) {
|
||||||
|
filters.account = heuristicAccount;
|
||||||
|
warnings.push("account_anchor_derived_from_heuristic_token");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const limitMatch = text.match(LIMIT_PATTERN);
|
const limitMatch = text.match(LIMIT_PATTERN);
|
||||||
if (limitMatch) {
|
if (limitMatch) {
|
||||||
|
|
@ -674,15 +776,22 @@ export function extractAddressFilters(userMessage: string, intent: AddressIntent
|
||||||
warnings.push("counterparty_anchor_derived_from_free_text_heuristic");
|
warnings.push("counterparty_anchor_derived_from_free_text_heuristic");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!filters.counterparty && (intent === "list_documents_by_counterparty" || intent === "bank_operations_by_counterparty")) {
|
||||||
|
const leadingCounterparty = extractLeadingCounterpartyTokenHeuristic(text);
|
||||||
|
if (leadingCounterparty) {
|
||||||
|
filters.counterparty = cleanupAnchorValue(leadingCounterparty);
|
||||||
|
warnings.push("counterparty_anchor_derived_from_leading_token");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const contractMatch = text.match(CONTRACT_PATTERN);
|
const contractMatch = text.match(CONTRACT_PATTERN);
|
||||||
if (contractMatch) {
|
if (contractMatch) {
|
||||||
filters.contract = cleanupAnchorValue(String(contractMatch[1]));
|
filters.contract = cleanupContractAnchorValue(String(contractMatch[1]));
|
||||||
}
|
}
|
||||||
if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) {
|
if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) {
|
||||||
const heuristicContract = extractContractTokenHeuristic(text);
|
const heuristicContract = extractContractTokenHeuristic(text);
|
||||||
if (heuristicContract) {
|
if (heuristicContract) {
|
||||||
filters.contract = cleanupAnchorValue(heuristicContract);
|
filters.contract = cleanupContractAnchorValue(heuristicContract);
|
||||||
warnings.push("contract_anchor_derived_from_heuristic_token");
|
warnings.push("contract_anchor_derived_from_heuristic_token");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -761,6 +870,16 @@ export function extractAddressFilters(userMessage: string, intent: AddressIntent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
filters.account &&
|
||||||
|
intent !== "account_balance_snapshot" &&
|
||||||
|
intent !== "documents_forming_balance" &&
|
||||||
|
!hasExplicitAccountCue(text)
|
||||||
|
) {
|
||||||
|
delete filters.account;
|
||||||
|
warnings.push("account_anchor_dropped_without_explicit_cue_for_non_account_intent");
|
||||||
|
}
|
||||||
|
|
||||||
if (filters.counterparty && filters.counterparty.length < 2) {
|
if (filters.counterparty && filters.counterparty.length < 2) {
|
||||||
warnings.push("counterparty_filter_too_short");
|
warnings.push("counterparty_filter_too_short");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -433,13 +433,15 @@ function applyIntentSpecificFilter(intent: AddressIntent, rows: NormalizedAddres
|
||||||
if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") {
|
if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") {
|
||||||
const documentPattern =
|
const documentPattern =
|
||||||
/(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i;
|
/(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i;
|
||||||
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
||||||
|
return matched.length > 0 ? matched : rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intent === "documents_forming_balance") {
|
if (intent === "documents_forming_balance") {
|
||||||
const documentPattern =
|
const documentPattern =
|
||||||
/(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i;
|
/(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i;
|
||||||
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
|
||||||
|
return matched.length > 0 ? matched : rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rows;
|
return rows;
|
||||||
|
|
@ -475,6 +477,15 @@ function isAnchorRecoveryIntent(intent: AddressIntent): boolean {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isDocumentOrBankAnchorIntent(intent: AddressIntent): boolean {
|
||||||
|
return (
|
||||||
|
intent === "list_documents_by_counterparty" ||
|
||||||
|
intent === "bank_operations_by_counterparty" ||
|
||||||
|
intent === "list_documents_by_contract" ||
|
||||||
|
intent === "bank_operations_by_contract"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function toIsoDatePrefix(value: string | null): string | null {
|
function toIsoDatePrefix(value: string | null): string | null {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1172,82 +1183,6 @@ export class AddressQueryService {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (
|
|
||||||
intent.intent === "open_items_by_counterparty_or_contract" &&
|
|
||||||
expandedFilteredRows.length === 0 &&
|
|
||||||
expandedRowsByAnchor.length === 0 &&
|
|
||||||
expandedNormalizedRows.length > 0
|
|
||||||
) {
|
|
||||||
const expandedFallbackRows = applyIntentSpecificFilter(intent.intent, expandedNormalizedRows);
|
|
||||||
if (expandedFallbackRows.length > 0) {
|
|
||||||
const expandedRowDiagnostics = deriveRowStageDiagnostics(
|
|
||||||
expandedMcp.raw_rows,
|
|
||||||
expandedNormalizedRows.length,
|
|
||||||
expandedNormalizedRows.length
|
|
||||||
);
|
|
||||||
const expandedFactual = composeFactualReply(intent.intent, expandedFallbackRows);
|
|
||||||
const expandedLimitations = [
|
|
||||||
...filters.warnings,
|
|
||||||
"query_limit_auto_expanded_for_anchor_recovery",
|
|
||||||
"open_items_anchor_not_matched_fallback_rows"
|
|
||||||
];
|
|
||||||
const expandedReasons = [
|
|
||||||
...baseReasons,
|
|
||||||
"query_limit_auto_expanded_for_anchor_recovery",
|
|
||||||
"open_items_anchor_not_matched_fallback_rows"
|
|
||||||
];
|
|
||||||
return {
|
|
||||||
handled: true,
|
|
||||||
reply_text:
|
|
||||||
`Точный якорь не подтвердился в live-строках даже после расширения до ${expandedPlan.limit}; ` +
|
|
||||||
"показаны ближайшие доступные позиции по счетам 60/62/76.\n" +
|
|
||||||
expandedFactual.text,
|
|
||||||
reply_type: inferReplyType(expandedFactual.responseType),
|
|
||||||
response_type: expandedFactual.responseType,
|
|
||||||
debug: {
|
|
||||||
detected_mode: mode.mode,
|
|
||||||
detected_mode_confidence: mode.confidence,
|
|
||||||
query_shape: shape.shape,
|
|
||||||
query_shape_confidence: shape.confidence,
|
|
||||||
detected_intent: intent.intent,
|
|
||||||
detected_intent_confidence: intent.confidence,
|
|
||||||
extracted_filters: filters.extracted_filters,
|
|
||||||
missing_required_filters: [],
|
|
||||||
selected_recipe: expandedSelection.selected_recipe.recipe_id,
|
|
||||||
mcp_call_status_legacy: "matched_non_empty",
|
|
||||||
account_scope_mode: expandedPlan.account_scope_mode,
|
|
||||||
account_scope_fallback_applied: expandedAccountScopeFallbackApplied,
|
|
||||||
anchor_type: expandedAnchor.anchor_type,
|
|
||||||
anchor_value_raw: expandedAnchor.anchor_value_raw,
|
|
||||||
anchor_value_resolved: expandedAnchor.anchor_value_resolved,
|
|
||||||
resolver_confidence: expandedAnchor.resolver_confidence,
|
|
||||||
ambiguity_count: expandedAnchor.ambiguity_count,
|
|
||||||
match_failure_stage: "materialized_but_not_anchor_matched",
|
|
||||||
match_failure_reason:
|
|
||||||
expandedAnchorFilter.mismatchReason ?? "anchor_not_matched_after_query_limit_expansion",
|
|
||||||
mcp_call_status: "matched_non_empty",
|
|
||||||
rows_fetched: expandedMcp.fetched_rows,
|
|
||||||
raw_rows_received: expandedMcp.raw_rows.length,
|
|
||||||
rows_after_account_scope: expandedNormalizedRows.length,
|
|
||||||
rows_after_recipe_filter: expandedRowsByAnchor.length,
|
|
||||||
rows_materialized: expandedNormalizedRows.length,
|
|
||||||
rows_matched: expandedFallbackRows.length,
|
|
||||||
raw_row_keys_sample: expandedRowDiagnostics.rawRowKeysSample,
|
|
||||||
materialization_drop_reason: expandedRowDiagnostics.materializationDropReason,
|
|
||||||
account_token_raw: expandedAccountScopeAudit.accountTokenRaw,
|
|
||||||
account_token_normalized: expandedAccountScopeAudit.accountTokenNormalized,
|
|
||||||
account_scope_fields_checked: expandedAccountScopeAudit.accountScopeFieldsChecked,
|
|
||||||
account_scope_match_strategy: expandedAccountScopeAudit.accountScopeMatchStrategy,
|
|
||||||
account_scope_drop_reason: expandedAccountScopeAudit.accountScopeDropReason,
|
|
||||||
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
|
|
||||||
limited_reason_category: null,
|
|
||||||
response_type: expandedFactual.responseType,
|
|
||||||
limitations: expandedLimitations,
|
|
||||||
reasons: expandedReasons
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1362,18 +1297,19 @@ export class AddressQueryService {
|
||||||
|
|
||||||
if (
|
if (
|
||||||
filteredRows.length === 0 &&
|
filteredRows.length === 0 &&
|
||||||
intent.intent === "open_items_by_counterparty_or_contract" &&
|
isDocumentOrBankAnchorIntent(intent.intent) &&
|
||||||
normalizedRows.length > 0
|
normalizedRows.length > 0 &&
|
||||||
|
(stageStatus === "materialized_but_not_anchor_matched" || stageStatus === "materialized_but_filtered_out_by_recipe")
|
||||||
) {
|
) {
|
||||||
const openItemsFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows);
|
const documentBankFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows);
|
||||||
if (openItemsFallbackRows.length > 0) {
|
if (documentBankFallbackRows.length > 0) {
|
||||||
const fallbackFactual = composeFactualReply(intent.intent, openItemsFallbackRows);
|
const fallbackFactual = composeFactualReply(intent.intent, documentBankFallbackRows);
|
||||||
const fallbackLimitations = [...filters.warnings, "open_items_anchor_not_matched_fallback_rows"];
|
const fallbackLimitations = [...filters.warnings, "anchor_not_matched_fallback_rows"];
|
||||||
const fallbackReasons = [...baseReasons, "open_items_anchor_not_matched_fallback_rows"];
|
const fallbackReasons = [...baseReasons, "anchor_not_matched_fallback_rows"];
|
||||||
return {
|
return {
|
||||||
handled: true,
|
handled: true,
|
||||||
reply_text:
|
reply_text:
|
||||||
"Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные позиции по счетам 60/62/76.\n" +
|
"Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу.\n" +
|
||||||
fallbackFactual.text,
|
fallbackFactual.text,
|
||||||
reply_type: inferReplyType(fallbackFactual.responseType),
|
reply_type: inferReplyType(fallbackFactual.responseType),
|
||||||
response_type: fallbackFactual.responseType,
|
response_type: fallbackFactual.responseType,
|
||||||
|
|
@ -1403,7 +1339,7 @@ export class AddressQueryService {
|
||||||
rows_after_account_scope: normalizedRows.length,
|
rows_after_account_scope: normalizedRows.length,
|
||||||
rows_after_recipe_filter: filterByAnchors.length,
|
rows_after_recipe_filter: filterByAnchors.length,
|
||||||
rows_materialized: normalizedRows.length,
|
rows_materialized: normalizedRows.length,
|
||||||
rows_matched: openItemsFallbackRows.length,
|
rows_matched: documentBankFallbackRows.length,
|
||||||
raw_row_keys_sample: rowDiagnostics.rawRowKeysSample,
|
raw_row_keys_sample: rowDiagnostics.rawRowKeysSample,
|
||||||
materialization_drop_reason: rowDiagnostics.materializationDropReason,
|
materialization_drop_reason: rowDiagnostics.materializationDropReason,
|
||||||
account_token_raw: accountScopeAudit.accountTokenRaw,
|
account_token_raw: accountScopeAudit.accountTokenRaw,
|
||||||
|
|
|
||||||
|
|
@ -315,6 +315,37 @@ describe("address filter extraction for balance drilldown", () => {
|
||||||
expect(result.warnings).toContain("as_of_date_derived_from_period_to");
|
expect(result.warnings).toContain("as_of_date_derived_from_period_to");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("extracts dotted account by heuristic for docs-forming phrasing without 'счет' keyword", () => {
|
||||||
|
const result = extractAddressFilters(
|
||||||
|
"раскрой остаток 60.01 по документам на конец июля 2020",
|
||||||
|
"documents_forming_balance"
|
||||||
|
);
|
||||||
|
expect(result.extracted_filters.account).toBe("60.01");
|
||||||
|
expect(result.extracted_filters.as_of_date).toBe("2020-07-31");
|
||||||
|
expect(result.warnings).toContain("account_anchor_derived_from_heuristic_token");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("extracts dotted account by heuristic for short balance slang", () => {
|
||||||
|
const result = extractAddressFilters("скока по 60.02 на конец 2020-12", "account_balance_snapshot");
|
||||||
|
expect(result.extracted_filters.account).toBe("60.02");
|
||||||
|
expect(result.extracted_filters.as_of_date).toBe("2020-12-31");
|
||||||
|
expect(result.warnings).toContain("account_anchor_derived_from_heuristic_token");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("drops accidental account for non-account intent without explicit account cue", () => {
|
||||||
|
const result = extractAddressFilters("покажи банк операции по свк за 2020", "bank_operations_by_counterparty");
|
||||||
|
expect(result.extracted_filters.account).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("extracts leading counterparty token for short bank phrase", () => {
|
||||||
|
const result = extractAddressFilters("свк списания/поступления за 2020", "bank_operations_by_counterparty");
|
||||||
|
expect(result.extracted_filters.counterparty).toBe("свк");
|
||||||
|
expect(
|
||||||
|
result.warnings.includes("counterparty_anchor_derived_from_leading_token") ||
|
||||||
|
result.warnings.includes("counterparty_anchor_derived_from_free_text_heuristic")
|
||||||
|
).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
it("treats 'за весь период' as all-time hint and does not force 90-day default", () => {
|
it("treats 'за весь период' as all-time hint and does not force 90-day default", () => {
|
||||||
const result = extractAddressFilters(
|
const result = extractAddressFilters(
|
||||||
"Покажи банковские операции по клиенту Бета за весь период",
|
"Покажи банковские операции по клиенту Бета за весь период",
|
||||||
|
|
@ -467,6 +498,26 @@ describe("address filter extraction for balance drilldown", () => {
|
||||||
expect(result.extracted_filters.period_to).toBe("2020-12-31");
|
expect(result.extracted_filters.period_to).toBe("2020-12-31");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("trims english year tail from contract anchor", () => {
|
||||||
|
const result = extractAddressFilters(
|
||||||
|
"docs by contract 15/24 year 2020",
|
||||||
|
"list_documents_by_contract"
|
||||||
|
);
|
||||||
|
expect(result.extracted_filters.contract).toBe("15/24");
|
||||||
|
expect(result.extracted_filters.period_from).toBe("2020-01-01");
|
||||||
|
expect(result.extracted_filters.period_to).toBe("2020-12-31");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("trims trailing separated year from contract anchor", () => {
|
||||||
|
const result = extractAddressFilters(
|
||||||
|
"docs by contract 15/24 2020",
|
||||||
|
"list_documents_by_contract"
|
||||||
|
);
|
||||||
|
expect(result.extracted_filters.contract).toBe("15/24");
|
||||||
|
expect(result.extracted_filters.period_from).toBe("2020-01-01");
|
||||||
|
expect(result.extracted_filters.period_to).toBe("2020-12-31");
|
||||||
|
});
|
||||||
|
|
||||||
it("extracts multiline year range period from phrase", () => {
|
it("extracts multiline year range period from phrase", () => {
|
||||||
const result = extractAddressFilters(
|
const result = extractAddressFilters(
|
||||||
"Какие документы по СВК за 2000 - 2025\n год?",
|
"Какие документы по СВК за 2000 - 2025\n год?",
|
||||||
|
|
@ -514,6 +565,18 @@ describe("address query limited taxonomy and stage diagnostics", () => {
|
||||||
expect(result?.debug.mcp_call_status).toBe("skipped");
|
expect(result?.debug.mcp_call_status).toBe("skipped");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("does not return fallback factual rows for unmatched open-items contract anchor", async () => {
|
||||||
|
const service = new AddressQueryService();
|
||||||
|
const result = await service.tryHandle("Покажи открытые позиции по договору 15/24");
|
||||||
|
expect(result?.handled).toBe(true);
|
||||||
|
expect(result?.response_type).toBe("LIMITED_WITH_REASON");
|
||||||
|
expect(result?.reply_type).toBe("partial_coverage");
|
||||||
|
expect(result?.debug.detected_intent).toBe("open_items_by_counterparty_or_contract");
|
||||||
|
expect(result?.debug.rows_matched).toBe(0);
|
||||||
|
expect(["empty_match", "missing_anchor"]).toContain(result?.debug.limited_reason_category);
|
||||||
|
expect(String(result?.assistant_reply ?? "")).not.toContain("Собраны открытые позиции");
|
||||||
|
});
|
||||||
|
|
||||||
it("routes contract document list intent into address recipe", async () => {
|
it("routes contract document list intent into address recipe", async () => {
|
||||||
const service = new AddressQueryService();
|
const service = new AddressQueryService();
|
||||||
const result = await service.tryHandle("show documents by contract 15/24");
|
const result = await service.tryHandle("show documents by contract 15/24");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue