1. 客服机器人的能力边界,为什么必须叠加导购视角
做了这些年电商后端系统,我越来越觉得传统的“FAQ 客服机器人”已经到瓶颈了。早期客服机器人解决的核心问题是“少接电话、少回重复消息”,于是我们把售后话术、物流解释、退换货流程全部做成知识库,用户问什么就匹配什么。可电商用户真正高频问的其实是另一类问题——“我该买哪个?”。这不是售后问题,而是购买决策问题。
用户晚上十一点打开对话框,上来就问:“这款空气炸锅和那款比,哪个更适合两个人用?”“我家厨房小,想要不占地方的,有推荐吗?”传统客服机器人遇到这种问题基本就废了,要么给两个商品链接让用户自己看,要么答非所问。用户得不到答案,扭头就去别的店了。这让我意识到一件事:客服机器人的能力边界,恰恰不是“回答售后问题”,而是能不能帮用户做决策。于是我把方向调整为“电商客服+导购智能体”,让同一个机器人既处理售前咨询、又处理售后问题,还能在合适时机主动推荐商品。
你可以把它理解成一个复合角色:客服负责“交易履约中的问题解决”,导购负责“帮助用户完成购买决策”,两者共用一套对话入口,背后却是完全不同的能力和数据。这篇文章我就完整讲一下这套智能体的设计思路和落地过程,适合正在做电商客服系统改造的开发者、产品经理,也想给想自建导购能力的团队一个可参考的框架。我会从整体架构、知识库、多轮对话、导购策略、人机协作、评估调优几个层面展开,尽量把关键决策背后的理由也讲清楚。
2. 智能体的整体骨架:对话、知识、策略三者如何协同
2.1 先跑通最小链路,再谈优化
我在设计这个智能体时,没有一开始就上复杂的多智能体编排,而是先用一个单智能体 + 工作流节点的架构把链路跑通。整个核心循环很简单:用户输入 -> 意图识别 -> 状态更新 -> 判断要不要调工具 -> 生成回复 -> 落库。如果你用过 Function Calling 或 ReAct 模式,会发现这就是标准的 Agent 循环。
我给出这次落地时用的 Python 伪代码,帮你快速理解骨架:
async def handle_user_message(msg: str, session: Session): # 1. 识别用户意图 intent = await detect_intent(msg, session.state) # 2. 更新对话状态(槽位、上下文、情绪) session.update(intent, msg) # 3. 根据意图决定是否调用工具 if intent.need_tool: tool_results = await execute_tools( intent.tool_plan, session.entities ) session.attach_tool_results(tool_results) # 4. 生成最终回复(带上工具结果,避免模型凭空编造) reply = await generate_reply( msg, session.state, intent, session.tool_results ) # 5. 标记是否需要人工介入 if need_human_handoff(session): await handoff_to_agent(session) return reply这套逻辑看起来简单,但落地时关键不在 prompt 写得多花哨,而在工具层和状态层是否稳定。我见过很多团队把精力全花在读模型、调 prompt 上,结果库存接口超时、订单查询返回字段不一致,导致智能体回复质量忽高忽低。所以我会把大量精力放在工具定义和状态持久化上。
2.2 工具定义与权限边界:智能体的“手脚”必须有规矩
电商场景下,客服和导购需要触达的数据很多,我梳理了下面这些高频工具:
- 订单查询:订单状态、商品明细、支付金额
- 物流查询:物流轨迹、预计送达时间
- 商品查询:商品信息、价格、规格、库存
- 优惠券计算:可领券、可用的活动价、到手价
- 售后申请:退货/换货/维修入口
- 用户偏好查询:历史订单、浏览记录、会员等级
每个工具都要明确入参、出参、副作用。特别注意,有副作用的工具(比如生成售后单、发放优惠券)必须接二次确认,不能让模型随口就答应用户“我已经帮您申请退款了”。
工具定义时的 JSON Schema 也要写清楚,这会直接影响模型能不能正确调用。比如查询订单接口,我建议至少包含这些字段:
{ "name": "query_order", "description": "根据订单号或用户ID查询订单详情", "parameters": { "type": "object", "properties": { "order_id": { "type": "string", "description": "订单号,形如 JD2025..." }, "user_id": { "type": "string", "description": "用户ID,当未提供订单号时必填" } }, "required": [] } }如果接口能对同一个用户返回最近订单列表,就不必强制要求模型必须拿到 order_id。很多初版实现容易卡在这:模型死活提取不出订单号,导致查询失败。实际上,用户往往想不起来订单号,我们需要通过登录身份直接拉起“最近订单”。
2.3 模型选型与成本控制的现实约束
模型选型我建议分三档走:
| 对话场景 | 推荐方式 | 成本控制要点 |
|---|---|---|
| 简单 FAQ、售后状态查询 | 小参数模型或复用大模型但走短 prompt | 用规则/分类器分流,减少无效 token |
| 多轮导购、复杂售后 | 大模型 + 工具调用 | 控制上下文长度,及时裁剪历史 |
| 转人工前的总结/摘要 | 大模型离线任务 | 批量异步处理,不占用在线资源 |
实际项目中,很多团队盲目标大模型,结果成本飙升、响应速度下降。我自己比较推荐的做法是:在入口先做一次轻量意图分类(可以用传统文本分类模型,甚至规则+关键词),把“查物流”“看优惠”“我要退货”这类意图直接路由到固定流程,这类流程根本不需要大模型做复杂推理;只有“开放导购对话”和“复杂售后”才进入大模型对话链路。这样既能保证大部分会话秒回,又能把聪明的模型留给最需要它的场景。
这也带出一个原则:不要什么都靠智能体“自由发挥”。能固化的流程就固化,自由对话只留给真正需要自由度的场景。很多客服机器人表现差,不是因为模型蠢,而是因为把简单的“查一下”做成了“想一想”。
3. 商品知识库与向量检索:导购说对话的前提
3.1 商品数据的结构化与向量化
导购能力的基础是“懂商品”。如果只知道商品标题,那不叫懂,叫搜索框。我这次把商品中心的数据分成了三层结构:
- SPU 层:商品 ID、标题、类目、品牌
- SKU 层:规格(颜色、尺寸)、库存、价格
- 动态层:促销活动、评价摘要、卖点标签、场景标签
向量化的对象我选的是“SPU 的混合文案”,而不是单独标题。单纯把标题做 embedding,召回效果很差,因为用户问的是“适合给妈妈用的不粘锅”,标题里未必有“妈妈”“不粘”这些词。所以我会把标题、核心属性、卖点标签、高赞评价摘要拼成一段商品描述,再交给 embedding 模型处理。下面是一个简化示例:
商品:麦饭石平底不粘锅 26cm 卖点:少油不粘 可立锅盖 轻便单手可握 场景:租房做饭 一人食 煎蛋不粘 新手友好 评价摘要:煎蛋确实不粘,重量轻,适合女生单手操作这样的混合文本召回效果明显好于只召回标题的版本。但要注意一点:embedding 模型如果太老,对“不粘”“低油”这类烹饪场景词理解不够,需要先做候选集的同义词扩展,否则召回率会偏低。这个属于工程细节,后面调优阶段会反复碰。
3.2 召回与重排序:别一上来就给用户十个选择
召回可以分两路并跑:一路是关键词召回(走 ES/数据库),一路是向量召回(走向量库)。两路取并集后做重排序。排序时的特征我用了这些:
- 命中度:与用户query的字面匹配和语义匹配分数
- 商品热度:近7天UV、销量
- 库存状态:现货优先于预售
- 价格区间:必须落在用户表达或默认的价格带内
- 历史偏好:用户近30天浏览/购买的类目和价位
重排序的目标很简单:只给用户2-3个候选,别给10个。导购不是搜索引擎,用户要的是“哪个最适合我”,而不是一堆链接让他自己挑。我曾见过初版系统把召回的商品全部排给用户,结果用户更纠结了,反而流失。这个教训让我把导购回复策略明确写成:“先给结论,再给对比理由,最多附两个备选”。
3.3 知识库更新的实时性问题
电商的商品库是高度动态的:商品可能下架、改价、参加满减、库存清零。向量库的更新是有延迟的,如果直接用构建好的向量索引去回答“还有货吗”“现在多少钱”,几乎必然出错。
我的做法是双重校验:向量检索只负责“找到候选商品”,但真正告诉用户价格、库存、活动信息时,必须实时调用商品查询接口去拿最新字段。换句话说,商品库只回答“推荐什么”,实时接口回答“现在能不能买”。这两步分开,能避免大模型基于过期知识编造信息,也避免每次导购推荐都要实时全量扫描商品库,把延迟压在可控范围。
这里有个容易被忽略的坑:促销活动信息往往不在商品中心,而在促销系统里。智能体如果要说出“现在买可以减50”,必须联动促销系统,而不是只在商品表里查价格。我踩过这个坑后,专门加了一个“到手价计算”工具,输入商品ID和用户ID,返回最终优惠价、可用优惠券、是否满足满减条件。导购话术里凡是涉及价格和优惠的内容,全部以这个工具的结果为准。
4. 意图识别与多轮对话状态管理:别把用户绕晕
4.1 意图分层设计:先分大类,再分小类
电商对话的意图不能只有一层。我按两级设计:
| 一级意图 | 二级意图示例 | 典型用户话术 |
|---|---|---|
| 售前咨询 | 商品咨询、场景推荐、比价、库存询问、价格询问 | “这个能连蓝牙吗” |
| 售后处理 | 退款、换货、物流催单、质量问题 | “收到的货坏了” |
| 售前转售后 | 改地址、取消订单 | “我不想要了能退吗” |
| 闲聊/其他 | 问候、评价询问、活动咨询 | “在吗”“最近有活动吗” |
一级意图决定走客服流程还是导购流程,二级意图决定具体动作。这个设计能让状态管理更清晰,避免把“价格能便宜点吗”这种导购意向处理成售后问题。
意图识别我用了“模型 + 规则”的双保险。高确定性说法(“我要退货”)走规则;模糊说法(“这个东西有点意思,但我预算有限”)走模型。规则先行可以压成本、提速度,模型兜底能覆盖长尾。
4.2 多轮澄清与槽位填充:别一次问太多问题
导购对话中最容易翻车的地方是“问太多”。智能体一上来就连续追问“预算多少”“给谁用”“什么场景”“要不要品牌”……用户直接烦了,回一句“算了”就流失。我的策略是:每轮最多追问一个关键槽位,并给用户选择而不是开放式填空。
举个例子,用户说“想买个跑步耳机”:优先确认“使用场景”(现在明确是跑步);再问“佩戴方式”;再问“预算”。如果用户说“500以内”,顺手就能把预算槽位填上。如果用户没给预算,我就直接推荐当前卖得最好的入门款,并在话术中说“如果超出预算,告诉我,我换个推荐”,把主动权交还给用户。
对话状态我用 Redis 持久化,存成结构化 JSON,包含:当前意图、已填充槽位、用户偏好、最近推荐过的商品、情绪标记。不推荐把整个聊天历史塞给模型,而是把历史“压缩”成状态。否则长对话 token 会飞速膨胀,成本高、延迟高,模型还会被前面的废话干扰。
4.3 上下文压缩与记忆裁剪:把有用的留下,没用的丢掉
长对话必须做记忆裁剪。我会在每一轮结束后更新一个会话摘要,格式类似:
{ "intent": "scene_recommend", "slots": { "category": "耳机", "scene": "跑步", "budget": "500以内", "waterproof": true }, "recommended_products": ["P001", "P002"], "negative_feedback": ["用户嫌第一款太重"], "tone": "neutral" }下一轮生成回复时,把这份摘要 + 当前用户输入交给模型,而不是把前 20 轮对话全部带上。如果用户中途跳到售后问题(“刚拍下的订单能改地址吗”),我会把导购状态临时保存起来,优先处理售后意图,处理完再回到导购流程。这个切换机制很关键,很多人忽略,结果用户问完售后回来,智能体已经忘了刚才推荐到哪一款了。
5. 导购策略引擎:从回答问题到促成转化
5.1 推荐时机:别嫌用户问得少,也别乱推
导购智能体和客服机器人最大的区别是:它要判断“什么时候该主动推商品”,而不是只回答问题。我总结的经验是三个时机值得推:
- 用户明确求推荐(“有没有适合XXX的”)
- 用户在做比较(“这两个哪个好”“有什么区别”)
- 用户表现出犹豫信号(“太贵了”“还有别的吗”“我再看看”)
其他时候,尤其是用户问物流、问发票、问售后时,别乱推商品。我见过一些系统为了冲转化率,在用户投诉物流时还硬塞“猜你喜欢”,结果满意度暴跌。客服和导购可以一体化,但场景切换的边界必须守住:先解决售后,再谈种草。
5.2 场景化卖点表达:别复读参数
推荐话术我要求团队遵守一个原则:说人话,说场景,别说参数表。比如推荐耳机,与其说“支持蓝牙5.3、续航8小时”,不如说“你夜跑时戴着,连接挺稳,跑一次5公里电量足够”。当然,前提是这些说法必须有商品参数做支撑,不能凭空夸。
具体话术我建议走“三步结构”:结论 + 理由 + 备选。比如:
“这款更适合夜跑,因为它带防汗设计,耳机不容易滑落,续航也够你用一周。如果你更看重降噪,我推荐另一款,但价格会高100左右。”
这种话术既给了决策锚点,又给用户留了选择空间,比“亲亲,这款很合适哦”有用得多。
同时要划几条话术红线:不贬低竞品、不承诺“全网最低价”、不夸大功效。比如保健品类目特别容易违规,智能体绝对不能说出“治疗”“根治”这类词。这个我会在系统层面做一个话术合规校验,在最终回复发给用户前,跑一遍敏感词和夸大词过滤。
5.3 价格敏感与优惠处理:承诺不能乱给
用户说“太贵了”的时候,智能体第一反应不应该是一股脑塞优惠券。如果平台根本没有可发的券,模型却在会话里“虚构”出一张,售后就会炸锅。正确做法是:
- 调用“到手价计算”工具,看这个用户当前可用的优惠
- 如果真实有券,再给出券和优惠后的价格
- 如果真实没有优惠,就转向推荐同品类中价格更低的替代款
这个逻辑必须落在代码里,而不是靠 prompt 约束。因为只要模型有生成自由度,就存在乱承诺的风险。我在工具层加了一个机制:当用户提到“优惠”“便宜”“卷”时,必须调用优惠券查询和到手价计算工具,工具结果为空则默认回答“请关注店铺活动页”,不允许模型自由发挥降价承诺。
这一点对电商场景极其重要。客服智能体说的每一句话都可能成为交易凭证,承诺错了就是客诉和赔偿。宁可少给一点话术温度,也不能牺牲准确性。
6. 人机协作:智能体搞不定时的退让机制
6.1 转人工的判断信号:别拖到用户发火
再强的智能体也会遇到搞不定的问题。我把转人工条件写在系统里,主要包括几类信号:
- 用户情绪负面(包含愤怒、失望等情绪词,或多次催促)
- 售后纠纷进入高风险状态(如涉及赔付、投诉、法律)
- 连续两轮澄清失败,用户需求仍不明确
- 用户明确要求“转人工”“找客服”“投诉电话”
- 会话涉及企业专属规则,智能体知识库未覆盖
这些信号里,情绪识别我用了一个轻量模型加关键词规则。比如“气死”“差评”“投诉”“我要曝光”这些词一出现,直接触发人工介入优先级。这个比单纯靠意图模型判断更直接。
6.2 上下文移交:给人工坐席一张“小抄”
转人工最忌讳的是把大段历史文本扔给坐席,让坐席自己慢慢翻。我这边用 LLM 在转人工前自动生成一段结构化摘要:
用户ID: U12345 问题类型: 售后换货 订单号: 20250120XXXX 已尝试方案: 已解释 7 天无理由退换规则,用户不接受,要求升级处理 用户情绪: 愤怒(多次提到差评) 建议动作: 优先处理换货申请并安抚这样人工坐席在接线前就能知道发生了什么、该往哪个方向处理。这个摘要的质量直接影响人工处理效率。实际落地后,人工坐席平均处理时长下降了30%左右(对比无摘要时代),用户满意度也稳定了一些。
还有一个细节:转人工后如果用户重新发消息,不能让坐席和智能体“抢答”。我做了互斥控制,一旦转人工,智能体进入只读模式,只负责后台辅助,不再主动回复用户。防止出现“用户发一句话,智能体回一句,坐席又在回一句”的混乱场面。
6.3 人工反馈回流:把坐席的经验变成智能体的样本
人机协作不只是一条“退路”,更是数据回流的入口。我让坐席在会话结束后标记“智能体回答是否有帮助”,并在坐席修改话术时记录差异。这些人工修订内容会成为后续 fine-tune 或 prompt 优化的高质量样本。
举个例子:智能体之前遇到“用户说东西坏了要赔偿”时只会重复官方话术,坐席修正为“先确认损坏照片,再引导走售后绿色通道”。这类修订经过清洗后,会被注入到话术库和示例样本中,下一次智能体再遇到类似问题时,就会优先采用这个处理路径。这个闭环跑起来之后,智能体的售后处理成功率明显上升,转人工率也从15%降到9%左右。
7. 评估体系与线上调优:客服指标不只是准确率
7.1 客服类指标:解决率、满意度、等待时长
评估智能体不能只看“模型准确率”,电商场景里我更关注以下指标:
- 会话解决率:用户问题在单次会话内是否形成闭环(比如查物流后用户没有再次追问)
- 用户满意度:会话结束后评价打分
- 平均响应时长:直接影响体验
- 转人工率:过高说明智能体不行,过低也可能说明它在硬扛,需要结合满意度看
这里有个容易被忽视的点:转人工率下降未必是好消息。如果智能体为了不转人工,把所有用户都拖到售后流程里绕圈子,满意度会断崖式下跌。所以我看转人工率一定和满意度联动看,两者同时恶化说明智能体在“硬撑”。
7.2 导购类指标:转化率、客单价、回购率
导购部分的评估要单独建一套指标体系:
- 咨询后点击率:智能体推荐的商品被用户点击的比例
- 咨询后加购/下单率
- 客单价:导购推荐会话的客单价,是否高于非导购会话
- 回购率:长期维度,判断导购是否是“杀鸡取卵”
一个真实教训:早期我们用“会话内促成下单数”作为导购指标,结果智能体疯狂推低价爆款,短期的转化率上去了,但客单价和毛利反而下降。后来把“客单价”也加入核心指标,并做了 AB 测试,才把导购话术拉到合理水平。导购智能体的目标不是“卖得最多”,而是“卖得合适”。
7.3 数据回流与迭代节奏:每周拆解 badcase
整个系统上线后的迭代节奏,我个人建议按周跑:
- 从日志中抽取本周的 badcase(用户差评、转人工、多次澄清失败等)
- 用 LLM 做一次初步分类,把问题归到意图误判、工具失败、话术不佳、知识缺失
- 人工抽检,补充标注
- 根据问题归因,更新 prompt、修正工具参数、补充商品知识、调整意图分类规则
- 每周发版一次,同时跑 AB 测试
这套节奏听上去没什么技术含量,但真正帮你提升系统能力的就是这个笨功夫。模型结构本身很少换,决定体验差距的往往是规则、工具和知识库的持续打磨。我见过不少团队花大价钱训练模型,结果因为 badcase 回收机制缺失,问题永远在重复出现,模型再强也没用。
如果你也想把这个方向落地,我建议先别碰复杂的多智能体架构,从单智能体 + 工具调用 + 明确的客服/导购场景边界做起。先把订单查询、商品检索、到手价计算这几个核心工具做稳,再逐步叠加导购策略和人机协作。这套骨架搭好后,后续无论换模型还是加功能都相对从容。
最后再分享一个实际项目里的经验:我们当时在线上做了一个不起眼的改动——在智能体回复中主动带上“我查了一下当前库存”这类信息来源说明,用户重复追问和质疑明显变少。很多时候用户担心的不是智能体说得对不对,而是它到底有没有真的查过。让智能体的回答有“工具依据”,比任何花哨的话术都更能赢得信任。