共计 1734 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么 Agent Skill 开发总让人头疼?
最近在做一个客服对话系统时,发现 Agent Skill 开发远比想象中复杂。总结下来有三个最让人抓狂的问题:

- 意图识别准确率低:用户说 ” 我要改签明天上午的航班 ” 和 ” 航班改期到明早 ” 明明是同一个意思,但模型经常识别为不同意图
- 多轮对话状态维护困难:当用户连续问 ” 上海天气怎么样?”→” 那北京呢?” 时,如何保持上下文是个技术活
- 业务系统集成复杂:对接 CRM 系统时发现鉴权、数据格式转换等边缘工作占用了 70% 开发时间
技术选型:主流框架到底哪家强?
花了两周时间对比了三大主流框架,这里分享我的评测结果(测试环境:AWS c5.large 实例):
| 框架 | NLU 准确率 | 扩展性 | 部署成本 | 学习曲线 |
|---|---|---|---|---|
| Rasa | 85%~92% | 完全自主可控 | 中等 | 较陡峭 |
| Dialogflow | 88%~90% | 谷歌生态绑定 | 高 | 平缓 |
| Lex | 82%~87% | AWS 服务集成 | 按量计费 | 中等 |
个人建议:
– 需要数据自主权选 Rasa
– 快速验证原型用 Dialogflow
– 已有 AWS 生态优先考虑 Lex
核心实现:用 Python 打造 Agent 大脑
意图识别模块实战
下面是一个基于 Rasa 的航班查询意图识别示例(Python 3.8+):
from typing import Dict, Text, Any
from rasa.nlu.components import Component
class FlightIntentClassifier(Component):
"""自定义航班意图分类器"""
def process(self, message, **kwargs):
# 实体提取逻辑
entities = self._extract_flight_entities(message.text)
message.set("entities", entities, add_to_output=True)
# 意图识别逻辑
intent = {"name": self._predict_intent(message.text),
"confidence": 0.95 # 模拟置信度
}
message.set("intent", intent, add_to_output=True)
def _extract_flight_entities(self, text: Text) -> List[Dict]:
"""提取航班相关实体"""
# 实际项目建议用正则或条件随机场
return [{
"entity": "time",
"value": "明天上午",
"extractor": "flight_extractor"
}]
对话状态机设计
多轮对话管理推荐使用有限状态机 (FSM) 模式:
stateDiagram
[*] --> 未登录
未登录 --> 已登录: 验证成功
已登录 --> 查询航班: 触发查询意图
查询航班 --> 选择航班: 展示结果
选择航班 --> 完成订票: 用户确认
状态持久化建议方案:
- Redis 存储会话状态(TTL 建议 30 分钟)
- 使用对话 ID 作为 key
- 压缩 JSON 格式存储
性能优化:让 Agent 飞起来
经过压测(JMeter 500 并发),发现三个性能瓶颈:
- NLU 模型推理耗时:平均 320ms
- 数据库查询:每次对话 2~3 次查询
- 日志写入:同步写 ES 拖慢响应
优化方案:
- 使用 ONNX 加速模型推理(降至 180ms)
- 为常用查询添加 Redis 缓存
- 改用异步日志收集
优化后指标对比:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| QPS | 82 | 215 |
| 平均延迟 | 420ms | 190ms |
| 99 分位延迟 | 1.2s | 560ms |
血泪教训:生产环境避坑指南
这三个坑我们团队都踩过,分享解决方案:
- 会话超时导致上下文丢失
- 现象:用户离开 15 分钟后回来,Agent 失忆
-
解法:实现会话恢复功能,主动询问 ” 是否继续上次咨询 ”
-
突发流量打垮服务
- 现象:促销活动期间 API 503 错误
-
解法:
- 部署自动扩缩容
- 添加请求队列
-
实体识别误判引发错误操作
- 现象:把 ” 取消订单 123″ 识别成取消订单 + 商品 ID123
- 解法:
- 添加业务规则校验
- 关键操作需二次确认
思考:Agent 的智能边界在哪里?
在项目过程中,我们不断面临这样的权衡:
- 应该允许用户自由表达,还是引导他们按预定流程操作?
- 当识别置信度低于多少时应该转人工?
- 如何处理 ” 我想订机票但还没想好时间 ” 这样的模糊请求?
这些没有标准答案的问题,或许正是对话系统最有趣的部分。期待听到你的实践心得!
正文完
