经典面试题: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.argumentsJSON 字符串包含实际参数。工具响应格式工具执行后结果需要以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 格式ReActReasonAct是一种将推理和行动交织的提示范式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 标签如actiontool_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(content22°C, tool_call_id123)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 也是不错的选择。