共计 1928 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
开发 agent skill 时,新手常会遇到几个典型问题:

- 意图识别不准 :用户表达方式多样,简单的关键词匹配难以覆盖所有情况
- 对话流管理复杂 :多轮对话中状态维护困难,容易丢失上下文
- 调试效率低 :没有可视化工具时,测试对话逻辑需要反复修改代码
- 部署流程繁琐 :从开发环境到生产环境的迁移常出现配置差异
技术选型对比
主流 agent 开发框架各有特点:
- Dialogflow:
- 优点:Google 提供,NLU 效果优秀,集成方便
-
缺点:黑盒模型,自定义能力有限
-
Rasa:
- 优点:完全开源,可高度定制
-
缺点:学习曲线陡峭,需要自己训练模型
-
Lex:
- 优点:AWS 生态集成好
- 缺点:功能相对基础
对于需要深度定制的场景,推荐 Python+Rasa 方案。
核心实现(天气查询示例)
1. 定义意图和实体
# nlu.yml
version: "3.1"
nlu:
- intent: ask_weather
examples: |
- 今天天气怎么样
- 北京明天会下雨吗
- 查询纽约的天气
- intent: goodbye
examples: |
- 再见
- 退出
- entity: city
examples: |
- [北京](city)
- [上海](city)
2. 对话状态管理
# actions.py
from typing import Dict, Text, Any, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
class ActionGetWeather(Action):
def name(self) -> Text:
return "action_get_weather"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
city = tracker.get_slot("city")
if not city:
dispatcher.utter_message("请问您想查询哪个城市的天气?")
return []
# 这里应该调用真实天气 API
weather = f"{city} 晴,25℃"
dispatcher.utter_message(weather)
return []
3. 对话规则定义
# rules.yml
rules:
- rule: 天气查询流程
steps:
- intent: ask_weather
- action: action_get_weather
- rule: 结束对话
steps:
- intent: goodbye
- action: utter_goodbye
发布流程
1. 测试阶段
# 启动交互测试
rasa shell
# 运行单元测试
pytest tests/
2. 打包部署
# Dockerfile 示例
FROM rasa/rasa:3.0-full
COPY . /app
RUN rasa train
CMD ["run", "-m", "/app/models", "--enable-api", "--cors", "*"]
3. 生产环境发布
- 构建 Docker 镜像
- 推送到容器仓库
- 使用 Kubernetes 或 ECS 部署
- 配置负载均衡和自动扩缩容
生产环境考量
性能优化
- 异步处理 :耗时操作(如 API 调用)使用异步任务
- 缓存机制 :对天气数据等实施缓存,减少重复查询
# 使用 redis 缓存示例
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
def get_cached_weather(city):
cache_key = f"weather_{city}"
cached = r.get(cache_key)
if cached:
return cached.decode()
# 调用真实 API 并缓存结果
weather = get_real_weather(city)
r.setex(cache_key, 3600, weather) # 缓存 1 小时
return weather
安全性建议
- 输入验证 :对所有用户输入进行清洗
- 权限控制 :API 访问需要身份验证
- 日志记录 :记录所有交互用于审计
避坑指南
- 意图混淆 :确保训练数据覆盖足够多的表达变体
- 状态丢失 :在对话设计中明确 slot 的生命周期
- API 超时 :为外部服务调用设置合理的超时时间
- 内存泄漏 :长时间运行的 agent 需要定期清理历史数据
进阶建议
- 多语言支持 :使用国际化库处理不同语言
- 个性化推荐 :基于用户历史交互提供定制响应
- A/ B 测试 :对比不同对话策略的效果
结语
通过这个完整流程,我们实现了一个可用的天气查询 agent skill。实际项目中还需要考虑监控告警、持续集成等工程化实践。建议从小功能开始,逐步迭代优化。
正文完
