经典面试题:Agent工具调用格式
题目
Agent工具调用有哪些格式?请详细介绍。
解答
Agent工具调用是智能体(Agent)与外部世界交互的核心机制,它允许大语言模型(LLM)在执行任务时动态调用预定义的工具(如函数、API、数据库等),从而获取实时信息、执行操作或控制外部系统。工具调用的格式直接决定了Agent如何表达调用意图、如何传递参数以及如何处理返回值。下面详细介绍几种主流的工具调用格式及其设计思路。
1. OpenAI Function Calling 格式
OpenAI 在 ChatGPT API 中引入了 Function Calling 能力,使得模型可以结构化地请求调用工具。该格式已成为许多 Agent 框架的事实标准。
调用请求格式
在 API 请求中,开发者需先定义可用的工具(functions),每个工具包含名称、描述和参数 JSON Schema。模型在生成回复时,如果决定调用工具,会在 assistant 角色的消息中增加 tool_calls 字段。
示例请求中的工具定义:
{
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,如北京"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["location"]
}
}
}
]
}
模型生成的 tool_calls 格式:
{
"role": "assistant",
"content": null, // 通常为 null,因为直接调用工具
"tool_calls": [
{
"id": "call_123abc",
"type": "function",
"function": {
"name": "get_current_weather",
"arguments": "{\"location\": \"北京\", \"unit\": \"celsius\"}"
}
}
]
}
-
id:工具调用的唯一标识,用于关联请求和响应。 -
type:目前固定为function。 -
function.name:要调用的工具名称。 -
function.arguments:JSON 字符串,包含实际参数。
工具响应格式
工具执行后,结果需要以 tool 角色的消息返回给模型,关联对应的调用 ID。
{
"role": "tool",
"tool_call_id": "call_123abc",
"content": "{\"temperature\": 22, \"unit\": \"celsius\", \"condition\": \"晴\"}"
}
-
tool_call_id:对应请求中的id。 -
content:工具返回的结果,通常为字符串(可以是 JSON 或其他格式)。
多工具调用
OpenAI 支持在一次回复中调用多个工具,tool_calls 数组可包含多个元素,模型会根据上下文顺序执行。返回时需按顺序提供对应的 tool 消息。
特点:
-
标准化、结构化,易于解析。
-
天然支持多工具调用和并行执行。
-
已被 LangChain、AutoGPT 等框架广泛采用。
2. 通用 JSON 格式
许多 Agent 系统(尤其是早期或自建的)采用自定义的 JSON 格式来表达工具调用。通常模型被要求以 JSON 对象的形式输出调用指令,然后由代码解析并执行。
常见结构
{
"action": "tool_name",
"action_input": {
"param1": "value1",
"param2": "value2"
}
}
有时也使用 tool 和 parameters 字段。模型在提示词中被明确要求:当需要调用工具时,必须输出一个符合该 JSON 结构的文本块。
示例:
{
"action": "search_web",
"action_input": {
"query": "2024年诺贝尔物理学奖得主"
}
}
解析代码检测到 JSON 后,执行对应函数,并将结果返回给模型(通常作为下一轮对话的消息)。
变种: 有些系统使用数组形式支持多工具调用:
[
{"action": "tool1", "action_input": {...}},
{"action": "tool2", "action_input": {...}}
]
特点:
-
灵活,不受特定 API 限制。
-
需在提示词中严格定义格式,并确保模型遵守。
-
对多工具调用的支持需额外处理顺序和并发。
3. ReAct 格式
ReAct(Reason+Act)是一种将推理和行动交织的提示范式,Agent 的思考过程(Thought)和行动(Action)以自然语言形式呈现,但行动部分有固定结构以便解析。
典型 ReAct 格式
模型输出包含以下部分(通常用换行分隔):
Thought: 我需要查询北京的天气才能回答问题。
Action: get_current_weather
Action Input: {"location": "北京", "unit": "celsius"}
解析器扫描文本,当发现 Action: 和 Action Input: 行时,提取工具名称和参数(通常参数为 JSON 字符串或简单文本)。工具执行后,结果以 Observation: 形式追加到上下文中:
Observation: {"temperature": 22, "condition": "晴"}
模型继续思考,可能再次调用工具或给出最终答案。
特点:
-
非常直观,人类可读性强,适合调试。
-
无需 JSON 解析,但提取
Action和Action Input需要正则或字符串处理。 -
多工具调用通过多次出现
Action实现(顺序执行)。 -
被 LangChain 的
ReActAgent和许多学术项目使用。
变种: 一些系统使用 XML 标签,如 <action>tool_name</action> 和 <input>...</input>,便于解析。
4. LangChain 工具调用协议
LangChain 作为流行的 Agent 框架,对工具调用进行了抽象,支持多种格式,但内部统一使用 ToolMessage 和 AIMessage 中的 tool_calls 属性(与 OpenAI 类似)。此外,LangChain 还兼容其他格式,例如:
-
Structured Tool Calling:模型输出一个包含
name和args的字典。 -
Multi-action Agents:如 MRKL 风格,输出一个列表,每个元素包含工具名和参数。
LangChain 的工具定义通常使用 @tool 装饰器或 StructuredTool 类,参数通过 Pydantic 模型校验,执行后返回字符串。
示例(LangChain 表达工具调用):
from langchain_core.messages import AIMessage
# 模型生成的调用
msg = AIMessage(
content="",
tool_calls=[
{"name": "get_weather", "args": {"location": "北京"}, "id": "123"}
]
)
工具返回结果用 ToolMessage 封装:
from langchain_core.messages import ToolMessage
ToolMessage(content="22°C", tool_call_id="123")
5. Anthropic Claude 工具调用格式
Anthropic 的 Claude 模型也支持工具调用,格式略有不同。在 Claude API 中,工具通过 tools 参数定义,模型回复中包含 tool_use 内容块。
示例 Claude 工具调用请求:
{
"tools": [
{
"name": "get_weather",
"description": "获取天气",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string"}
}
}
}
]
}
模型回复:
{
"role": "assistant",
"content": [
{
"type": "tool_use",
"id": "toolu_123",
"name": "get_weather",
"input": {"location": "北京"}
}
]
}
工具结果通过 tool_result 内容块返回。
特点:
-
内容块(content blocks)结构,支持文本与工具调用混合。
-
同样支持多工具调用(多个
tool_use块)。
6. 工具调用流程概览
无论采用哪种格式,Agent 工具调用的基本流程一致:
-
定义工具:开发者向 Agent 提供可用工具的元数据(名称、描述、参数结构)。
-
模型决策:LLM 根据用户问题判断是否需要调用工具,如需调用,按约定格式生成工具调用请求。
-
解析与执行:Agent 框架解析模型输出,提取工具名和参数,调用对应函数/API。
-
返回结果:将工具执行结果按约定格式(如
tool消息)传回 LLM。 -
继续推理:LLM 结合工具结果生成最终回答或再次调用工具。
总结
| 格式 | 特点 | 适用场景 |
|---|---|---|
| OpenAI Function | 结构化、标准化,支持多工具调用,广泛集成 | 主流 API 调用,生产级应用 |
| 通用 JSON | 灵活,易定制,但需强提示约束 | 自建 Agent,轻量级系统 |
| ReAct | 人类可读,自然语言混合,适合调试 | 教学、研究、快速原型 |
| LangChain 抽象 | 统一接口,兼容多种模型和格式 | 基于 LangChain 的复杂 Agent 开发 |
| Claude Tool Use | 内容块结构,支持流式输出 | Anthropic 模型用户 |
选择哪种格式取决于使用的模型、框架以及开发偏好。对于新项目,推荐采用 OpenAI Function Calling 或 LangChain 兼容格式,因为它们生态完善、易于扩展。如果需要更高的可读性或与旧系统集成,ReAct 或自定义 JSON 也是不错的选择。
更多推荐



所有评论(0)