feat(W20): 新增 E2c-my 出口 + 展示层净化 + P2 自助流程豁免(金标零回归)

用户口径:既智能又安全,不靠"答不上就转人工";按本人画像测评列出可购买的产品,
但不引导购买。

出口由五个扩为六个:
- 新增 E2c-my:按客户本人权威测评等级给出可购买范围 + 在售清单
  (只列代码/名称/类别/风险等级,按代码升序;出口后置引导词护栏,命中即降级为仅范围)
- 点名档位(「我可以买 R3 的产品吗」)先给一句直接裁决再列范围
  —— 修复前只给清单,"不"字始终没说出来
- 新工具 query_eligible_products(suitability:read)+ 发布 release 220

真实业务缺陷:
- P2_SELF_SERVICE_PATTERNS:问「怎么修改绑定的银行卡」不再建单转人工(FAQ 里就有答案);
  「帮我把绑定银行卡换一下」仍走 P2
- 展示层净化 render_plain / drop_yield_claims / prettify_title 接在 E3/E4/E5b/澄清四处
  (E4 模型会照抄证据包的 markdown 标记)
- 空结果护栏:语料里 15 个纯收益切片被净化清空时回退 E5b,不给空气泡

测试:定向 334 passed;全量回归 1969 passed / 3 skipped / 0 failed(基线 1946);
46 条金标 M-1 46/46=100%、M-4 100%、M-6 5/46=10.9%、M-7~M-10 全 0 —— 与
score_w11b 逐项一致(零回归)。

落档:D1.6 §4.49 / D2.1 v6.36 / D1.1 §30
This commit is contained in:
张胜宇
2026-09-20 18:55:22 +08:00
parent dc83f4f4a7
commit 35effab70f
10 changed files with 1537 additions and 27 deletions
+15 -1
View File
@@ -69,7 +69,12 @@ from app.service.risk_tools import (
search_risk_alerts_tool,
)
from app.service.runtime_config_service import load_active_intent_configs
from app.service.suitability_service import SuitabilityToolInput, suitability_tool_handler
from app.service.suitability_service import (
EligibleProductQuery,
SuitabilityToolInput,
query_eligible_products_tool,
suitability_tool_handler,
)
from app.service.tool_executor import ToolDefinition, ToolExecutor, ToolRegistry
logger = logging.getLogger(__name__)
@@ -284,6 +289,15 @@ def get_agent_factory() -> AgentFactory:
required_permission="suitability:read",
allowed_roles=("customer", "advisor", "operator", "admin"),
))
registry.register(ToolDefinition(
name="query_eligible_products",
input_model=EligibleProductQuery,
handler=cast(Any, query_eligible_products_tool),
# 复用适当性权限码:这份清单本身就是「按等级匹配」的结果,与 `check_suitability`
# 同权、同数据源(`fin_risk_assessment` + `fin_product`),不新开权限面。
required_permission="suitability:read",
allowed_roles=("customer", "advisor", "operator", "admin"),
))
registry.register(ToolDefinition(
name="query_fund_quote",
input_model=FundQuoteQuery,