一、客服 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 生成的本地产物
119 lines
5.7 KiB
JSON
119 lines
5.7 KiB
JSON
{
|
||
"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"
|
||
]
|
||
}
|