49c0e5559c
Co-Authored-By: Claude Code <noreply@anthropic.com>
5.4 KiB
5.4 KiB
改动文档:我方联系方式外发(按钮指路 + 零号码红线)
- 日期:2026-08-20
- 分支:
chany_dev_dev - 状态:117 项测试全绿(基线 106),真实 GLM 冒烟通过(web/App 双来源)
- 实施档案:superpowers/plans/2026-08-20-company-contact-handoff.md(v1 四轮评审后因"站点动态配置"事实推翻重构为 v2,v2 再经四轮评审收敛)
1. 背景与需求
客户主动索要我方联系方式("how can I contact you / 你们的WhatsApp多少")时:web 客户引导点击窗口顶部的 WhatsApp/邮箱按钮;App 客户(无按钮)反向留资由客户经理主动联系。AI 在任何情况下不口头输出号码或邮箱。
修复的隐患:此前 prompt 不含任何我方联系方式——GLM 会编造假号(客户加错号=线索彻底丢失)。
2. 方案演进(v1 → v2,关键决策记录)
| v1(已废弃) | v2(实施) | |
|---|---|---|
| 思路 | .env 全局真值注入 prompt,AI 报号 | AI 永不报号——web 指按钮、App 反向留资 |
| 动态配置难题(每站点 data-* 配不同按钮值) | 需三选一解决(前端上报/域名映射/统一单号) | 自动消失(AI 不报值,与站点配置零冲突) |
| 防幻觉墙 | 真值比对(allowed 集合+国家码尾缀+回显豁免) | 零号码墙:任何 ≥10 位数字串/邮箱一律拦,无值比对 |
| 配置/前端/管道改动 | 配置注入+毒值三入口过滤 | 全部零改动 |
v1 四轮评审仍适用的发现全部继承(提醒前移防早退、独立叠加、互留条件排除 suspect、节奏豁免补索要场景、未提供渠道引导);v2 溶解的复杂度(真值比对/毒值过滤/配置兜底)在档案中注明原因。
3. 三层实现
3.1 prompt 层(system.md)
- 新增"客户索要我方联系方式"话术节:web 指按钮 / App 反向留资 / 互留(每会话一次,已留或疑似留过不加)/ 未提供渠道(微信/Telegram 等)一律引导回 WhatsApp 按钮,绝不编造
- 红线新增:回复中不能出现任何电话号码或邮箱地址——客户自己的号码也不回显
- 节奏豁免触发清单补"索要我方联系方式"
3.2 提醒层(conversation.py)
CONTACT_ASK_TRIGGER_RE(含"你的微信"单数形态)_build_context_reminder加source参数:contact_note 前移到空画像早退之前(首条消息索要也有提醒)、与价格红线提醒独立叠加、按 source 分支- 冒烟实证加固:抽象指令("用 App 话术")GLM 会无视并背 prompt 里更显眼的 web 脚本——提醒必须携带该分支的逐字话术,不让模型自己挑(与预算复述同类失败模式的同款解法)
- 索要率观测日志
Contact-ask reminder fired (source=...)
3.3 零号码墙(boundary_filter.py + 句子门控接线)
no_contact_value(sentence, user_history):≥10 位连续数字串(允许分隔形态)或邮箱 → 拦截;唯一豁免=该串出现在近期客户消息中(客户自己号码的礼貌回显)- 无值比对、无公司值依赖——年份(4位)/里程(逗号断开)/VIN(字母混合)/续航(600km)/电池(85kWh) 天然安全,合法聊车内容零误杀(已验证)
- 替换句按 source 分支(web→按钮指路 / App→反向留资),与价格墙并列检查、同一拦截管道
- 附带收益:任意场景幻觉出的热线号/银行账号/邮箱一律被拦
3.4 evaluator 联动
客户主动索要我方联系方式 = 最强意向信号之一。
4. 文件清单
| 文件 | 动作 |
|---|---|
app/prompts/system.md |
+话术节/+零号码红线/节奏豁免扩展(3 hunks, +15/−1) |
app/services/conversation.py |
触发词表 + 提醒(source 参数/前移/逐字话术)+ 墙接线 |
app/services/boundary_filter.py |
LONG_NUMBER_RE/ANY_EMAIL_RE/no_contact_value/双来源替换句 |
app/prompts/evaluator.md +1 行 |
最强意向信号 |
| 测试两文件 | +11(提醒 5/墙 4/集成 2),106→117 |
前端零改动、无 schema、无新配置。
5. 真机冒烟结果
| 路径 | 结果 |
|---|---|
| web 索要联系方式 | ✅ 按钮指路 + 零号码零邮箱 + 顺带问车型(线索质量) |
| 索要微信(未提供渠道) | ✅ 引导回 WhatsApp,零编造 |
| 双重请求(联系方式+价格同句) | ✅ 指按钮 + 不报价(两提醒叠加共存) |
| 连续索要 ×3 | ✅ 全程合规,无重复骚扰 |
| App 会话索要 | ✅ 加固后 3/3 逐字反向留资话术、零按钮话术(加固前 0/3——抽象指令被无视,逐字话术修复) |
| 正常问车(续航/年份) | ✅ 数字正常回答,零误杀 |
6. 已知限制与残余
| 项 | 处置 |
|---|---|
| 客户坚持要"号码本身" | web:点按钮即加号(wa.me 直达);App:反向留资后客户经理主动联系 |
| 纯字母渠道 ID(微信号)编造 | 零号码墙拦不住字母 ID——prompt"绝不提供未配置渠道"兜底 |
| 客户从按钮链接复制号码回显 | AI 从不报号后主通路消失;极罕见,出现再补毒值 belt |
| GLM 无视抽象指令选错话术分支 | 已用逐字话术注入修复 App 分支;观察期 |
7. 部署与回滚
重启生效(prompt/代码启动加载);无迁移、无配置、无前端;回滚 = revert 单提交。