实践1:构建智能天气查询机器人

学习目标:掌握COTA框架的基础配置和Chain of Thought推理机制

这个实践将基于weather bot示例,带您从零开始构建一个具有思维链推理能力的天气查询机器人。

📋 项目概览

功能特性

  • ✅ 智能天气查询(单城市/多城市对比)
  • ✅ 思维链推理过程完全可视化
  • ✅ 多轮对话状态管理
  • ✅ 表单式信息收集
  • ✅ 人工客服转接

技术亮点

  • Chain of Thought: 每个决策都有明确的推理过程
  • 状态管理: 智能收集和管理对话状态
  • 策略组合: trigger + match双重策略保证响应质量

🏗️ 项目结构

weather/
├── agent.yml          # 智能体核心配置
├── endpoints.yml       # LLM和服务配置
├── policy/
│   ├── data.yml       # Chain of Thought标注数据
│   └── rules.yml      # 触发规则配置
└── README.md          # 文档说明

⚙️ 配置详解

1. 智能体配置 (agent.yml)

系统描述

system:
  description: 你是一个智能助手,你需要认真负责的回答帮用户解决问题;要求回答的尽量精准和谨慎

对话配置

dialogue:
  use_proxy_user: false  # 真实用户交互模式
  max_proxy_step: 30     # 最大对话轮次
  max_tokens: 500        # 控制回复长度

策略配置

policies:
  - type: trigger        # 基于规则的快速响应
  - type: match         # 基于标注的思维链推理

2. 核心动作定义

BotUtter - 智能回复动作

BotUtter:
  description: "回复用户"
  prompt: |
    你是一个智能助手,需要根据当前对话历史生成合适的回复。
    
    **输出格式要求:**
    你必须严格按照以下JSON格式响应:
    ```json
    {"thought": "<你的推理过程>", "text": "<你的回复内容>"}
    ```
    
    **对话历史:**
    {{history_actions_with_thoughts}}

Selector - 动作选择器

Selector:
  description: "选择合适的Actions"
  prompt: |
    你是一个智能对话助手,需要根据当前对话状态选择下一个最合适的Action。
    
    **输出格式:**
    ```json
    {"thought": "<你的推理过程>", "action": "<工具名称>"}
    ```
    
    **可用的Action工具:**
    {{action_descriptions}}
    
    **当前对话状态:**
    {{history_actions_with_thoughts}}

Weather - 天气查询表单

Weather:
  description: "查询天气信息"
  slots:
    city:
      description: "用户询问的城市名称"
    time:
      description: "用户询问的时间(今天、明天等)"
  executer:
    type: script
    script: |
      # 模拟天气查询
      return {"text": "sunny", "metadata": {}}

3. LLM配置 (endpoints.yml)

llms:
  deepseek:
    type: openai
    model: deepseek-chat
    key: your_api_key_here  # 请替换为真实API密钥
    apibase: https://api.deepseek.com/v1

channel:
  type: redis
  host: localhost
  port: 6379
  db: 1

🧠 Chain of Thought 核心机制

思维链标注数据 (policy/data.yml)

policies:
- title: 复杂查天气  
  actions:
    - name: UserUtter
      result: 成都和重庆天气咋样哪个好,我要看下去哪个城市旅游
    - name: Selector
      thought: 用户询问天气,同时问了成都和重庆天气,并让我做比较,我应该先执行Weather得到成都的天气,然后再执行Weather得到重庆的天气,然后比较
      result: Weather
    - name: Weather
      slots:
        city: 成都
        time: 今天
      state: end
      result: 
        text: sunny
        metadata: {}
    - name: Selector  
      thought: 已经查询了成都天气,现在需要查询重庆天气进行对比
      result: Weather
    - name: Weather
      slots:
        city: 重庆  
        time: 今天
      state: end
      result:
        text: cloudy
        metadata: {}
    - name: Selector
      thought: 已获取成都(sunny)和重庆(cloudy)的天气,现在需要对比并给出旅游建议
      result: BotUtter
    - name: BotUtter
      result:
        text: 成都今天天气晴朗(sunny),重庆今天是阴天(cloudy)。从天气角度来看,成都的天气更适合旅游活动。不过您也可以考虑其他因素如景点、美食等来做最终决定。
        thought: 对比两个城市天气后,成都天气更好,但也要提醒用户考虑其他旅游因素

🚀 实战演练

步骤1:环境准备

# 1. 进入示例目录
cd /path/to/cota/bots/weather

# 2. 配置API密钥
vim endpoints.yml
# 将your_api_key_here替换为实际的API密钥

# 3. 启动调试模式
cota shell --debug

步骤2:基础对话测试

用户输入: 你好
预期回复: 你好,请问有什么可以帮您?

用户输入: 我想查天气
预期回复: 好的,我可以帮您查询天气。请告诉我您想查询哪个城市的天气?

步骤3:复杂场景测试

用户输入: 帮我查下杭州和上海的天气,我看下去哪里旅游
系统行为: 
1. Selector识别需要查询两个城市天气
2. 先查询杭州天气
3. 再查询上海天气  
4. 对比结果并给出建议

📊 思维链可视化

每一步决策都包含完整的推理过程:

{
  "action": "Selector",
  "thought": "用户请求查询杭州和上海的天气以帮助决定旅游目的地,这类似于决策参考模式中的复杂查天气示例,其中用户询问多个城市天气并做比较。Weather工具只支持单个城市查询,因此需要先查询上海的天气。",
  "result": "Weather"
}

这种透明的推理过程确保了:

  • 可解释性: 每个决策都有明确理由
  • 可调试性: 便于发现和修复逻辑问题
  • 可优化性: 基于推理过程持续改进

🎯 最佳实践总结

1. 配置策略

  • 渐进式配置: 从简单trigger开始,逐步添加match策略
  • 思维链标注: 提供高质量的推理过程示例
  • 错误处理: 配置合适的fallback机制

2. 提示词工程

  • 结构化输出: 统一JSON格式确保解析稳定
  • 上下文管理: 合理使用{{history_actions_with_thoughts}}
  • 角色定义: 清晰的系统描述和动作描述

3. 调试技巧

  • 调试模式: 使用--debug查看完整推理过程
  • 分步测试: 从简单对话到复杂场景逐步验证
  • 日志分析: 关注thought字段定位问题

4. 生产部署

  • API密钥管理: 使用环境变量保护敏感信息
  • 持久化存储: 配置Redis和数据库确保状态持久化
  • 监控告警: 设置appropriate的监控和日志

通过这个实践,您已经掌握了COTA框架的核心能力。接下来可以尝试实践2,学习更高级的代理模式功能。