logo

实战一:构建你的第一个工具调用 Agent

Talk is cheap. 我们将用 Python + Google Gemini API 手写一个能够查询实时天气的 Agent。

这个例子虽然简单,但它包含了 Agent 的核心三要素:思考 (Reasoning)工具 (Tool)执行 (Execution)

[PROMPT_LAB_BANNER]


1. 准备工作

我们将使用 google-generativeai 库。它的 Function Calling 接口非常直观。

pip install -q -U google-generativeai

2. 定义工具 (Define Tool)

Agent 不知道“现在”的天气。我们需要给它一个函数 get_current_weather

import google.generativeai as genai
import os

# 模拟的天气 API(实际项目中这里会调用 OpenWeatherMap 等 API)
def get_current_weather(location: str):
    """获取指定地点的当前天气信息"""
    print(f"🔧 工具被调用: get_current_weather('{location}')")
    
    # 这里只是模拟返回
    weather_data = {
        "Beijing": "Sunny, 25°C",
        "Melbourne": "Rainy, 12°C",
        "New York": "Cloudy, 18°C"
    }
    return weather_data.get(location, "Unknown location")

# 将函数放入工具箱
tools = [get_current_weather]

3. 初始化模型

我们将工具直接传递给 Gemini 模型。

genai.configure(api_key="YOUR_API_KEY")

# 使用支持 Function Calling 的模型 (如 gemini-1.5-flash)
model = genai.GenerativeModel(
    model_name='gemini-1.5-flash',
    tools=tools  # 注入工具
)

# 开启自动工具调用 (Auto Function Calling)
# Gemini 的 Python SDK 支持自动执行工具并回传结果,无需手动写循环
chat = model.startChat(enable_automatic_function_calling=True)

4. 运行 Agent

现在,我们可以像跟人聊天一样给它下指令。

response = chat.send_message("墨尔本和北京现在的天气怎么样?适合穿什么?")
print(f"🤖 Agent 回答:\n{response.text}")

幕后发生了什么?

  1. User: "墨尔本和北京..."
  2. Model: 思考 -> 决定调用 get_current_weather(location='Melbourne')get_current_weather(location='Beijing')
  3. Execution (SDK自动处理): 运行函数,获取 "Rainy, 12°C" 和 "Sunny, 25°C"。
  4. Model: 接收到工具结果 -> 综合生成最终建议。
  5. Output: "墨尔本现在下雨,12度,建议穿雨衣和保暖衣物;北京..."

5. 进阶:手动控制循环

虽然 SDK 的 enable_automatic_function_calling=True 很方便,但在复杂的 Agent 系统(如 LangChain/LangGraph)中,我们需要手动控制这个循环,以便处理错误、添加日志或人工介入。

手动循环伪代码:

messages = [...] # ...

while True:
    # 1. 调用 LLM
    response = model.generate_content(messages)
    
    # 2. 检查是否有 Tool Call
    if not response.function_calls:
        break # 没工具调用,直接结束
        
    # 3. 执行工具
    for call in response.function_calls:
        tool_result = execute_tool(call.name, call.args)
        
        # 4. 将结果追加到对话历史
        messages.append({
            "role": "tool",
            "name": call.name,
            "content": tool_result
        })
        
    # 5. 循环继续,LLM 看到工具结果后会生成下一步

小结

构建一个 Agent 其实就是构建一个 While Loop

  1. Ask: 问模型要做什么。
  2. Act: 执行模型要求的动作。
  3. Observe: 把结果喂回给模型。
  4. Repeat: 重复直到模型说“做完了”。
AI Agent 开发实战手册
AI Engineer

AI Agent 开发实战手册

从 0 到 1 掌握 AI Agent 开发:涵盖自主计划、工具调用、MCP 协议与多智能体编排实战。

AI Agent 开发实战手册实战一:构建你的第一个工具调用 Agent

实战一:构建你的第一个工具调用 Agent

Talk is cheap. 我们将用 Python + Google Gemini API 手写一个能够查询实时天气的 Agent。

这个例子虽然简单,但它包含了 Agent 的核心三要素:思考 (Reasoning)工具 (Tool)执行 (Execution)

Prompt Lab

把这章的知识,直接变成实战能力

进入交互式实验室,用真实任务练 Prompt,10 分钟快速上手。

进入 Prompt Lab →

#1. 准备工作

我们将使用 google-generativeai 库。它的 Function Calling 接口非常直观。

bash
pip install -q -U google-generativeai

#2. 定义工具 (Define Tool)

Agent 不知道“现在”的天气。我们需要给它一个函数 get_current_weather

python
import google.generativeai as genai import os # 模拟的天气 API(实际项目中这里会调用 OpenWeatherMap 等 API) def get_current_weather(location: str): """获取指定地点的当前天气信息""" print(f"🔧 工具被调用: get_current_weather('{location}')") # 这里只是模拟返回 weather_data = { "Beijing": "Sunny, 25°C", "Melbourne": "Rainy, 12°C", "New York": "Cloudy, 18°C" } return weather_data.get(location, "Unknown location") # 将函数放入工具箱 tools = [get_current_weather]

#3. 初始化模型

我们将工具直接传递给 Gemini 模型。

python
genai.configure(api_key="YOUR_API_KEY") # 使用支持 Function Calling 的模型 (如 gemini-1.5-flash) model = genai.GenerativeModel( model_name='gemini-1.5-flash', tools=tools # 注入工具 ) # 开启自动工具调用 (Auto Function Calling) # Gemini 的 Python SDK 支持自动执行工具并回传结果,无需手动写循环 chat = model.startChat(enable_automatic_function_calling=True)

#4. 运行 Agent

现在,我们可以像跟人聊天一样给它下指令。

python
response = chat.send_message("墨尔本和北京现在的天气怎么样?适合穿什么?") print(f"🤖 Agent 回答:\n{response.text}")

#幕后发生了什么?

  1. User: "墨尔本和北京..."
  2. Model: 思考 -> 决定调用 get_current_weather(location='Melbourne')get_current_weather(location='Beijing')
  3. Execution (SDK自动处理): 运行函数,获取 "Rainy, 12°C" 和 "Sunny, 25°C"。
  4. Model: 接收到工具结果 -> 综合生成最终建议。
  5. Output: "墨尔本现在下雨,12度,建议穿雨衣和保暖衣物;北京..."

#5. 进阶:手动控制循环

虽然 SDK 的 enable_automatic_function_calling=True 很方便,但在复杂的 Agent 系统(如 LangChain/LangGraph)中,我们需要手动控制这个循环,以便处理错误、添加日志或人工介入。

手动循环伪代码:

python
messages = [...] # ... while True: # 1. 调用 LLM response = model.generate_content(messages) # 2. 检查是否有 Tool Call if not response.function_calls: break # 没工具调用,直接结束 # 3. 执行工具 for call in response.function_calls: tool_result = execute_tool(call.name, call.args) # 4. 将结果追加到对话历史 messages.append({ "role": "tool", "name": call.name, "content": tool_result }) # 5. 循环继续,LLM 看到工具结果后会生成下一步

#小结

构建一个 Agent 其实就是构建一个 While Loop

  1. Ask: 问模型要做什么。
  2. Act: 执行模型要求的动作。
  3. Observe: 把结果喂回给模型。
  4. Repeat: 重复直到模型说“做完了”。

常见问题

开发 AI Agent 需要掌握哪些编程语言?
首选 Python 或 TypeScript。Python 是 AI 生态的基石,而 TypeScript 在开发 MCP Server 和网页端交互时效率极高。借助 Cursor 等 AI 原生编辑器,编程门槛已大幅降低。
MCP 协议目前支持哪些模型?
MCP 是开放协议,目前对 Claude 3.5 系列支持最完美。通过 MCP Proxy,GPT-4o 和 Gemini 也可以间接访问 MCP Server 数据源。
AI Agent 会导致程序员失业吗?
不会,但会改变程序员的工作内容。未来的开发者将从“写代码”转向“管理 Agent 团队”,重点在于系统架构设计、复杂逻辑校验和 Agent 的提示词优化。