方案评审 · 给夏夏

什么时候给客户资料?用什么形式给?

起因是一份「客户问什么就自动发对应资料」的方案,里面有 6 个地方拿不准要人拍板。这一页把真实数据翻出来,把这两件事定下来。

2026-07-13 · 依据:657 条真实客户私信 + 4261 条已发私信 + 全仓代码核验 · 话术改动已上线(PR #865 / 25cd140)

先搞清楚:这方案想干嘛?

他想做一条全自动的流水线,让机器人代替人做这几步:

1客户在抖音私信里说「求个避坑指南」
2机器人听出他要什么 ← 这一层现在没有,是方案要新建的核心
3自动回他一段干货文字(不能发链接,抖音会限流)
4客户觉得有用 → 机器人跟他要微信
5企微加上好友 → 把完整的 PDF 资料发过去

你们已经攒好了 314 份文档、11071 张效果图、27 条话术。方案说:内容都齐了,就差把它自动跑起来。

第 2 步「机器人怎么听出他要什么」,方案的做法是列一张关键词表——客户说到"避坑""防水""合同""报价"这些词,就对上号发对应的资料。这张关键词表,是整个方案的心脏。

我的结论
「用资料换微信」这个打法是对的,别丢。但方案想建的那套系统,解决的不是真正卡住的问题。

我拿你们真实的客户私信跑了一遍,发现: 方案的核心零件(靠关键词认出客户要什么)在真实客户面前基本失灵 它要优化的那一步,几乎没有客户走到 真正卡住我们的,是客户开口要资料时我们的反应——而这个不用建知识库就能改

发现一 · 关键词表在真实客户面前失灵了

因为真实客户一句话平均只有 5 个字

我把你们 657 条真实客户私信翻出来看(剔掉了 71 条测试用的假数据)。真实客户是这么说话的——

手册看看我看看 不是发手册吗加微信吧不是送资料吗? 为啥你不给我发
关键在这儿:他们确实是在要东西,但一个"避坑""防水""合同"这样的关键词都没说。
为什么?因为话题不在客户那句话里,在我们的上一句话里——是我们先在开场白里说"送你一份避坑清单",客户才回一个"要"。
拿关键词去匹配这 5 个字,方向就是反的。

实测:这张表触发了 5 次,没有一次该发资料

用什么方式认客户认出来几条其中真该发资料的
方案的关键词表(话题词 × 索取词)50
系统里已经有的一段判断逻辑44
新表比现有的多认出来的50

那 5 次触发,逐条看是什么人:1 个同行("我是做水电安装的,谢谢你"→ 系统看到"水电"就想发水电攻略);1 个明确说不装了的("暂时还没有改的计划"→ 系统看到"报价"两个字就想发报价表);2 条是脏数据(我们自己的话术被错存成了客户消息,系统认了自己);1 个真有需求的,但他要的是找人来修漏水,不是要一份防水 PDF。

还有个更尴尬的事:系统里本来就有一段逻辑在识别"客户要资料",而且认得比新表准。只是它认出来之后,动作是直接甩一个微信号过去,不发资料
所以新建这张关键词表,等于重造一个更差的轮子

发现二 · 这一步几乎没有客户走到

我按真实私信记录,把整条路重新数了一遍:

我们发出私信的客户3 960 人
回话了的148 人3.7%
开口要资料的 ← 方案服务的就是这批人20 人0.5%
最后加上企微好友的10 人
翻译成大白话:这套要建的东西(三层匹配 + 向量库 + 两张新表 + 企微发文件),伺候的是那 20 个人
就算做到完美无缺,天花板也就是多加十几个微信。投入和产出严重不成比例。

发现三 · "拿资料换微信"这招是对的——但我们执行砸了

先说好消息:资料这个钩子,是真的有用

客户表现人数最后真给了微信/电话转化率
开口要过资料的20315%
没开口要的12065%
开口要资料的人,给微信的概率是不要的 3 倍。所以"用资料换微信"这个打法本身是成立的,资料这个筹码不能随便送出去
但那 20 个人里,17 个走了。问题出在执行,不在打法。

那 17 个人是怎么走的?两个原因

原因一:5 个我们压根没回。客户问「不是送资料吗?」「现在不能发我看看吗?不是说留言就发吗?」——我们沉默

这跟话术怎么写一点关系都没有,是漏接。放大看,156 个客户说过话的会话里,71 个(46%)客户说完我们再没回,其中 37 个就发生在这个月
修这个,比改任何话术都值。

原因二:剩下 12 个,我们回了、也说了理由,人还是走了。

注意——现在的话术已经在说「抖音发不了/图会糊」这个理由了

抖音图压糊了,方便给个 v 让设计师按你家面积发你,你家几室几厅?

照样失败。所以"把理由说清楚"不是缺的那一环——我们已经在说了。

关键:成功的 3 个 vs 失败的 12 个,差别只有一处

成功的(客户下一句就给号):

我已经从系统拉了同户型的配置清单,你家是 120 平左右吧?可以发你一套完整的实拍+…

→ 客户回:「好的!联系方式 13438622988」

失败的:

给个 v 我发你,你家几室几厅? 你是在哪个城市呢?面积多大?我好把清单打包发你
看出来了吗——失败的都在「又抛一个问题回去」。

客户说"手册"的时候,他要的是现在、立刻。你回他一个问题,等于说"你先干点活,我再考虑给你"。他就走了。

成功的那句是已完成态:货已经在我手上了、已经是你家户型的了,就差一个微信。

他要你拍板的 6 件事,逐条给答案

问题 1「主题 × 意图」双命中够不够防误发?还有没有别的误命中模式?
光靠关键词认客户,会不会认错人、把资料发错?
✗ 不是"够不够"的问题——它压根不灵
在真实数据上,它5 次触发全认错,0 次认对。我实测到的认错情况:把同行当客户、把抱怨当索取(他自己也想到了这条)、把明确说不装了的人当成想要报价、还会把我们自己的话术当成客户在提问
该换的不是"再加一道保险",是换个认人的方式——别从客户那 5 个字里抠话题,从我们上一句承诺了什么去推。
问题 2旁路服务 vs 改 llm.ts——旁路真能拿到足够上下文吗?会不会和现有话术打架?
这个新功能挂在哪儿?会不会碰坏现在正常跑的私信回复?
✓ 他的思路对——但挂的位置得选对
他想"另起一条小路,不动主干道",这是对的,而且系统里已经有 4 条一模一样的小路在跑了,照抄就行,完全不用碰高危代码。
位置很讲究:如果挂在云电脑那一端,它只能看到会话列表里那 60 个字的预览,看不到完整对话,等于蒙着眼睛猜。必须挂在服务器那一端。
另外一定会打架:现有那条"客户要资料就甩微信号"的逻辑,管的是同一批客户。两条路必须排好先后,不然会重复发。
问题 3意向分层要微信——强意向直接要微信,会不会太急把人吓跑?阈值怎么定?
客户一露出兴趣就管他要微信,会不会太猴急?
⚠ 问题不在"急不急",在"空不空手"
"要资料"就是最强的意向信号——这类人转化率 15%,是普通人的 3 倍。看到这个信号立刻要微信,一点都不急,就该要。
真正的问题是空着手要:现在的话术是「给个 v 我发你,你家几室几厅?」——又抛个问题回去,客户就走了。
该改的不是时机,是手里有没有东西。先甩一小块真货("你家 113 平三室对吧,同户型那份我已经拉出来了,光柜体投影 78㎡"),同一句话里再要微信。
问题 4抖音风控——自动发中等长度文案(80-110 字)的实际限流风险?现有云电脑通道跑过多大量?
机器人自动发这么长的话,抖音会不会限流封号?
⚠ 这不是新风险——我们早就在这么干了
已经发出去的 4261 条私信:平均 65 个字,其中 20% 就落在 80–110 字这个区间,还有 10% 超过 110 字,最长的一条 2694 字。单日最高发过 168 条,跑了 87 天。而且已经有 43 组一模一样的文案在重复用,号也没事。
但有个他没提到的真风险:自动回复这条腿是一条接一条不停歇地发(首次打招呼那条腿有 20–45 秒的随机间隔,回复这条腿没有)。如果罐头文案真把回复量拉上去,这里会连发,那才危险。
问题 5企微资料交付:发链接 / 发文件 / 都发?(尚未决定,已做成可插拔)
加上企微之后,把资料发成链接还是直接发 PDF 文件
✗ 这道选择题是假的——只有一个选项能选
"发文件"这个功能根本还没做。企微那边目前只能发文字和图片,发 PDF/Excel 一行代码都没有。所以只有"发链接"能选(311 份文档已经有公网链接了,白捡)。
但有两个更严重的坑,方案里没提:
① 抖音拿到微信号 → 企微加好友,这一步是断的。现在只是给运营推个飞书提醒,然后人肉去企微手动搜号加人。可我们的自动话术已经跟客户拍胸脯说了「我们添加您啦,麻烦您点一下通过」——话已经说出去了,管道没接上,全靠人在后面补。
② 企微那边根本不会"主动发消息",只会在发现新好友时打个招呼。方案里"加上好友就自动发资料"这一步,是从零开始建
问题 6向量检索值不值得上?还是词典 + LLM 就够(成本 vs 召回)?
要不要上一套更聪明的 AI 语义搜索,来听懂客户的各种说法?
✗ 别上——但理由不是他说的那个
先纠正他一句:他说数据库里"已经预留好了向量能力,白捡的"——那两行是注释掉的,从来没启用过
不过白捡的东西确实有,只是在别处:这套 AI 语义搜索系统里已经在跑了(而且是默认开着的),只不过只对企微/微信开,抖音私信这边被明确关掉了(为了省钱和延迟)。
但答案还是别上。客户一句话就 5 个字——"要"、"看看"、"手册"。再聪明的语义搜索,也没法从"要"这一个字里搜出他要什么。这是花钱解决一个不存在的问题。

另外:他的方案里有 3 处说错了,而且是拿来当论据的

✗ 1
他说(当成"已核实的硬事实"):现在的知识检索是每个分类只取 1 条,太笨,所以必须新建匹配层。
这个限制在 7 月 10 号就已经删掉了,现在是按客户当下这句话的相关度来排序取的。他这条论据的前提不成立。
✗ 2
他在「抖音风控红线」里写:绝不发我方微信号(现有代码已经是这样了)。
私信回复这条链路上,这句话是反的。实际有 3 个地方会主动把我们的微信号发出去。这条硬规矩只在"第一次打招呼"那条链路上有这是风控红线,写反了——建议让他确认是不是漏看了。
✗ 3
他说:基于 718 条真实私信 提炼;下一步拿真实数据做离线回测。
那 728 条里有 71 条是测试用的假数据("张先生您好呀"那种剧本对话),真实的只有 657 条。更麻烦的是,数据库里我们自己的话术被错存成了客户消息如果不先把数据洗干净,他计划的那个回测跑出来的结果是废的。

结论:什么时候给 · 给什么 · 什么形式

时机
客户一开口要,就立刻回。但给的是「证明」,不是「成品」。
「用资料换微信」这个打法保留——数据证明它有效(要资料的人转化率是 3 倍)。完整的资料不要在抖音发出去,筹码不能丢。

但「立刻回」和「不给成品」不矛盾。现在死掉的 17 个人,不是因为我们给多了,是因为我们什么都没给——要么沉默,要么又抛一个问题回去

正确的做法:给一小块真东西,证明「货已经在我手上、而且是为你家准备的」,然后再要微信。
做法话术长什么样结果
✗ 现在这样
反问 + 要微信
「抖音图压糊,你家几室几厅?给个 v 我发你」 已实测失败
客户要的是现在,你却又给他派了个活
✗ 也别这样
把整份清单文字全发过去
「好的,避坑清单第一条…第八条…」 丢筹码
他拿完就走,没理由给微信了
✓ 这样
已完成态 + 一小块真货 + 要微信
「你家 113 平三室对吧——同户型那份我已经拉出来了,光柜体投影就 78㎡,最容易多花钱的是吊柜层板和五金这两项。整份是带图的表格,抖音发不了文件、发图也会压糊,加个 v 我直接发你。」 待验证
成功的 3 个案例都是这个形状
这一句同时做到了四件事:
证明有货(78㎡、两个具体的坑)→ 他信了,不是敷衍
完整版还在我手上(带图的表格)→ 筹码没丢
说清为什么必须加微信(抖音发不了文件)→ 这不是借口,是平台的硬限制,客户也知道
不再反问 → 这是现在 12 个失败案例的共同死因
形式
加上微信之后,用链接 + 图片。别做发 PDF。
抖音这边:只能发纯文字。发链接会被限流,发文件根本做不到。这正好是我们要微信的正当理由。

企微这边:方案里纠结的"发链接还是发 PDF 文件"——这道选择题是假的,"发文件"功能一行代码都还没有,而且要走的那个通道出口白名单压根没开,写了也发不出去。
形式能不能用说明
发链接 ✓ 白捡,直接用 314 份文档里 311 份已经有公网链接了,文字里塞个网址就行。还能看到谁点了
发图片 ✓ 能力已有 —— 但你们没用 企微早就能发图了。而你们手上有 11071 张效果图 + 120 组知识图集——客户要的"参考图""清单图"本来就是图。只差把图传上公网(现在只传了文档)。
发 PDF 文件 ✗ 别做 要从零建能力 + 改出口白名单。而链接能达到一样的效果,客户在手机上点开还更顺手
先修
但在改话术之前,有两个洞更急
① 5 个客户开口要资料,我们压根没回(放大看是 46% 的会话客户说完没人接,37 个就在这个月)。话术写得再好,没人回也是零。这个先修。

② 抖音拿到微信号 → 企微加好友,这一步是断的。现在只是给运营推个飞书提醒,然后人肉去企微手动搜号加人。而我们的自动话术已经跟客户拍了胸脯:「我们添加您啦,麻烦您点一下通过」。话说出去了,管道没接上。

而且企微那边根本不会"主动发消息"——"加上好友 → 自动把资料发过去"这一步是从零开始建的。这一步不通,前面聊得再好,资料也送不到客户手上。

✅ 已落地 · 2026-07-13 当天上线

PR #865 已合并并部署到生产(commit 25cd140,五端已对齐核实)。以下改动现在就在跑

改动一 · 停掉主动甩号,但保留 4 轮兜底

什么情况以前现在
客户说"要资料"甩我们的号不甩 → 走承接话术
客户怼"这是 AI"甩我们的号不甩 → 要他的号
客户问"能不能上门"甩我们的号不甩 → 要他的号
客户明说"加个微信/怎么加你"甩号✓ 保留,照样甩
聊到第 5 条还没换到联系方式无条件甩号✓ 保留,照样甩(长尾收口)
客户主动给了自己的号"我们添加您啦…"✓ 一字未动

留了开关 AKKE_HARD_GATE_WECHAT=off,以后想回测「不主动甩号是不是转化更高」,一行就能关。

改动二 · 索取型客户的承接话术(四步定死)

客户开口要资料时,必须按这四步回,禁止反问「你家几室几厅」

已完成态 —— "清单我整理好了",不是"我去给你准备"
结合他的评论 + 私信上下文钩一句 —— "九月交房刚好来得及" / "156 平那几页最有用"
  上下文里没有的就跳过,绝不编他家的数字
甩一小块真货 —— 从知识库取一条具体的坑,只给一小块,绝不把整份倒出去
  知识库里没有的宁可不说,绝不编
说清抖音发不了文件 + 要他的微信号

关键是没只写 prompt。光求 LLM"别反问"压不住——因为它是真不知道客户家几室几厅(那 20 个人里 0 个说过)。所以加了一道代码硬闸

客户在要资料 + 草稿里出现"你家几室几厅 / 面积多大 / 什么户型" → 不许自动发,转人工
只拦【反问】不拦【确认】——"你家 113 平三室对吧"(复述已知信息)不会被误伤,有单测锁。

改动三 · 第 5 轮之后才要资料的人,不再被空手甩号

撞车:4 轮兜底是绕开 LLM 直接甩号的。客户要是聊到第 5 轮才开口要资料,原本会收到一个光秃秃的号、他要的东西一个字不提——正是我们刚测出来会赶走人的那句

现在这种情况发的是合并话术:号照样甩(收口没丢),但资料给到位。实际长这样——

张先生,清单我整理好了——柜体按房产证面积逐项拆开标了价(样板房专供 284 一平全包,原价 434:18mm 多层板 + 兔宝宝/莫干山/千年舟 ENF 板 + 悍高五金),最容易多花钱的几项都圈出来了。整份是带图的表格,抖音发不了文件、发图也压糊

加设计师 v:Homedz3791(备注抖音名),他直接发你;你把 v 报给我也行,我让他加你

给了双向出口——他懒得加就报个号,我们去加他。客户没在要资料时(问板材、问价格),还是走原来那条纯甩号模板,一个字没动。

⚠️ 上线后要盯的一件事

转人工的量可能会上来。如果 LLM 还是老想反问户型,那些草稿会全部被闸拦下、堆到人工那儿。

这是故意的——宁可让人接手,也别发一句已被实测证明会赶走客户的话。但要盯 needs_human 的量:堆太多说明 prompt 没压住,得再收

技术细节(给写方案的人看的,附代码位置)

回测口径:657 条真实入站私信 = messagesrole='customer' 全量 728 条,剔除 71 条无 messaging_account_id 绑定的 seed 数据。词典照抄 spec 3.1 原文,索取意图词表按页面「推演 2」的对策实现。

问题 2 插桩点:应挂 src/lib/dm-reply/run.tsprocessAwaitingRow——已有 4 条同形确定性旁路(run.ts:99/172/217/257),能拿到 stage / 完整历史 / 原评论 / 跨会话我方消息。不要挂 poll agent:DOM 捕获只读会话列表预览(约 60 字截断),请求体只有 conversation_id。会打架的是 src/lib/dm-reply/wechat-push.ts_WANT_MATERIAL_RE(已在识别"客户要资料",动作是推号)。新旁路不能抢在"客户主动给号"承接之前。

问题 4 硬闸:罐头必须过 gate.tsMAX_LEN=200(超了转人工,不是截断)+ guardrails.tsmergeToSingleParagraph(换行会被云电脑打成 Enter,一条草稿拆成两个气泡,回执验证必假阴)。零间隔连发在 douyin_dm_autoreply.py:219-243

事实错误对应:① 「每类限 1 条」删于 PR #843 / 225e2e22(2026-07-10),现为相关度排序 llm.ts:345-375。② 主动发号的 3 处:llm.ts:742/744/745(兜底话术)、llm.ts:2362(4 轮硬门)、wechat-push.ts:111(意向推微信);opener 侧的代码级兜底在 llm.ts:3500。③ role 污染样本:会话 5ac33f5a 连续两条 customer,第二条为我方话术。

问题 6 补充:语义重排实现在 src/lib/llm/embed.ts(bge-m3 + 内存 cosine + 进程级 LRU),默认开启(fail-open,LLM_SEMANTIC_RERANK=off 才关),门控 llm.ts:1223 只放行企微 persona / channel==="weixin",抖音 DM 明确不进。DB 侧 pgvector 从未 enable,008_knowledge_base.sql:27,55embedding vector(1536) 是注释。

已落地(PR #865 · commit 25cd140):wechat-push.ts hasWechatPushIntent 拆为 hasExplicitAddIntent / hasMaterialRequestshouldIntentPushWechat 只认前者。② llm.ts hardGateWechatEnabled() 默认 true,AKKE_HARD_GATE_WECHAT=off 可关。③ llm.ts 新增 buildHardGateMaterialHandoffText(176 字 < gate MAX_LEN=200,有单测锁);硬门分支按 isDmMaterialRequest(latestUserMessage) 分流,provenance promptName 区分 hard_gate_r5_material_handoff / _wechat_push。④ gate.ts 新增 asksLayoutBack 硬闸。⑤ isDmMaterialRequest 下沉 llm/signals.ts(llm → dm-reply 是反向依赖,wechat-push 改为转发,避免两处 regex 漂移)。⑥ 顺带修 latestUserMessage TDZ(原定义在硬门之后,硬门分支引用会运行时崩)。tsc 通过,全量 522 测试全绿。

问题 5 补充:企微发文件 0 代码(GUI 侧只有剪贴板发图,kf API 只有 msgtype:"text",且 wecom-proxy 白名单未开 media/upload)。DM 抓到的微信号只写 dm_notify_state + 推 Lark,无任何代码写入加好友队列;活的待加队列只有 enterprise_leads(吃 B 端 xlsx 线索,customer_leads 已退役)。我方承诺话术写死在 wechat-push.ts:128