在聚合站上用工具调用搭一个最小天气 Agent
本文介绍如何在 LLM API 聚合站上,通过工具调用(tool calls)构建一个最小天气 Agent。内容涵盖从声明 JSON schema、让模型输出 tool_calls、本地执行工具,到将结果回填到第二轮请求的完整流程,帮助读者理解工具调用的工作机制与实现步骤。
为什么用天气工具作为示例
工具调用(tool calls)是让 LLM 与外部世界交互的基础能力。天气查询是一个理想的入门示例:逻辑简单、结果明确、无需复杂鉴权,能让你专注于工具调用的核心流程。
在聚合站上,你用一个 API key 就能调用多个模型,而工具调用的接口规范在主流模型间基本一致,这让你可以轻松切换模型进行测试。
整体流程概览
一个最小的天气 Agent 包含以下步骤:
- 声明工具:用 JSON Schema 描述天气查询函数,包括名称、描述和参数。
- 第一轮请求:把用户问题和工具声明一起发给模型。
- 解析 tool_calls:模型返回它想调用的工具及参数。
- 本地执行:在你的代码中实际运行天气查询,得到结果。
- 第二轮请求:把工具执行结果作为新消息回填,让模型生成最终回答。
第一步:声明 JSON Schema
工具声明需要告诉模型:工具叫什么、做什么、需要哪些参数。以下是一个天气查询工具的 schema 示例(参数为城市名):
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,例如:北京"
}
},
"required": ["city"]
}
}
}
要点:
description要清晰,模型靠它判断何时调用。- 参数类型和必填项要准确,避免模型生成无效参数。
- 工具名称用蛇形命名,保持可读性。
第二步:发起第一轮请求
将用户消息和工具声明一起发送。请求体大致如下:
{
"model": "claude-3-5-sonnet",
"messages": [
{"role": "user", "content": "北京今天天气怎么样?"}
],
"tools": [ /* 上面的 schema */ ]
}
模型不会直接回答天气,而是返回一个 toolcalls 结构,表示它想调用 getweather,并给出参数 {"city": "北京"}。
第三步:解析 tool_calls
响应中会包含类似这样的内容(结构因模型而异,但核心一致):
{
"choices": [{
"message": {
"role": "assistant",
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"北京\"}"
}
}]
}
}]
}
你需要提取 name 和 arguments。注意 arguments 是 JSON 字符串,需要解析成对象。
第四步:本地执行工具
在你的代码中实现 get_weather 函数。它可以是调用真实天气 API,也可以是一个模拟函数。关键是要返回一个字符串结果,例如:
{"temperature": "25°C", "condition": "晴", "humidity": "40%"}
执行后,你得到工具的输出,准备回填。
第五步:发起第二轮请求
将助手的 tool_calls 消息和工具结果消息追加到对话历史,再次请求模型。消息结构示例:
[
{"role": "user", "content": "北京今天天气怎么样?"},
{"role": "assistant", "tool_calls": [ /* 原样保留 */ ]},
{"role": "tool", "tool_call_id": "call_abc123", "content": "{\"temperature\": \"25°C\", \"condition\": \"晴\"}"}
]
注意:toolcallid 必须与第一轮返回的 id 一致,这样模型才知道这是对哪个调用的响应。
模型收到工具结果后,会生成自然语言回答,例如:“北京今天晴,气温 25°C,湿度 40%。”
常见问题与调试建议
- 模型不调用工具:检查工具描述是否清晰,或尝试在用户消息中明确要求使用工具。
- 参数解析失败:确保
arguments是合法 JSON,必要时用 try-catch 处理。 - 多轮工具调用:如果模型在第二轮又返回
tool_calls,你需要重复执行和回填,直到模型返回普通文本。 - 模型差异:不同模型对工具调用的支持程度不同,但主流模型都遵循类似规范。在聚合站上切换模型时,注意测试兼容性。
在聚合站上的实践提示
聚合站的一个 API key 可以调用多个模型,方便你对比不同模型在工具调用上的表现。计费方面,用户按官方价 ×1.3 扣费;如果你贡献自己的 key,可以获得官方价 ×1.1(优质 ×1.2)的 USDC 返利。
工具调用是构建更复杂 Agent 的基石。掌握这个最小闭环后,你可以逐步添加更多工具,实现多步骤任务。