共计 3124 个字符,预计需要花费 8 分钟才能阅读完成。
背景痛点:为什么需要 AI Agent
传统客服系统通常采用规则匹配或简单的关键词识别,这在实际应用中会面临几个核心问题:

- 意图理解能力弱:用户问法千变万化,” 怎么退款 ” 和 ” 钱能退回来吗 ” 本质是同一意图,但传统方法需要穷举所有可能的关键词组合
- 上下文断裂:当用户说 ” 上一个订单 ” 时,系统往往无法关联之前的对话历史,导致每次交互都是独立事件
- 多轮对话混乱:处理如退货流程(需要先后确认订单号、退货原因、收款账号)时,缺乏有效的状态管理机制
这些痛点正是 AI Agent 技术要解决的核心问题。通过引入自然语言理解 (NLU) 和对话状态跟踪(DST),我们可以构建更智能的对话系统。
技术选型:框架对比
目前主流的技术方案主要有三种路径:
- Rasa:适合需要高度自定义 NLU 策略的场景,但学习曲线较陡峭
- LangChain:优势在于快速集成大语言模型(LLM),适合需要丰富知识库的场景
- 自建 Pipeline:本文选择的方案,通过组合 BERT+Redis+FSM 实现最大灵活性
具体对比如下:
- 开发效率:LangChain > Rasa > 自建
- 可控性:自建 > Rasa > LangChain
- 硬件需求:LangChain(需 GPU) > 自建(可仅用 CPU) > Rasa
核心实现
意图识别服务
使用 BERT-base 模型实现意图分类,关键优化点:
# 基于 transformers 的意图分类封装
from transformers import BertTokenizer, BertForSequenceClassification
import torch
class IntentClassifier:
def __init__(self, model_path):
self.tokenizer = BertTokenizer.from_pretrained(model_path)
self.model = BertForSequenceClassification.from_pretrained(model_path)
self.labels = ['退货', '投诉', '查询', '其他'] # 示例标签
def predict(self, text):
inputs = self.tokenizer(text, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
outputs = self.model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
return self.labels[torch.argmax(probs)]
时间复杂度分析:
– Tokenization:O(n) n 为文本长度
– 模型推理:O(1) 固定长度 512 的 BERT-base
对话状态跟踪
采用 Redis 作为存储后端的设计考虑:
- 使用 hash 结构存储对话状态
- 设置 TTL 自动清理僵尸会话
- 使用 lua 脚本保证原子性更新
import redis
import json
class DialogueStateTracker:
def __init__(self, host='localhost', port=6379):
self.r = redis.Redis(host=host, port=port, decode_responses=True)
def update_state(self, session_id, new_state):
"""使用 lua 脚本保证原子操作"""
script = """local current = redis.call('HGET', KEYS[1],'state')
if not current then
current = '{}'
end
local new_data = cjson.decode(ARGV[1])
local current_data = cjson.decode(current)
for k,v in pairs(new_data) do
current_data[k] = v
end
redis.call('HSET', KEYS[1], 'state', cjson.encode(current_data))
redis.call('EXPIRE', KEYS[1], 3600) # 1 小时过期
return 1
"""
return self.r.eval(script, 1, session_id, json.dumps(new_state))
有限状态机实现
定义对话流程的状态转移规则:
from enum import Enum, auto
class State(Enum):
START = auto()
COLLECTING_ORDER = auto()
CONFIRMING_DETAILS = auto()
COMPLETED = auto()
class DialogueFSM:
def __init__(self):
self.transitions = {
State.START: {
'退货': State.COLLECTING_ORDER,
'投诉': State.CONFIRMING_DETAILS
},
State.COLLECTING_ORDER: {'order_provided': State.CONFIRMING_DETAILS}
}
def get_next_state(self, current_state, intent):
return self.transitions.get(current_state, {}).get(intent, current_state)
生产环境考量
超时处理策略
采用分层超时设计:
- 前端:5 分钟无操作显示超时提示
- 后端:30 分钟彻底清理会话数据
- Redis:1 小时强制过期保证存储清理
敏感词过滤
实现高效的多模式匹配:
from ahocorasick import Automaton
class SensitiveFilter:
def __init__(self, words):
self.automaton = Automaton()
for word in words:
self.automaton.add_word(word, word)
self.automaton.make_automaton()
def filter(self, text):
for end_index, original_value in self.automaton.iter(text):
start_index = end_index - len(original_value) + 1
text = text[:start_index] + '*'*len(original_value) + text[end_index+1:]
return text
时间复杂度:O(n) 其中 n 为文本长度
避坑指南
上下文丢失场景
- 未正确处理代词指代(” 这个订单 ” 需要绑定具体 ID)
- 跨服务调用时未传递完整 context
- 状态序列化时丢失类型信息(如将 datetime 转为字符串后未恢复)
意图识别优化
- 添加业务特定的同义词库(如 ” 泡面 ”->” 方便面 ”)
- 对短文本使用数据增强(” 退款 ”->” 我想申请退款 ”)
- 加入拒绝分类(当置信度 <0.7 时触发人工)
扩展思考
实现跨渠道会话保持的三种方案:
- 统一会话 ID:通过用户 ID+ 设备指纹生成唯一标识
- 数据同步:使用消息队列同步各渠道的状态变更
- 前端协调:Web/App 统一维护会话上下文
完整的系统还需要考虑:
– 对话质量监控(如使用 BERT 计算语句连贯性)
– 自动学习机制(从人工客服对话中提取新意图)
– 多模态支持(处理图片 / 语音等输入)
希望这篇指南能帮助你避开我们踩过的坑,快速构建可用的智能客服系统。在实际项目中,建议先从核心对话流程开始验证,再逐步扩展复杂功能。
正文完
