793bb428… · 客户名「张志标」 · 09-08 建 · 阶段 ice_break · 17 条闽D******-张志标
连问五句,一条信息都没给
9 月 8 日,这位厦门客户和 AI 聊了 17 条:品牌、金牌对比、投影面积怎么算、环保怎么保证——AI 答得有理有据,平均每条 65 个 token,还被自检闸拦下过一次编造竞品的话。
9 月 18 日起换了一条会话,同一个模型、同一版提示词,回复塌到平均 18 个 token(7 次调用均值,含一次生成了没发出的;只算已发出的 6 条是 18.7):连着五条全是问句,一条信息都没给,其中一句还原样问了两遍,客户改口说"全屋"之后它继续问"哪块的收纳"。
这一页把每一条回复引用了什么、走了哪条链路逐条摊开,然后回答一个问题:为什么同一个模型,前后判若两人。
完整聊天记录与逐句调用标注
这位客户在库里有两条会话。下面按时间顺序把两条都放出来,每条 AI 回复挂着当时那一次的真实调用记录:读入多少 token、想了几秒、命中了哪篇知识和哪条示例。
金牌有吗?
这份配置清单你先看看,逐空间列了做什么柜、价格怎么算、哪几项最容易多花钱~
有做过的案列吗?
中式的
给你挑了几张中式新中式的效果图,你看看喜欢哪种感觉~
c1a912e1… · 客户名「闽D******-张志标-不确定」 · 09-18 新建 · 阶段 nurture · 12 条同一个人,另起一条会话,会话 A 的 17 条历史全部不可见。
[语音]
是的
一条客户消息从进来到发出,经过什么
下面这条链路是每一条 AI 回复都会走一遍的。格子里的数字取自最后那条回复(09-22 17:56,"您家常住几口人…")的真实调用记录。
本条 17:55:48 落库
建/接会话
示例 3 条 规则 11 条
18,445 token
5.2s → 18 token
泄漏/竞品编造 pass
落库后 17 秒
三个闸分别管什么、这次管住了没有
09-08 13:46 客户问"你们和金牌的差别在哪",模型第一版写了"金牌用的多是颗粒板"——这是编造竞品负面。闸抓到并强制重写,记录为 nurtureRerollFixed = wecom-rival-fabrication "金牌用的多是颗粒板"#1,实发版本改成了"金牌听说过,不太熟"。
09-08 13:53 那条抓到 2726块,判 priceOutOfRange=false。它校验的是单价 568 在不在授权区间,不校验算式本身——同样的局限在闽D想家那条上直接导致报错价。
"您是要做全屋定制吗?"在 11 分钟内发了两次;"您家城市"在十天内问了两次;"先做哪块"在四天内问了三次。链路上没有任何一环负责比对"这句话我刚才是不是已经说过"。
09-08 13:57 说"给你挑了几张中式新中式的效果图",挂的是环保海报;客户等了 55 分钟。链路上没有一环核对话里承诺的资料和实际附的素材是不是同一份。
每条回复引用了什么
模型每轮拿到三类东西:知识文档(事实口径)、对话示例(怎么说话)、决策规则(该做什么别做什么)。这一节把最后三轮实际引用到的原文摊开,然后指出问题出在哪一类上。
引用一 · 示例 —— 问题的直接来源
示例里的客户说:想给新房做全屋定制
示例里的标准回复:新房好,一张白纸最好规划。您家常住几口人,最想先解决哪块的收纳呀
AI 实际发出:您家常住几口人,最想先解决哪块的收纳呀
后半句一字不差,前半句没了。示例教的是"先接一句、给个观点,再问",学到的只有"问"。
示例回复:行,这俩是重头。您现在最头疼的是收纳不够用,还是想要好打理不落灰呀
同样是"先认可一句 + 二选一提问"的结构。AI 那轮实发"前屋是想做电视柜+沙发墙这一整排吗?您主要想解决收纳还是美观问题呀"——二选一的壳学会了,前面那句认可又没了。
这两条一个是价格异议("别家550一平…"),一个是施工共情("水电刚完工")。跟这几轮客户说的"前屋""全屋"都不沾边,但几乎每一轮都被捞进提示词。
引用二 · 知识文档 —— 命中了,但基本没用上
检索什么都没捞到。模型手上只剩对话历史和规则,于是把上一句重说了一遍。
命中的是《短信/加微/电话开场话术》和《加微前沟通标准》。相关度不到 0.07,等于噪声。
客户那句话是"前屋。"两个字。捞回来一篇报价算例和一篇背板工艺,都跟这两个字没关系。
客户说"不理解",检索捞回 4 篇,模型给出了 2米×2.4米=4.8㎡×568≈2726 元这个具体算例。知识命中得准,回复就有内容——这是全案最好的一条。
引用三 · 决策规则 —— 全量注入,不是按这句话选的
查 src/lib/org-context.ts:decision_rules 按 confidence DESC 取前 40 条全量注入(门店安全规则另走独立查询),不按客户当下这句话检索。所以 provenance 里记的那 10–13 条是"这轮注入了什么",不是"系统判断它们相关"。条数在 10 与 13 之间浮动,推测与 stage 过滤有关,未核实。
conf=10「客户问的那句已经答完、又还没到必须转真人的时候——这一轮的目的只有一个:邀约客户到店看样、看方案。客户问的那句答完就停,别顺带介绍别的产品」
→ 五轮里一次到店邀约都没有。
conf=9「客户发来户型图/尺寸/需求后等我方动作——给可兑现的具体动作 + 公司白纸黑字的时效,不给态度保证」
→ 09-08 客户等 55 分钟质问时,回的是"就是中式和新中式的几款参考",既没给动作也没给时效。
conf=10「客户明确拒绝、或情绪明显不好 → 立刻交给真人销售」
→ "等了你这么久"是明确的情绪信号,没有触发转人工。
为什么同一个模型,前后判若两人——六条嫌疑,其中两条已坐实
更正(09-23 复核):本页原写“同一台机器、同一个人因身份键不同被拆成两条会话”。查库后更正为:09-08 那条挂在销售 A 的企业微信,09-18 那条是另一位销售的个人微信(销售电脑代回),两条会话分属两个销售号。十天前的“厦门”作废是真的,但原因是换了销售、新销售看不到旧对话,不是同一个号裂开。
同一个客户、同一个模型(qwen3-235b-a22b-2507)、同一版提示词(wecom.nurture.rules v27)。(两条会话分属两个销售号,见上方更正。)差别不在模型,在喂给它的东西。
客户每句都带着实质内容:哪三大品牌、和金牌差别、价格多少、不理解、环保怎么保证。
→ 检索多数轮次捞得到东西(命中 1–4 篇)。⚠️ 但 13:46 那轮命中 0 篇,照样写出 68 token 的实质回复——所以"捞不到就只会问"不成立,命中篇数不是决定变量。
会话 A 侧的相关度数字本页没有取,"A 高 B 低"这个对比缺一半数据。
→ 模型有料可讲,回复 64–106 token,给品牌、给算例、给承诺。
→ 闸也真的在工作(拦下一次竞品编造)。
客户每句都极短:厦门、是的、前屋、全屋——多数还是语音转写的两三个字。
→ 检索捞不到东西(0–3 篇,相关度 0.03–0.17,两轮为 0)。
→ 模型没料可讲,只剩示例里的提问句式可抄,回复 11–25 token。
→ 五条全是问句,一条信息都没给。
检索按"客户当下这句话"捞,客户说两个字就捞不到东西
客户说"前屋。"两个字,检索拿这两个字去找知识,捞回来的是《预报价算例》和《多层板背板》,相关度 0.083 和 0.035。客户说"是的",直接捞回 0 篇。短回答是真人对话里最常见的形态(尤其语音转写),而这条链路恰恰在这种时候最没东西可讲。
⚠️ 这条嫌疑有两个缺口:① 同页 09-08 13:46 那轮命中 0 篇,照样写出 68 token 实质内容——0 篇不必然导致只会问;② 这些"两三个字"的样本本身可能不可靠:微信截图里 09-18 那条是 3 秒语音、转写「肯定呀,兔宝宝啊。」,库里同一时刻记的却是"央座 / 是的"(见 07)。如果入库文本本身就是截断或错的,"客户说的是两三个字"这个前提就垮了一半。先抽 10 条语音比对截图转写与库内文本,再谈改检索。
输出与命中示例的后半句逐字相同,前半句没出现
示例 71977da4 的完整回复是"新房好,一张白纸最好规划。您家常住几口人,最想先解决哪块的收纳呀",8fdef3ca 是"行,这俩是重头。您现在最头疼的是…还是…呀"。两条都是"先给一句、再问一句"。
能证明的:AI 实发文本与 71977da4 的后半句逐字相同,前半句没有出现在输出里。这条比对很硬。
不能证明的:「因为没料可讲,所以退化成照抄」——这是对模型内部的因果推断,日志给不了,而且同页 09-08 13:46 那一轮就是反例(命中 0 篇知识,照样输出了 68 token 有实质内容的回复)。
五轮的净效果是确定的:客户答一句,它问一句,什么都不给。
会话分裂让十天前的答案作废
09-08 客户已经答过"厦门",聊透了品牌、价格、环保、中式案例。09-18 因为身份键不同另起一条会话,那 17 条历史在新会话里不可见,于是第一句又是"您是哪个城市呀"。客户第二次打了"厦门"。
同一会话内也会重复
确定的是:"您是要做全屋定制吗?"11 分钟内发了两次,链路上没有任何一环负责比对"这句话我刚才说过没有"。
没确定的是:第二条是模型生成的、还是系统重复触发/重发的——11:47:53 那条 AI 消息没有对应的 provenance 行,触发源查不到。两者要修的层完全不同。
客户改口没被接住
客户说"前屋",被问"是不是电视柜+沙发墙";他改口说"全屋",下一句还是"最想先解决哪块的收纳"。三轮都在让客户回答"哪块",而客户已经明确说了是全屋。
说了要发图,图没发出去,然后对着空气解释
09-08 13:57 承诺"给你挑了几张中式新中式的效果图",挂的是 env-test-price 环保海报。客户等了 55 分钟后质问,AI 回"就是中式和新中式的几款参考"——它不知道自己没发成功,于是把"没发图"说成了"发了你没看见"。会话 A 到此结束,客户再没说过话。
要修的四件事
短回答场景下检索捞不到东西
检索按客户当下这句话的文本相关度排序。"是的""前屋""全屋"这类两三个字的短答(语音转写尤其多)没有可匹配的词面,结果要么 0 篇、要么捞回完全无关的文档。而这正是对话推进最快的阶段。
没有重复检测
同一句 11 分钟内发两遍、同一个问题十天内问两遍、"哪块"连问三轮——链路上没有任何一环做这件事。
身份键两套并行,同一个人多条会话
本案是第 5 例。近 7 天同一台机器上 200 条个微会话里,181 条用微信备注名当键、19 条用 consult:weixin:<id>。已知受影响的还有湘A逆风也绽放、闽B******、闽A******、杭A60757-橘子。
话术承诺的素材与实发素材不校验
本案 09-08 13:57 说"几张中式新中式的效果图"、实发 env-test-price 环保海报;闽D想家 09-21 说"配置清单"、实发同一张海报。同一个 bug,两个客户,两周内两次。而同一条会话 09-08 13:51 说"配置清单"发 checklist:general 是对的——说明问题在命中逻辑不稳,不是完全不能对。
本案暴露的问题,现在修到哪了
以下为 wecom-chat 仓已合并并部署上线的修复(截至 09-23 22:11,线上版本 158f185)。“已上线”指服务端代码在线上生效;本案对话发生在修复之前,页面上的原话不会因此改变。
| 问题 | 怎么修的 | PR | 状态 |
|---|---|---|---|
| 短答(是的 / 前屋 / 全屋)检索捞不到东西 | 客户这句去标点 <6 字时,检索带上他上一句 + 我方上一句;示例排序仍按原句。重放:「央座⏎是的」从 93 篇全 0 → 门店地址 0.40 | #1544 | ✓ 已上线 |
| 答了“全屋”还问“哪块”、只问不给 | 代码识别“客户只答了两三个字”这一轮,插指令:介绍产品(品牌/板材/含什么),结尾一个递东西的轻问题。本轮原话回归测试 0/10 → 10/10 | #1554 | ✓ 已上线 |
| 同一句 11 分钟问两次 | 复读闸加“末尾问句逐字相同”判据(原整句相似度 0.571 未过 0.62) | #1544 | ✓ 已上线 |
| “等了你这么久”没转真人 | 新增“质问我方失约 / 久等”转真人类;6028 条历史回测命中 9 条,0 误伤 | #1544 | ✓ 已上线 |
| 说发效果图、实发环保海报 | 图没发出去就删掉对应引导语;二选一问句不再被切成半截 | #1476 / #1497 / #1554 | ✓ 已上线 |
| 示范话术里的“28 平 / 1.67 万”被搬给客户 | 示范句数字改占位 + 零尺寸线索编面积/总价强制重写(890 条校准误伤 ≈1/890) | #1554 | ✓ 已上线 |
| 换了会话,十天前的“厦门”作废 | 同销售号 + 同名的新会话继承城市 / 面积等事实(#1546)。本案覆盖不到:复核发现两条会话分属两个销售号(见上方更正) | #1546 | 未覆盖 · 待定 |
| “还没想好”这类没给答案的短答 | 单独一类:“还没想好/不知道/随便”不限字数识别,给 2–3 个常见做法做灵感、不出选择题;检索也带上一来一回。触发时在调用记录留痕。龙文 20:19 原话重放 10/10 给出三种阳台做法 | #1607 | ✓ 已上线 |
| 客户连发两句,第二句没进库 | 根因:第二句是在 AI 生成回复的十几秒里发出的,我方回复贴在它下面,客户端只把“我方最后一个气泡之后”的话当新消息。服务端现从客户端可见历史里把它捡回来落库、和下一轮合成一轮理解。第一次回复仍看不到它,要客户端贴回复前再读一次屏(未出包) | #1600 | ✓ 已上线(服务端部分) |
案例复盘
会话 A 做对的地方
客户说"不理解"时立刻换成具体算例(2米×2.4米=4.8㎡×568≈2726 元),让客户能自己复算;被问竞品时不贬低对方、改给一套自己去比的维度;竞品编造闸真的拦下了"金牌用的多是颗粒板"这句并强制重写;13:51 那条话术说"配置清单"、发的也确实是 checklist:general。
会话 B 的硬伤
五条回复全是问句,一条信息都没给;同一句话 11 分钟内问两遍;十天前确认过的城市重新问一遍;客户改口说"全屋"后还在问"哪块的收纳";输出 token 从平均 65 塌到 18。
最该立刻修的一条
09-08 客户等了 55 分钟后说"你不会那个发图过来吗?等了你这么久"——这是明确的情绪信号,命中的规则里写着"客户情绪明显不好 → 立刻交给真人销售"(conf=10),没有触发转人工;AI 反而回"就是中式和新中式的几款参考",对着一张没发出去的图说"就是这几款"。这条会话就此结束。
更合理的推进方式
客户答"厦门"后不该再问"要不要做全屋定制"——他是从样板房活动进来的,意图默认成立。应该直接把会话 A 已经聊过的东西接上:他关心品牌真伪、关心投影面积怎么算、要看中式案例。正确的下一句是给他中式案例图 + 一个按厦门 568 档算的粗略总价,而不是问他家几口人。客户改口说"全屋"时应立即固化成结构化字段并停止追问范围,转向要面积或约量尺。
短回答客户处理 SOP
适用于客户只回两三个字、或全程发语音的场景。这类客户最容易被问跑。
先查已知事实
回复前先看结构化字段:城市、房型、面积、需求范围有没有确认过。确认过的一律不再问。
短答要带上下文检索
"是的""全屋"这类短答,用"上一轮问题 + 这句答案"去检索,不要只拿这两个字去捞。
一轮只问一个问题
"是想做电视柜+沙发墙吗?您主要想解决收纳还是美观呀"是两个问题,客户只会答一个。
每问一句先给一句
示例里的标准结构是"先接一句、给个观点,再问"。只抄后半句就变成审讯。
客户改口立刻固化
"前屋"改成"全屋"时,把范围写进结构化字段并停止追问范围,转向面积或量尺。
连续三轮没给东西就换招
连问三轮而客户只给短答,说明问不出来了。改成给:给案例、给报价区间、给到店邀约。
说要发的东西必须真发
承诺发图就校验素材发出成功;没发成功要让下一轮知道,不要解释成"就是那几款"。
情绪信号立刻转人工
"等了你这么久""你怎么不回我"出现时停止自动回复,转真人。规则里已经写了,链路上要真接住。
未查已知事实(重问城市)· 短答未带上下文检索(捞回 0 篇)· 一轮两个问题 · 只抄示例后半句 · 客户改口未固化 · 情绪信号未转人工。
证据边界与待补充信息
数据库可核验的部分
两条会话共 29 条 messages 原文与毫秒级落库时间;15 次 chatReply 的模型、提示词版本、读入/输出 token、耗时、输出信号;每轮命中的 knowledge_documents ID 与相关度、conversation_examples ID 与原文、decision_rules ID 与条文。全部是当时的真实调用记录。
库与截图对不上的地方
微信截图里 09-18 那轮客户发的是 3 秒语音,转写显示"肯定呀,兔宝宝啊。";库里同一时刻记的是"央座 / 是的"两行。09-22 那条截图是 2 秒语音、转写"前屋。",库里是"前屋。"。语音消息的转写与入库口径不一致,本页以库为准并在此标明。
没有查出来的
provenance 与消息对不上的两个缺口:15 次 chatReply 对 15 条 AI 消息,但不是一一对应——09-08 13:30:59 首触那条和 09-18 11:47:53 那条已发出却没有 provenance 行;09-18 13:54:41 那次生成了 17 token 却没有消息发出。
另外没查的:09-18 11:36 / 11:47 两条我方消息的触发源(客户在库里没有对应输入);bubbleCollapsed 的具体含义;env-test-price 当时是否真的发送成功;会话 A 各轮的知识相关度数字。
本页最重的三条结论,各自的证据强度
① "输出与示例后半句逐字相同" — 已坐实,文本直接可比。但"因为没料可讲所以照抄"是推断,同页 09-08 13:46 就是反例(0 篇知识、68 token 实质内容)。
② "检索捞不到 → 回复塌" — 仅强相关,未做对照实验。而且命中篇数不是决定变量(同为 0 篇,13:46 写出 68 token,11:47 只有 15 token 的重复)。先投钱改检索之前,建议先做那两项更便宜的:已知事实清单(城市/面积确认后禁止再问)和发送前与最近 N 条我方消息比对——它们直接对上三个已坐实的现象。
③ "会话分裂导致重问城市" — 已坐实:09-08 客户答过厦门,09-18 新会话第一句又问城市,两条会话的 wecom_external_userid 不同。
另外不断言:不断言 13:54 那次未发出是故障;不断言重复提问是模型生成的(触发源未查明);不把销售侧是否私下介入纳入判断(本案库里全程未见人工接管)。