从FAQ机器人到客服Agent:如何用“状态机+大模型”构建可控的智能客服流程
从FAQ机器人到客服Agent:如何用“状态机+大模
型”构建可控的智能客服流程
摘要
传统FAQ机器人主要依赖关键词匹配、意图分类和固定话术,适合处理“怎么修改密码”“在哪里查看订
单”等简单问题。但在退款申请、故障报修、订单变更等场景中,机器人不仅需要回答问题,还需要收集信
息、判断条件、调用业务接口,并根据执行结果继续对话。
这类任务更适合由客服Agent处理。
不过,完全依赖大模型自主决策也会带来流程不可控、参数遗漏和错误调用接口等问题。本文介绍一种相对稳
妥的实现思路:使用大模型理解用户意图和提取参数,使用状态机控制业务流程,再通过工具调用完成具体操
作。
一、FAQ机器人为什么难以处理复杂客服任务
传统智能客服通常由三个部分组成:
- 用户问题分类;
- 知识库检索;
- 固定答案返回。
例如,用户询问:
如何修改账号密码?
系统识别出“修改密码”意图后,从知识库中找到对应答案并回复即可。
但用户提出下面的问题时,处理过程就会复杂很多:
我昨天买的商品还没有发货,能帮我取消订单吗?
系统至少需要完成以下步骤:
• 识别用户要取消订单;
• 获取订单号;
• 查询订单状态;
• 判断订单是否允许取消;
• 调用取消订单接口;
• 将处理结果反馈给用户;
• 如果取消失败,决定是否转人工处理。
这已经不再是简单的“问题—答案”匹配,而是一个需要持续判断和执行的任务流程。
1二、客服Agent的核心不是聊天,而是完成任务
从工程角度看,客服Agent可以拆分为四层:
- 对话理解层
负责理解用户当前表达,包括:
• 用户意图;
• 业务对象;
• 关键参数;
• 上下文关系;
• 用户情绪。
例如:
上次那个订单我不想要了。
系统需要结合历史对话判断“那个订单”具体指哪一笔订单,而不是只分析当前一句话。
- 流程控制层
流程控制层决定下一步应该做什么,例如:
• 继续询问订单号;
• 查询订单状态;
• 调用取消接口;
• 解释无法取消的原因;
• 转接人工客服。
这一层不建议完全交给大模型自由决策。对于退款、报修、投诉和账户操作等关键场景,最好通过状态机或工
作流进行约束。
- 工具执行层
工具执行层负责调用真实业务系统,例如:
• 查询订单;
• 查询物流;
• 创建工单;
• 修改预约时间;
• 发送短信;
• 查询会员信息。
大模型本身不能直接修改订单,它只能决定是否应该调用某个工具,并生成工具所需要的参数。
- 回复生成层
业务系统返回结果后,大模型将结构化数据转换成自然语言。
例如,订单接口返回:
2{
"order_id": "A20260712001",
"status": "shipped",
"cancelable": false
}
客服Agent可以生成回复:
这笔订单已经发货,目前无法直接取消。你可以在收到商品后申请退货,或者由人工客服帮你进
一步确认物流拦截情况。
三、为什么需要“状态机+大模型”
大模型擅长理解自然语言,但不擅长稳定执行严格的业务规则。
例如,在取消订单流程中,企业可能有以下规则:
• 未支付订单可以直接关闭;
• 已支付但未发货订单可以申请取消;
• 已发货订单不能直接取消;
• 特殊商品不支持无理由退货;
• 高金额订单需要人工审核。
如果把所有规则都放进提示词中,大模型可能出现以下问题:
• 漏掉某个判断条件;
• 没有收集完整参数就调用接口;
• 在不同轮次给出不一致的答案;
• 错误理解接口返回结果;
• 对不允许执行的操作做出承诺。
因此,可以让大模型负责“理解”,状态机负责“控制”。
一个简化的订单取消状态可以设计为:
START
↓
IDENTIFY_INTENT
↓
COLLECT_ORDER_ID
↓
QUERY_ORDER
↓
CHECK_CANCEL_RULE
├─ 可以取消 → EXECUTE_CANCEL
├─ 不可取消 → EXPLAIN_REASON
└─ 信息异常 → TRANSFER_TO_HUMAN
每个状态只允许执行有限的动作,从而降低流程失控的概率。
3四、一个简化的实现示例
下面用伪代码描述基本流程:
class CustomerServiceAgent:
def init(self):
self.state = "START"
self.context = {}
def handle_message(self, message):
if self.state == "START":
intent = recognize_intent(message)
if intent == "cancel_order":
self.state = "COLLECT_ORDER_ID"
return "请提供需要取消的订单号。"
return search_knowledge_base(message)
if self.state == "COLLECT_ORDER_ID":
order_id = extract_order_id(message)
if not order_id:
return "我暂时没有识别到订单号,请重新输入。"
self.context["order_id"] = order_id
self.state = "QUERY_ORDER"
return self.query_order()
def query_order(self):
result = order_api.get_order(
self.context["order_id"]
)
if not result:
self.state = "TRANSFER_TO_HUMAN"
return "没有查询到对应订单,我帮你转接人工客服。"
self.context["order"] = result
self.state = "CHECK_CANCEL_RULE"
return self.check_cancel_rule()
def check_cancel_rule(self):
order = self.context["order"]
if order["status"] == "unpaid":
return self.execute_cancel()
if order["status"] == "paid_not_shipped":
return self.execute_cancel()
4if order["status"] == "shipped":
self.state = "EXPLAIN_REASON"
return "订单已经发货,暂时无法直接取消。"
self.state = "TRANSFER_TO_HUMAN"
return "订单状态比较特殊,我帮你转接人工客服。"
def execute_cancel(self):
result = order_api.cancel_order(
self.context["order_id"]
)
if result["success"]:
self.state = "FINISHED"
return "订单已经取消成功。"
self.state = "TRANSFER_TO_HUMAN"
return "系统暂时无法完成取消操作,我帮你转接人工客服。"
在真实项目中, recognize_intent() 和 extract_order_id() 可以由大模型完成,而订单查询、状态判断和取
消操作仍由确定性的程序控制。
五、大模型应该输出结构化结果
为了方便系统解析,不建议让大模型直接返回一段自由文本,而是要求它输出固定JSON结构。
例如:
{
"intent": "cancel_order",
"confidence": 0.96,
"entities": {
"order_id": "A20260712001"
},
"missing_fields": [],
"suggested_action": "query_order"
}
系统可以根据这些字段决定下一步动作。
提示词可以包含以下约束:
你是客服意图识别模块,只负责识别意图和提取参数。
要求:
- 不直接回答用户问题;
- 不虚构订单信息;
- 缺少参数时写入 missing_fields;
- 只能从给定意图列表中选择;
- 必须返回合法JSON。
这种方式比让大模型同时负责理解、决策、执行和回复更容易调试。
六、工具调用需要设置哪些限制
客服Agent连接业务系统后,风险会明显高于普通问答机器人,因此工具调用至少需要设置以下限制。
- 参数校验
调用接口前,检查订单号、手机号、时间和金额等字段是否合法。
- 权限校验
查询订单和修改订单的权限应该分开,不能因为Agent拥有查询权限,就默认允许执行修改操作。
- 幂等控制
如果用户重复发送消息,系统不能重复创建工单、重复退款或重复取消订单。
- 超时和重试
业务接口超时时,应限制重试次数,避免连续调用导致业务系统压力增加。
- 操作日志
记录以下信息:
• 用户原始请求;
• 大模型识别结果;
• 状态流转过程;
• 调用的工具名称;
• 输入参数;
• 接口返回结果;
• 最终回复内容。
发生异常时,才能判断问题出在模型、流程还是业务接口。
七、知识库问答和业务执行应该分开
客服系统通常同时存在两类请求。
第一类是知识问答:
• 营业时间是什么?
• 如何修改密码?
• 保修期是多久?
6第二类是业务办理:
• 帮我取消订单;
• 帮我修改预约时间;
• 帮我创建维修工单。
知识问答可以采用RAG流程:
用户问题
→ 问题改写
→ 知识检索
→ 相关性排序
→ 生成答案
业务办理则需要进入Agent工作流:
用户请求
→ 意图识别
→ 参数收集
→ 规则判断
→ 工具调用
→ 结果确认
如果不区分这两类请求,系统可能把业务办理问题当成知识问答,只告诉用户“如何操作”,却没有真正帮助
用户完成操作。
八、上线前应该重点测试什么
客服Agent上线前,不能只测试标准问题,还需要覆盖异常情况。
例如:
• 用户没有提供订单号;
• 用户一次提供多个订单号;
• 用户中途改变诉求;
• 接口返回空数据;
• 接口响应超时;
• 用户重复提交同一请求;
• 用户要求执行无权限操作;
• 用户使用口语、错别字或模糊指代;
• 大模型输出的JSON格式错误;
• 对话过程中突然要求转人工。
测试时可以重点观察几个指标:
• 意图识别准确率;
• 参数提取完整率;
• 工具调用成功率;
• 任务完成率;
7• 错误调用率;
• 转人工率;
• 平均对话轮数;
• 单次任务处理时长。
其中,任务完成率通常比单纯的回答命中率更能反映客服Agent是否真正有效。
九、实践总结
从FAQ机器人升级到客服Agent,并不是简单地接入一个大模型接口。
真正需要解决的是三个问题:
第一,大模型能否准确理解用户当前想完成什么任务。
第二,系统能否按照企业业务规则控制执行过程。
第三,Agent能否安全调用订单、工单、CRM等业务系统。
在实际工程中,一种相对可靠的分工方式是:
• 大模型负责意图理解、参数提取和自然语言生成;
• 状态机负责流程控制和状态流转;
• 规则引擎负责业务条件判断;
• 工具接口负责执行具体业务动作;
• 人工客服负责处理异常和高风险情况。
大模型提高了客服系统理解自然语言的能力,但流程是否稳定,仍然取决于状态管理、接口设计、权限控制和
异常处理。
对于需要真正办理业务的客服场景,“可控地完成任务”通常比“生成一段听起来正确的回答”更加重要。
更多推荐

所有评论(0)