自动回复这东西,用对了是省事,用错了是赶客。
我见过一个客户半夜发来询盘,收到一句「我们工作时间是 9 点到 18 点」,第二天再没出现过。今天就把这条线划清楚。
一、自动回复翻车,多半不是技术问题
很多团队上自动回复,思路是「先把所有消息兜住,不让人漏掉」。
听着没毛病。但现实是,客户发消息过来,他要的不是「有人回应」,是「有人解决我的问题」。
你回他一句「已收到,稍后回复」,这句话的价值是零。他甚至会觉得你不专业——我凌晨两点发,你秒回一句机器话,说明你根本没看。
我踩过的第一个坑就是这个。当年设了个关键词自动回复,客户问 MOQ,自动回一段产品介绍。结果一个真客户问「你们 500 件能不能做」,机器人回了一整页产品规格。客户后来跟我说,当时就以为我们不接小单,直接去问别家了。
问题出在哪?机器人只识别了「MOQ」这个词,没识别出对方问的是「能不能做」这个具体诉求。
关键词这条路上还有两个方向的坑,我都撞过。
有一次客户发来 “No rush, not urgent at all”。我们的规则里 urgent 是升级词,这条消息直接被推给了人工。业务员半夜爬起来看,发现客户只是在客气。
反过来更常见:客户问 “How much does the whole set cost”,因为句子里没出现 price 这个词,机器人接了,回了一段产品介绍。两个方向都会翻车——一个是白折腾人,一个是答非所问。
所以我后来加了一条:自动回复只认「命令式的问题」,不认「带情绪的句子」。客户说 “send me the catalog”,这是命令,机器可以接。客户说 “I’m a bit worried about the lead time”,这是情绪,机器闭嘴。
所以自动回复的第一原则不是覆盖得多,而是「知道自己不知道」。识别不了,就别硬答,转给人。
二、这四类场景,交出去没问题
我把实际用下来靠谱的场景列一下,都是低风险、高重复的。
第一类,收到消息的第一时间确认。
客户发来的任何消息,系统先回一个「已收到,X 分钟内回复」。这不是为了回答问题,是为了让客户知道消息送达了。外贸客户最怕的是「你是不是没看到」。
这条确认语我让团队统一成一个格式,别各写各的:
Hi [Name], this is [业务员名字]. I’ve got your message and will reply within [X] hours. If it’s urgent, call me at [号码].
三句话,传递三件事:谁在接、多久回、急事怎么办。客户要的其实就是这三条。
第二类,固定信息的查询。
比如公司地址、工厂参观预约方式、常见认证(CE、RoHS 之类)的说明。这些东西有标准答案,怎么写都不会错。
第三类,营业时间之外的告知。
注意,是告知,不是回答。告诉客户你什么时候在线,以及紧急情况下怎么办。这条必须带上「具体时间」,而不是一句笼统的「工作时间联系」。
第四类,流程性提醒。
比如「样品单已收到,预计 3 个工作日发出」这种,前提是数据是从系统里取的,不是编的。我跑了一段时间,客户体验提升很明显,因为他不用问就知道进度。
这四类的共同点是:答案唯一、不涉及承诺、出错也没损失。
三、这四类场景,交出去就是送客户
反过来,我把不该自动化的场景也列出来。这些送出去,客户就直接没了。
第一类,任何涉及价格的消息。
客户问价,你回一个标准价,这事我犯过。问题是同样的产品,10 件和 1000 件能是一个价吗?客户拿到的价格不对,后面的沟通全乱。
价格必须人来回,至少要人确认一遍数字。
第二类,交期、付款条件、质量承诺。
这三样都是带责任的。机器人说错一句「15 天可交货」,客户截个图来跟你理论,你没法解释。
第三类,客户投诉和抱怨。
这是最典型的一类。客户气冲冲发一段话过来,机器人回一句「感谢您的反馈」,火上浇油。
第四类,已经聊到一半的具体业务问题。
做过一轮沟通、进入细节的客户,他问的每一句话都带着上文的上下文。这种场景机器人基本接不住,硬接就会答非所问。
我的判断标准很简单:只要这句话背后有「钱」或者「责任」,就不能自动回。
这三条路我前后都试过,摆在一起看更清楚。
| 做法 | 消息覆盖 | 主要风险 | 适合什么团队 |
|---|---|---|---|
| 全部人工回 | 客户多的时候会漏 | 夜间和周末没人,客户等到第二天 | 客户量少、客单价高的团队 |
| 人工为主 + 自动确认 | 不漏消息 | 需要人及时接,否则确认语之后就没下文 | 大多数外贸团队 |
| 尽量交给机器 | 看起来全覆盖 | 答错一句就是事故 | 标准品、低客单、纯咨询类目 |
中间那一行是我现在的选择。它说白了就是个折中:机器负责「接住」,人负责「谈成」。
四、兜底机制怎么设计
自动化真正难的地方不是「怎么自动回」,是「什么时候不自动回」。
我现在的兜底设计是三层。
第一层,超时转人工。
客户发消息后,自动回复发出去,然后开始倒计时。超过设定时间没有人接管,就升级:先推给主责业务员,再超时就推给团队群。
这个超时时间我建议别设太长。设 2 小时基本没用,等人发现都凉了。我现在设的是 15 分钟,工作日白天。
超时升级这块,各家工具做得深浅不一样。有些只是弹个提醒,有些能把待接手的会话排成一个列表。我现在跑的是 WADesk 这类带会话聚合的,好处是几个号的未读和待接管会话在一个列表里,不容易漏。但工具只负责把事推到你眼前,接不接得住还是人的事,这点别指望工具。
第二层,关键词升级。
有些词一出现,直接跳过硬答,走人工队列。我把它们分成三组:
- 敏感类:refund、complaint、lawyer、chargeback
- 价格类:price、discount、quotation、MOQ
- 紧急类:urgent、asap、today、deadline
这三组词命中任何一组,机器人都闭嘴,只发一句「我马上让同事跟您对接」,然后立刻推人。
第三层,连续失败熔断。
如果同一个客户连续问了两次,机器人都没接住(比如他重复问了同一个问题),系统必须停掉自动回复,转人工。这一层最少人做,但最重要的。
因为客户重复问,说明他已经在不耐烦了。这时候再来一次机器回复,他就不只是不耐烦了。
五、用一个规则引擎来决定该不该自动回
下面这段脚本是我以前写的简化版本,核心就是上面那三层逻辑。它不负责生成回复内容,只负责判断「机器该不该开口」。
importrefromdatetimeimportdatetime,timedelta# 自动回复分流器# 为什么先做分流再考虑回复内容:# 自动回复翻车九成是「不该开口的时候开口了」,# 所以这个脚本只回答一个问题——这条消息能不能交给机器# 命中这些词,机器一律不接,直接转人工ESCALATE_KEYWORDS={"money":["price","discount","quotation","quote","moq","cost","payment"],"risk":["refund","complaint","lawyer","chargeback","fake","bad quality"],"urgent":["urgent","asap","today","deadline","emergency"],}# 这类场景机器可以直答,答案唯一、不涉及承诺SAFE_TOPICS=["address","catalog","certificate","ce","rohs","working hours"]# 同一客户在窗口内重复提问超过这个次数,熔断,转人工REPEAT_LIMIT=2REPEAT_WINDOW_HOURS=6# 自动确认发给客户之后,多久没人接管就升级HANDOVER_MINUTES=15defclassify(text,history):""" text: 客户这条消息的原文 history: 该客户最近消息列表,元素形如 {"text": str, "time": datetime, "by": "customer"|"bot"} 返回: ("auto" | "human", 原因) """low=(textor"").lower()# 第一层:责任和钱相关的词,机器没有资格回答forgroup,wordsinESCALATE_KEYWORDS.items():hit=[wforwinwordsifwinlow]ifhit:return"human",f"命中{group}组关键词:{','.join(hit)}"# 第二层:客户重复问同一个问题,说明已经不耐烦了# 这里用简单的文本相似(去空格后比对),够用,不必上模型norm=re.sub(r"\s+","",low)since=datetime.now()-timedelta(hours=REPEAT_WINDOW_HOURS)repeats=[mforminhistoryifm["by"]=="customer"andm["time"]>=sinceandre.sub(r"\s+","",m["text"].lower())==norm]iflen(repeats)>=REPEAT_LIMIT:return"human",f"{REPEAT_WINDOW_HOURS}小时内重复提问{len(repeats)+1}次"# 第三层:只有确认在白名单话题里,才允许机器作答ifany(topicinlowfortopicinSAFE_TOPICS):return"auto","标准信息查询"# 兜底:识别不了就不装懂,发确认语并转人工return"human","无匹配规则,交人工"defcheck_handover(pending):""" pending: [{"account": str, "customer": str, "replied_at": datetime}] 找出超过 HANDOVER_MINUTES 还没人接的会话,升级提醒 """deadline=datetime.now()-timedelta(minutes=HANDOVER_MINUTES)# 超时越久越紧急,排前面先推overdue=[pforpinpendingifp["replied_at"]<=deadline]returnsorted(overdue,key=lambdax:x["replied_at"])if__name__=="__main__":demo_history=[{"text":"What is your MOQ?","time":datetime.now()-timedelta(minutes=40),"by":"customer"},]formsgin["Do you have CE certificate?","What is your MOQ?","This is urgent!"]:action,why=classify(msg,demo_history)print(f"{action:5}|{why:28}|{msg}")跑一遍这个 demo,你会看到一个很典型的分布:能自动回的其实很少。这不是脚本写得差,这是现实。
说到底,自动回复的价值不在于替你回多少条,在于替你筛掉那些明显不用人操心的消息,把人的时间省下来给真正需要的客户。
写在最后
今天就做一件事:把你现在设的自动回复规则翻出来,逐条问一句「如果这句话说错了,我要不要赔钱或者道歉」。
答案是「要」的,全部删掉,改成转人工。
剩下的规则,再给它们加一个 15 分钟超时升级。这两步做完,你的自动回复才算是能用的。