题目

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 工具调用的基本流程一致:

  1. 定义工具:开发者向 Agent 提供可用工具的元数据(名称、描述、参数结构)。

  2. 模型决策:LLM 根据用户问题判断是否需要调用工具,如需调用,按约定格式生成工具调用请求。

  3. 解析与执行:Agent 框架解析模型输出,提取工具名和参数,调用对应函数/API。

  4. 返回结果:将工具执行结果按约定格式(如 tool 消息)传回 LLM。

  5. 继续推理:LLM 结合工具结果生成最终回答或再次调用工具。

总结

格式特点适用场景
OpenAI Function结构化、标准化,支持多工具调用,广泛集成主流 API 调用,生产级应用
通用 JSON灵活,易定制,但需强提示约束自建 Agent,轻量级系统
ReAct人类可读,自然语言混合,适合调试教学、研究、快速原型
LangChain 抽象统一接口,兼容多种模型和格式基于 LangChain 的复杂 Agent 开发
Claude Tool Use内容块结构,支持流式输出Anthropic 模型用户

选择哪种格式取决于使用的模型、框架以及开发偏好。对于新项目,推荐采用 OpenAI Function Calling 或 LangChain 兼容格式,因为它们生态完善、易于扩展。如果需要更高的可读性或与旧系统集成,ReAct 或自定义 JSON 也是不错的选择。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐