假期值班客服的「口径卡」:40 行 Python 把口径做成可判定问答
国庆假期最容易被忽略的服务事故,不是咨询量太大,而是没人可问。
一线客服在假期碰到拿不准的问题,平时可以扭头问主管;假期主管在景区,回一句话要两小时。这两小时里客服只能自己估一个答案——估错的部分,攒到节后一起变成差评和退款争议。
解法朴素得不像技术方案:把口径写成一页卡,然后让系统只照这张卡回答。
一、口径卡长什么样
一张卡,七条口径,覆盖假期 70% 以上的重复咨询:
| 口径键 | 内容 |
|---|---|
| 发货 | 10 月 1—3 日正常发货,每天 16:00 截单;4 日起恢复正常 |
| 时效 | 假期物流慢 1—2 天,华东 2 天、华南 3 天、西北 4 天 |
| 退款 | 当日审核,到账以支付渠道为准,通常 1—3 个工作日 |
| 换货 | 假期内登记,10 月 8 日起按顺序处理,3 个工作日完成 |
| 在线时段 | 人工在线调整为每天 10:00—次日 01:00 |
| 升级 | 客户提出投诉、或要求赔偿的,一律转人工主管 |
| 发票 | 假期可开电子发票,纸质发票 10 月 8 日后寄出 |
关键设计只有一条:口径里没有的,系统不许自己答,一律转人。
二、把它写成可判定问答
# -*- coding: utf-8 -*- """假期口径卡 → 可判定问答:命中口径才答,未命中一律转人 用途:验证"AI 只照口径答"能不能把编造率降到 0 """ import re KOUJING = { "发货": "10 月 1—3 日正常发货,每天 16:00 截单;10 月 4 日起恢复正常节奏。", "时效": "假期物流比平时慢 1—2 天,华东 2 天、华南 3 天、西北 4 天,均按假期节奏估算。", "退款": "退款申请当日审核,到账时间以支付渠道为准,通常 1—3 个工作日。", "换货": "换货在假期内登记,10 月 8 日起按登记顺序处理,3 个工作日内完成。", "在线时段": "人工客服在线时间调整为每天 10:00—次日 01:00。", "升级": "客户提出投诉、或要求赔偿的,一律转人工主管处理。", "发票": "发票假期内可开电子发票,纸质发票 10 月 8 日后统一寄出。", } # ⚠️ 顺序即优先级:意图词(退款/换货/升级…)必须排在时间词(多久/时效)之前。 ROUTES = [ ("投诉|找你们领导|太贵了|赔|赔钱", "升级"), ("退款|退钱|什么时候退", "退款"), ("换货|换一个|换个颜色", "换货"), ("发票|开票", "发票"), ("有人吗|几点上班|客服在线|上班时间|几点下班", "在线时段"), ("什么时候发货|几天能到|几天发货|发货时间|发货", "发货"), ("多久到|时效|什么时候能收到|几天能收到", "时效"), ] def answer(q): """命中口径 → 照口径答;未命中 → 转人(绝不自行编造)""" for pat, key in ROUTES: if re.search(pat, q): return "答", KOUJING[key] return "转人", None用 10 条假期真实高频咨询跑一遍(含 3 条口径卡没写的):
[答] 什么时候发货?我 3 号下的单 → 10 月 1—3 日正常发货,每天 16:00 截单;10 月 4 日起恢复正常节奏。 [答] 从你们那到成都大概几天能收到 → 假期物流比平时慢 1—2 天,华东 2 天、华南 3 天、西北 4 天,均按假期节奏估算。 [答] 我要退款,多久到账 → 退款申请当日审核,到账时间以支付渠道为准,通常 1—3 个工作日。 [答] 客服几点上班,现在有人吗 → 人工客服在线时间调整为每天 10:00—次日 01:00。 [答] 我要投诉,你们这个价格太贵了 → 客户提出投诉、或要求赔偿的,一律转人工主管处理。 [答] 能开电子发票吗 → 发票假期内可开电子发票,纸质发票 10 月 8 日后统一寄出。 [答] 能换一个颜色吗 → 换货在假期内登记,10 月 8 日起按登记顺序处理,3 个工作日内完成。 [转人] 你们老板电话多少 → 口径卡未覆盖,转人工 [转人] 能帮我砍个价吗,隔壁便宜 80 → 口径卡未覆盖,转人工 [转人] 能不能帮我改送到另一个地址 → 口径卡未覆盖,转人工 命中口径 7/10 = 70%;转人工 3/10 = 30% 口径外问题自行作答(编造)= 0 条三、一个必须说的坑:关键词排序会制造「答非所问」
先说结论。它会。
上面那份代码是我改过的第二版。第一版的ROUTES是个无序字典,把「时效」放在了「退款」前面,结果:
问:我要退款,多久到账 第一版答:假期物流比平时慢 1—2 天,华东 2 天、华南 3 天……客户问退款到账时间,系统答了一通物流时效。这就是最常见的答非所问——答案本身没错(时效口径是对的),但它回答的不是这个问题。改法是让顺序承担优先级:先判意图(退款/换货/升级),纯时间词放最后。就这样。
修完对比:
命中口径 7/10 = 70%;转人工 3/10 = 30% 口径外问题自行作答(编造)= 0 条 旧版路由答非所问 = 1 条(修优先级后 = 0)四、进阶:把口径表外置成 JSON,让非技术同事自己改
口径一定会变(改价、改时效、改假期安排)。把口径表从代码里挪到口径.json,运营同事改文件即可,不用碰 Python:
{ "发货": "10 月 1—3 日正常发货,每天 16:00 截单;10 月 4 日起恢复正常节奏。", "升级": "客户提出投诉、或要求赔偿的,一律转人工主管处理。" }import json, os, re HERE = os.path.dirname(os.path.abspath(__file__)) KOUJING = json.load(open(os.path.join(HERE, "口径.json"), encoding="utf-8")) def answer(q): for pat, key in ROUTES: if re.search(pat, q): return "答", KOUJING[key] return "转人", None跑法就一行:
python koujing_card_v2.py终端日志:
口径键 7 条;命中 7/10 = 70%;转人工 3/10 = 30% 编造(口径外自行作答)= 0 条外置之后,口径的维护成本和一次改价的成本对齐了。
这一点很重要。真的。
五、为什么这条思路值得抄
- 编造率可以真正做到 0。口径外的三条(老板电话、砍价、改地址)全部转人,没有一条被系统自作主张回答。这是「宁可不答,不可答错」在代码层面的实现。
- 口径是资产,不是配置。这张卡写完,人工客服、外包、AI 用的是同一份;谁答的都对得上。
- 升级规则必须写在最前面。涉及投诉、金额、赔偿的问题优先级最高——先兜住风险,再谈效率。
假期咨询量的分布和平时不一样(时段后移、深夜上涨),但真正决定口碑的变量只有一个:回答的人有没有一个确定的口径可依。
(本文写作过程使用了 AI 辅助整理公开资料;文中代码与全部数字均经人工实跑核验。)
我们是谁:做企业知识库与 AI 客服落地,服务于小微企业;方法上只承诺过程可核验——口径写没写下来、编造率能不能压到 0,都是当场能跑一遍看结果的。