99f51e7703
审查(With fixes)四项:
- Important-1: LONG_NUMBER_RE {9,17}→{8,17}——旧量词最小匹配 11 字符,
纯 10 位号(沙特裸号 0501234567,CC 模板范例市场本体)穿透。实测钉死
行为边界: 逗号不在字符类,"50,000,000" 千分位形态仍放行(与
"45,000 km" 同机制,审查预估会命中系漏算逗号);空格分隔 ≥10 位命中;
DN110/5000m/VIN 规格形态全放行
- Important-2: CC 触发轮回显被零号码墙拦下时(violation==no_contact),
closing 改用 CC 模板句而非 NO_CONTACT_ALREADY——GLM 有 3/3 回显倾向,
客户该收到追问而非"稍后联系"虚假承诺;价格墙路径不变。设计文档 §2
补记该裁决
- Minor-4: breach_rate.py 补号码回显(≥10位,与墙同形)与邮箱回显两条
观测模式,补上漏放观测盲区
- Minor-5: violated 收尾与已流出前缀之间补空格分隔("...xxxx? Got it —"),
空格随 closing 一起流出,客户所见与落库一致;CC/触发轮缓冲未流出,
emitted 恒空天然不受影响
测试 256 passed(253+3)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
4.3 KiB
4.3 KiB
设计增补:CC 追问输出侧强制 + 回显豁免收窄(墙层)
- 日期:2026-10-08(场景①三轮提示词迭代 0/8 后的需求方决策)
- 前置:2026-10-08-dual-contact-and-country-code-design.md(本增补修改其实现层)
1. 背景与决策
场景①(裸号→国家代码追问)经三轮提示词层修复(共改 system.md 5 处 + reminder 3 处
- 让位唯一锚点 + 禁数字回显),真实 GLM 验收核心断言累计 0/8。行为分析结论: GLM 对顺对话惯性的指令全部服从、对反惯性的 CC 重发追问结构性无视—— 这是层级问题不是措辞问题。
决策(需求方已确认):沿用本项目"prompt 教行为,墙保底线"的既有 doctrine (价格墙同款演进路径),把 CC 追问升级为输出侧确定性强制;同步收窄零号码墙的 客户回显豁免(该豁免与"不回显"红线矛盾,GLM 稳定利用它回显号码 3/3)。
2. 规则一:CC 强制墙
- 触发:本轮
_contact_completion_note返回["_cc_asked"](裸号在场且未问过) ——conversation.py 流程已有该判定(completion_marks) - 检测:本轮完整 AI 回复不含
country code(大小写不敏感)——含则视为 GLM 已自发服从,不干预 - 动作:不含 → 整段替换为 CC 模板句(英文正文 "Got it — Could you send the
full number with the country code, like +966 5x xxx xxxx? Just so our manager
can reach you directly.",中文同
_CC_NOTE_ZH正文),走既有 violated 替换 机制(logger.warning 留痕) - 回显冲突裁决(2026-10-08 审查修复补记):触发轮若零号码墙先拦下回显句 (violation=="no_contact"),替换句改用 CC 模板句而非 NO_CONTACT_ALREADY—— GLM 有 3/3 回显倾向,该路径概率高,客户该收到追问而非"稍后联系"虚假承诺; 价格墙路径(violation=="boundary")维持原替换话术不变
- 计数:
_cc_asked照常写回(一次性语义不变——无论 GLM 是否服从,本轮消耗) - 客户配合重发完整号后:下轮号码带前缀 → CC 墙/note 均不再触发,确认句自然回归
- 客户不理睬:下轮
_cc_asked已消耗 → 墙不再触发(一次性)
3. 规则二:回显豁免收窄(零号码墙)
- 现状:
no_contact_value对 AI 输出中的 ≥10 位数字串/邮箱,若出现在近期 客户消息中则豁免("礼貌回显"设计) - 决策变更:移除 AI 输出侧的回显豁免——红线早已规定"客户自己的号码/ 邮箱也不回显(确认收到即可)",豁免与红线矛盾且被 GLM 稳定利用;AI 输出中 的客户号码只可能来自回显(它不掌握其他号码),拦截无误杀面(规格数字 DN110/5000m 等不构成 ≥10 位连续数字)
- 实现:
no_contact_value的user_history豁免参数停用(保留签名兼容或 移除参数+清理调用点,以最小改动为准);替换句走 NO_CONTACT_* 既有分支 - 测试影响:既有回显豁免测试(含阿语回显一致性)按新语义更新为"AI 输出 客户号码一律拦"
4. 不变项
- 提示词层全部保留(三层话术/提醒/禁令——墙只是兜底,GLM 自发服从时零干预)
- 串行优先级/一次性计数/推送过滤/墙渠道精确化均不变
- 价格墙/零号码墙其余行为不变
5. 测试策略
- CC 墙单测:触发轮回复不含 "country code" → 替换为模板句;含 → 原样; 非触发轮(带前缀号/_cc_asked 已耗/双渠道齐)→ 不干预
- 回显收窄单测:AI 输出含客户裸号/完整号/邮箱(无论客户消息是否有)→ 拦截; 规格数字形态 → 放行
- 集成:CC 触发轮 + FakeAI 输出纯确认句 → 最终流出为 CC 模板句且
_cc_asked落库 - 第四轮生产验收:场景①三断言(CC 句必出/零数字回显/一次性)+ 场景②③复验不回归
6. 风险
| 风险 | 等级 | 缓解 |
|---|---|---|
| CC 替换句与客户上下文衔接生硬 | 低 | 模板句自带 "Got it —" 开头;观察期收集反馈 |
| 回显收窄误杀合法场景 | 低 | AI 输出无其他号码来源;规格数字形态已验证安全 |
| 邮箱回显也被拦后确认句变短 | 低 | 符合红线设计(确认收到即可) |