从API调用到智能体搭建:用AutoGen实现你的第一个天气查询AI助手

在ChatGPT等大模型API席卷开发者社区的今天,越来越多程序员开始思考:我们是否过度依赖"提问-回答"的被动交互模式?当简单的API调用已经无法满足复杂业务需求时,AI Agent技术正为我们打开一扇新的大门。本文将带你用Python和AutoGen框架,亲手构建一个能自主查询天气、总结新闻的多智能体系统,体验从"调用者"到"赋能者"的思维跃迁。

1. 为什么需要AI Agent?

传统API调用就像在餐厅点菜——你明确告诉厨房(大模型)要什么,它按订单返回结果。这种方式存在三个明显局限:

  • 信息获取被动 :每次交互都需要人工发起请求
  • 任务链条断裂 :复杂任务需要人工拆分和串联
  • 缺乏环境感知 :无法根据上下文自主调整行为

而AI Agent更像一位私人助理,具备三种关键能力:

  1. 自主决策 :根据目标拆解子任务
  2. 工具使用 :调用外部API获取实时数据
  3. 记忆反馈 :从历史交互中学习优化
# 传统API调用 vs Agent工作模式对比
traditional_api = "用户提问 -> API返回结果"
agent_workflow = "目标设定 -> 自主规划 -> 工具调用 -> 结果优化"

2. 环境搭建与AutoGen初探

2.1 基础环境准备

开始前确保已安装Python 3.8+,并准备以下组件:

  • OpenAI API密钥 :用于大模型接入
  • 天气API密钥 :推荐使用心知天气或和风天气
  • 开发环境 :VS Code + Jupyter扩展
# 创建虚拟环境并安装依赖
python -m venv autogen_env
source autogen_env/bin/activate  # Linux/Mac
autogen_env\Scripts\activate    # Windows
pip install pyautogen requests python-dotenv

2.2 AutoGen核心概念

AutoGen采用多智能体协作架构,主要包含两类角色:

角色类型 职责 配置参数示例
Assistant 主处理智能体 llm_config={model:"gpt-4"}
UserProxy 用户代理/工具调用 human_input_mode="ALWAYS"
from autogen import AssistantAgent, UserProxyAgent

# 初始化智能体
assistant = AssistantAgent("assistant")
user_proxy = UserProxyAgent("user_proxy")

3. 构建天气查询智能体系统

3.1 基础查询功能实现

我们先实现一个能理解自然语言请求的天气查询模块:

import requests
from typing import Dict, Any

def get_weather(params: Dict[str, Any]) -> str:
    """
    调用天气API获取实时数据
    :param params: 包含location、unit等查询参数
    :return: 格式化天气信息字符串
    """
    base_url = "https://api.seniverse.com/v3/weather/now.json"
    response = requests.get(base_url, params={
        "key": os.getenv("WEATHER_API_KEY"),
        "location": params["location"],
        "language": params.get("language", "zh-Hans"),
        "unit": params.get("unit", "c")
    })
    data = response.json()
    return f"{data['results'][0]['location']['name']}当前天气:{data['results'][0]['now']['text']},温度{data['results'][0]['now']['temperature']}℃"

3.2 集成到AutoGen智能体

将天气查询功能注册为Agent可调用的工具:

from autogen import register_function

# 注册天气查询函数
register_function(
    get_weather,
    caller=assistant,
    executor=user_proxy,
    name="get_weather",
    description="查询指定城市的实时天气情况"
)

# 定义工具调用配置
llm_config = {
    "model": "gpt-4",
    "functions": [
        {
            "name": "get_weather",
            "description": "获取当前天气信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {"type": "string", "description": "城市名称"},
                    "unit": {"type": "string", "enum": ["c", "f"]}
                },
                "required": ["location"]
            }
        }
    ]
}

4. 实现多智能体新闻摘要系统

4.1 新闻爬取模块

扩展系统能力,增加新闻获取功能:

import feedparser

def get_news(topic: str, max_items: int = 3) -> str:
    """
    获取指定主题的RSS新闻摘要
    :param topic: 新闻主题关键词
    :param max_items: 最大返回条目数
    :return: 格式化新闻摘要
    """
    feeds = {
        "科技": "https://rsshub.app/36kr/newsflashes",
        "财经": "https://rsshub.app/caijing/roll"
    }
    entries = feedparser.parse(feeds.get(topic, feeds["科技"])).entries[:max_items]
    return "\n".join([f"{idx+1}. {entry['title']}\n   {entry['summary']}" 
                     for idx, entry in enumerate(entries)])

4.2 多智能体协作流程

配置两个专业智能体协同工作:

# 创建新闻分析专家
news_analyst = AssistantAgent(
    name="News_Analyst",
    system_message="你负责分析新闻内容,提取关键信息",
    llm_config={"model": "gpt-4"}
)

# 创建报告生成专家
reporter = AssistantAgent(
    name="Reporter",
    system_message="你将新闻分析结果整理成易读的报告格式",
    llm_config={"model": "gpt-4"}
)

# 定义协作流程
def analyze_news(topic: str):
    user_proxy.initiate_chat(
        news_analyst,
        message=f"请分析最新的{topic}新闻",
        recipient=reporter
    )

5. 完整系统集成与效果优化

5.1 系统架构设计

最终系统包含三个核心模块:

  1. 输入解析层 :理解用户自然语言请求
  2. 任务路由层 :判断需要调用的功能模块
  3. 执行输出层 :组合多个工具的执行结果
graph TD
    A[用户输入] --> B(输入解析)
    B --> C{任务类型判断}
    C -->|天气查询| D[调用天气API]
    C -->|新闻摘要| E[获取RSS新闻]
    D & E --> F[结果格式化]
    F --> G[输出响应]

5.2 实际应用示例

体验完整的端到端交互流程:

# 启动对话
user_proxy.initiate_chat(
    assistant,
    message="上海今天天气怎么样?再帮我总结三篇科技新闻",
    llm_config=llm_config
)

# 预期输出流程:
# 1. 识别天气查询需求 -> 调用get_weather
# 2. 识别新闻需求 -> 激活News_Analyst
# 3. 整合结果 -> 通过Reporter生成报告

6. 性能优化与生产级考量

要让Agent系统真正可用,还需要考虑以下关键因素:

  • 错误处理机制 :API调用失败时的降级方案
  • 速率限制管理 :避免频繁调用触发限流
  • 对话状态保持 :维护跨会话的上下文记忆
  • 敏感词过滤 :对输出内容进行安全检查
# 增强的错误处理示例
def safe_get_weather(params):
    try:
        return get_weather(params)
    except Exception as e:
        return f"天气查询失败:{str(e)}"

# 记忆功能实现
from autogen import ConversableAgent

class MemoryAgent(ConversableAgent):
    def __init__(self, name, memory_size=5):
        super().__init__(name)
        self.memory = deque(maxlen=memory_size)
    
    def append_to_memory(self, event):
        self.memory.append(event)

7. 扩展应用场景探索

基于这个框架,你可以继续扩展更多实用功能:

  • 邮件自动处理 :分类、摘要、自动回复
  • 智能日程管理 :会议安排、冲突检测
  • 数据可视化 :自动生成图表报告
  • 代码审查 :分析GitHub提交记录

每个新功能的集成模式都遵循相同范式:

  1. 实现具体功能函数
  2. 注册为Agent可用工具
  3. 设计任务处理流程
  4. 测试优化交互体验
# 示例:会议安排功能
def schedule_meeting(participants, duration, topic):
    # 连接日历API实现
    return f"已为{topic}会议安排{duration}分钟时段"

register_function(
    schedule_meeting,
    description="安排线上会议并发送邀请"
)

在完成这个项目后,我深刻体会到Agent开发与传统编程的差异。最大的挑战不是写代码,而是设计智能体的决策逻辑和行为边界。有一次测试时,天气查询Agent因为过于"热心",在用户询问"上海天气"后,主动追加了"建议带伞"等未请求的信息,这提醒我们需要精确控制Agent的自主性程度。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐