Files
group_fqcd_jr/docs/evidence/20260918-t2d-c05-and-brand-face.json
T
张胜宇 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

119 lines
5.7 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"artifact": "t2d-c05-and-brand-face",
"generated_at": "2026-09-18T11:42:37.194938+00:00",
"date_local": "2026-09-18",
"purpose": "按用户 2026-09-18「按照你建议的来」执行两项决议:① C-05 三类词落地(甲案:改种子脚本);② 乙-26 品牌面提前执行",
"decisions_taken": [
{
"id": "C-05-落点",
"chosen": "甲案",
"rationale": "改 tools/seed_compliance_baseline.py 追加数据行:单点可复现、与 D-b 同源、verify() 自动复查;DoD 的「不改任何 .py」登记为「不改 app/** 与底座 .py」"
},
{
"id": "乙-26-提前",
"chosen": "提前执行",
"rationale": "前端与风控自述是评审肉眼可见的品牌面;D1.4 §G-02/§G-05 已定位到文件与行"
}
],
"c05": {
"landed_at": "tools/seed_compliance_baseline.py",
"new_constants": [
"EXTRA_NEGATIVE_RULES",
"C05_CATEGORIES",
"ALL_NEGATIVE_RULES",
"REQUIRED_APPLICABLE_AGENT"
],
"rules_added": 14,
"categories": {
"yield_compare": [
"承诺高收益",
"保证高收益",
"比同类收益高",
"收益高于同类",
"跑赢同类"
],
"scarcity": [
"稀缺额度",
"额度有限",
"仅剩",
"优先认购权",
"优先配置权"
],
"fee_misleading": [
"零费率",
"费率最低",
"手续费全免",
"全网最低"
]
},
"hard_constraints": {
"applicable_agents": "全部 25 条均为 [\"customer_service\"](D-a ①),verify() 新增正面断言",
"existing_11_untouched": "既有元组一字未动,追加项独立成 EXTRA_NEGATIVE_RULES(D-a ②)",
"committal_phrases_only": "按承诺性短语收录(D-a ③)"
},
"preflight_false_positive_check": {
"method": "对 knowledge/_chunks.jsonl 逐词计数 + 与 6 条话术比对",
"result": "14 个新词全部 0 命中、0 自绊",
"excluded": {
"X 折优惠": "语料里「1 折优惠」「免申购费」是公司自己的合法费率事实(FAQ「申购和赎回的费率是多少」答案正文),收进来会把费率问答整条拦成转人工",
"高收益/稳健/低风险": "形容词;「高收益伴随高风险」这类风险提示会被一并拦下"
}
},
"seed_rerun": {
"command": ".venv\\Scripts\\python.exe tools\\seed_compliance_baseline.py",
"result": "seeded 25 negative rules(既有 11 + C-05 14),6 reply templates",
"verify_output": "verified: 25 active rules (含 7 个零容忍词), 6 active templates covering 6 scenes",
"verify_added_guards": [
"applicable_agents 必须非空且含 customer_service(空数组 = 治理层失败关闭跳过 = 假成功)",
"C-05 三类词必须齐备(每类至少 1 条 active)"
]
},
"note": "行为验证(输出含「承诺高收益」是否被拦、反例守卫)归 C-06 双向验证"
},
"brand_face": {
"brand_files_replaced": 25,
"occurrences_replaced": 33,
"scope": [
"app/static/portal/**(21 文件:18 index.html 标题 + app-shell.js 导航品牌 + brandmark.svg aria-label + products.js / product-detail.js 的 document.title)",
"app/static/portal/employee-risk/dashboard/index.html(3 处:标题 / h2 自述 / 邮件主题默认值)",
"app/service/agent/implementations/risk_agent.py(3 处:模块说明 / 自述话术 / 系统提示词)",
"app/service/risk_analysis_service.py(SYSTEM_PROMPT)",
"app/worker/risk_scan_scheduler.py(argparse 描述)",
"tools/portal.py(8101 演示门户:推介材料表单默认产品名 → 南方稳健增利债券A;management_company → 南方基金管理股份有限公司)",
"tools/chat_console.py(本地调试页标题与页眉)"
],
"risk_agent_naming": "「南方财富风控智能助手」→「南方基金风控助手」(D1.4 §G-05 指定写法;与 test_portal_frontend 断言的「风控助手」标签一致)",
"residual_sweep": {
"南方财富": 0,
"南方科技": 0,
"15936583816": 0,
"400-XXX-XXXX": 0,
"nanfangwm": 0,
"nanfangtech": 0,
"scope": "app/ tests/ tools/ knowledge/ alembic/",
"note": "旧品牌/旧号码/占位符的**字面**已从代码与语料中清零;留痕留在 docs/**(B-05 验收口径)"
},
"test_fixture_updates": [
"tests/unit/service/test_knowledge_keyword_recall.py:两个标题常量的**前缀品牌**改为「南方基金」(保留「季季盈90天」等被测子串,字面召回断言不受影响)",
"tests/unit/infrastructure/test_milvus_profile_projection.py:脱敏用例的样例手机号换为 13800138000(原值恰为旧客服号码,会让 B-05 的「旧号码 0 命中」门禁误报)"
]
},
"gates": {
"pytest": "2 failed / 1505 passed / 2 skipped(与上一步同数,品牌面与 C-05 未引入新失败)",
"ruff": "22 errors(与 T0 基线同数)",
"mypy": "3 errors(同上)",
"check_authoritative_docs": "checked 50 documents, no number collision",
"audit_schema": "89 business tables passed",
"targeted": "107 passed(合规种子 + 客服规则 + 关键词召回 + 画像脱敏 + 前端壳层)"
},
"open_items": [
"C-06 双向验证未跑(红队 5 条诱导问法 / 反例守卫 / 访客推介边界)",
"E2 计算型出口(H-02)与 E4 证据约束生成(H-03)未实现",
"fin_knowledge_meta / episodes / conversation_message 三处的历史旧号码未清(均不可达,见 t2c 证据)"
],
"docs_writeback": [
"开发文档/D1.6 §4.12",
"客服agent/D2.1 v5.9"
]
}