Files
group_fqcd_jr/docs/evidence/20260919-t4c-f3-subject-gate.json
张胜宇 5d0becb67d 客服 Agent 重构收口:五出口决策链 + 知识库档位隔离 + 前端入参边界(答辩演示版本)
一、客服 Agent 智能增强(正面回应"不智能、动不动就转人工")
- 决策链由 2 个出口扩到 5 个:E1 澄清 / E2 计算型 / E3 知识直返 / E4 证据约束生成 / E5 分级回退
- 转人工从"默认动作"降为最后一档 E5c,只保留 4 类白名单:
  P0 反诈 / P1 账户与个人数据 / P2 写操作与争议 / 用户明确要求人工
- 46 条金标实测(修复前 → 修复后):
  转人工率 43.5% → 10.9%;出口准确率 45.7% → 100%;事实正确率 69.6% → 100%
  禁忌违反 1 → 0;档位越权 / 无出处数字 / 误拒 四项零容忍全 0
- 安全不变量 INV-1~INV-5;零容忍规则未删,改的是挂载点
  (输出侧字面黑名单 → 检索层档位隔离 + 判定层合规词表 + 输出守护)

二、知识库:档位单点化与物理隔离
- 新增 app/core/knowledge_tier.py 作为档位规则唯一落点(G-03),
  knowledge_contracts.py 原定义块改为显式再导出(X as X,非副本)
- 档位过滤由 bool 默认值(fail-open)改为 tiers 必填集合(缺参即 TypeError)
- Milvus 侧四集合按 visibility 分区键物理隔离;双 schema 收敛为一套
- 新增 app/core/actor.py:访客三元组与匿名判定的唯一构造/判定点(G-01/G-01b)
- 新增 app/core/fund_fee_rules.py:费率计算纯函数

三、前端入参边界对齐(本轮 W11 新修,4 处"校验宽于存储")
- message 加 max_length=8000(与浮窗 widget.js 的 maxlength 一致)
- session_id 加 1—64;idempotency_key 上限 128 → 64(对齐列宽 String(64))
- feedback_type 加 max_length=32(对齐列宽 String(32))
- 8 条路径参数补 min_length=1 + max_length=64 + 字符集正则
  ({session_id} / {run_id} / {handover_id})
- 改前超限值会落到 MySQL 才失败(500);改后一律 422 AGENT_INPUT_INVALID + 字段级定位
- 新增 tests/unit/api/test_frontend_boundaries.py(33 例),含"端点表 ↔ OpenAPI 全量对照"

四、投顾模块整体清除(D4.4 / D4.5)
- 删除投顾相关 controller / schema / model / repository / service 及门户页面
- tools/portal_api_check.py 同步作废 AD003/AD005/AD011/A047 四条用例与 advisor_t 登录
  (端点与账号均已不存在,此前稳定报 3 条假红)

五、验证(提交前实测)
- pytest -q:1856 passed / 2 skipped / 0 failed
- ruff check app tools tests:19(= 基线);mypy app:2(= 基线)
- 前端接口契约体检 portal_api_check.py:38 项,通过 34,失败 0,跳过 4
- 全链路冒烟 e2e_smoke_test.py --read-only:31/31
- HTTP 全链路探针 http_probe.py:11/11 succeeded
- 跨文档一致性 _consistency.py:GATE PASS
- 真机边界复验 12 条:12/12 符合预期

六、纪律与文档
- 可改文件白名单 A-09(docs/46)与底座会签申请单 A-10(docs/47,组 1—组 4 全部受理)
- 零 DDL:未新增/修改任何表结构,89 张业务表与基线一致
- 证据留痕:docs/evidence/**(含 46 条金标 score、快照、清除与重建记录)
- 未提交(刻意排除,见提交说明):仓库内 客服agent/ 与 开发文档/ 是 2026-09-16 前的
  过期副本(Todolist 440 行 vs 权威 D2.1 1167 行),权威正本在仓库外;
  _chunks_report.txt 是 tools/build_knowledge_chunks.py 生成的本地产物
2026-09-20 14:33:30 +08:00

112 lines
5.5 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"evidence_id": "20260919-t4c-f3-subject-gate",
"generated_at": "2026-09-19T15:32:00.307942+08:00",
"session": "D1.6 §4.28 / D2.1 v6.15",
"what": "F-3「E3/E4 主体相关性闸门」落地后的真实复验:问句点名受控主题词、而命中的块一块都没提到它时,不再直返原文 / 不再合并生成,改为 E5b 如实说明(不建单、零模型调用)。",
"how": "进程内真实链路(get_agent_factory → resolve_config → classify_intent → handle;真实 Milvus 三集合 + 嵌入端点 + DeepSeek);用例来自 D3.7 §2。",
"code_points": [
"app/service/agent/implementations/customer_service.py: EVIDENCE_SUBJECT_TERMS(27 个受控主题词)",
"同文件 _subject_terms_in / _subject_covered_by / _exit_subject_miss(SUBJECT_MISS_TEMPLATE,不建单)",
"同文件 _answer_from_knowledge:闸门插在 _evidence_pack 与置信判定之前"
],
"verification": {
"B-04": {
"message": "南方基金投顾服务起点是多少?",
"before": {
"exits": [
"E3"
],
"text": "### 1.1 南方现金添利货币市场基金〔示例〕\n\n| 项目 | 详情 |\n|------|------|\n| 产品代码 | 900501(示例代码) |\n| 基金类型 | 货币市场基金 |\n| 风险等级 | R1(低风险) |\n| 成立日期 | 2016-04-18 |\n| 起投金额 | 1 元 |\n| 基金经理 | 沈明(虚构) |\n| 基金规模 | 约 1,280 亿元(截至 2026-06"
},
"after": {
"exits": [
"E5b-subject"
],
"model_calls": 0,
"text": "关于「投顾服务」这一点,我在您当前可见的资料里没有找到对应内容,也不想用相近的条款替您作答。\n您可以换个说法再问我一次;如果这项内容需要登录后才能查询,登录后我再为您核对,也可以拨打客服热线 400-889-8899(每日 7:00—22:00)咨询。"
},
"verdict": "修复前 E4 按同章节合并接管,答成某只混合基金的整段产品参数;修复后闸门拦下 → E5b 引导登录,模型零调用,未泄露 registered 数值。"
},
"regressions": {
"B-01": {
"expected_exits": [
"E3",
"E4"
],
"after_exits": [
"E3"
],
"after_text": "南方现金添利货币市场基金〔示例〕:起投金额 1 元"
},
"B-02": {
"expected_exits": [
"E3",
"E4"
],
"after_exits": [
"E5b"
],
"after_text": "这个问题我暂时只能提供以下公开资料供您参考:\n\n### 6.1 公募基金费率总表\n\n| 费用类型 | 货币基金 | 纯债基金 | 混合基金 | 股票基金 | QDII 基金 |\n|----------|----------|----------|----------|----------|----------|\n| 申购费率(原费率) | 0 | 0.80% | 1.50% | 1.50% | 1"
},
"C-01": {
"expected_exits": [
"E4"
],
"after_exits": [
"E4"
],
"after_text": "南方基金高净值客户按资产层级分为四档,各层级权益如下:\n\n【金卡客户(50万+)】\n金融服务:专属客户经理服务;每月1次资产配置报告;优先参与新发基金认购;基金转换费优惠(同一管理人旗下基金转换仅补差);「南方基金·智能服务系统」客户端资产视图。\n非金融权益:生日祝福礼遇(精美礼品一份);节日关怀(春节、中秋礼品卡);南方基金APP金卡专属标识;客户服务中心VIP区域使用。\n\n【白金客户(200万"
},
"C-02": {
"expected_exits": [
"E4"
],
"after_exits": [
"E4"
],
"after_text": "升级规则为:连续 3 个月日均资产达到上一层级标准,自动升级。各层级可投资资产门槛为:金卡(财富客户)50 万—200 万元;白金(高端财富客户)200 万—600 万元;钻石(超高净值客户)600 万—1,000 万元;尊享(尊享客户)1,000 万元以上。"
},
"C-04": {
"expected_exits": [
"E4"
],
"after_exits": [
"E4"
],
"after_text": "根据适当性匹配规则:C1 保守型客户可购买 R1—R2,不得推荐 R3 及以上;C5 激进型客户可购买 R1—R5。"
},
"D-01": {
"expected_exits": [
"E2"
],
"after_exits": [
"E2a"
],
"after_text": "股票基金:公开申购费率区间为 0.15%—1.5%。\n申购费算法:申购费 = 申购金额 × 申购费率(各销售渠道的费率优惠不同,最终以产品说明书与销售机构公示为准)。\n按您提到的 100,000 元估算,申购费大致在 150 元—1,500 元之间。"
},
"D-02": {
"expected_exits": [
"E2"
],
"after_exits": [
"E2a"
],
"after_text": "混合基金:按您提到的持有 20 天,对应档位「7—30 天」,赎回费率为 0.75%。\n\n公开档位如下:\n- 持有<7 天:1.5%\n- 持有 7—30 天:0.75%\n- 持有 30—365 天:0.5%\n- 持有 1—2 年:0.25%\n- 持有>2 年:0%\n赎回费算法:赎回费 = 赎回金额 × 赎回费率。"
},
"D-05": {
"expected_exits": [
"E3"
],
"after_exits": [
"E4"
],
"after_text": "根据【证据】,南方基金客服热线为 400-889-8899,服务时间为每日 7:00—22:00,您可在该时段内拨打联系。"
}
},
"gate_not_enabled_cases": [
"C-02「资产到多少能升级?」:主题词为空 → 闸门不启用,行为与改造前一致(单测钉死)",
"C-04「C1 客户能买什么?C5 呢?」:主题词为空 → 闸门不启用(单测钉死)"
]
},
"unit_tests": "tests/unit/service/test_customer_service_agent.py 75 passed(F-3 新增 4 条)"
}