前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库AI Agent 工具调用 tool calling 流程
AIAI Agent工具调用

大模型 Agent 的工具调用(Tool Calling)是如何从一次模型输出到一次函数执行闭环的?

模型只输出结构化工具调用请求,由运行时执行并回传结果,形成一次完整闭环。

前端进阶之旅 · 一题精讲更新于 2026.09.05
AI Agent#工具调用
先看核心答案读代码示例
理解线索

职责分离的闭环

  1. 模型产出请求根据工具描述和输入决定调用
  2. 运行时执行应用代码调用真实函数
  3. 结果回传以tool_result块继续对话

模型不接触实际系统,运行时也不做语义判断

核心回答

先记住这个答案

工具调用闭环中,模型根据用户请求和工具描述决定调用哪个工具,生成包含工具名和参数的 tool_use 块;应用代码执行该工具并产生结果,再以 tool_result 块回传给模型;模型读取结果后继续生成最终回复或发起下一轮调用。整个过程围绕消息序列展开,职责清晰:模型不直接执行代码,运行时也不替模型做决策。

  • 模型只产结构化调用,不执行代码
  • 运行时负责执行工具并回传结果
  • 结果需放入 tool_result 块继续对话

从文本到函数调用的结构化转换

当用户请求需要外部数据或操作时,模型在给定工具列表中选择一个工具,生成包含 id、name 和 input 的 tool_use 内容块。这个块不是自然语言,而是符合工具 input_schema 的 JSON 对象。例如,get_weather 工具需要 location 字符串,模型输出 {"location":"San Francisco, CA"}。

应用检测到 stop_reason 为 tool_use 后,解析出工具名和参数,执行对应的实际函数。执行完毕后,应用构造一个 tool_result 内容块,包含 tool_use_id(与之前的 ```tool_use块匹配)和结果内容(如字符串或 JSON)。然后将其作为新的user` 消息的一部分发送给模型,模型读取结果并继续生成回复或再次调用工具。

模拟工具调用闭环JavaScript
// 模拟模型输出工具调用
const assistantMessage = {
  role: 'assistant',
  content: [{ type: 'tool_use', id: 'tool_1', name: 'get_weather', input: { location: 'San Francisco' } }]
};

// 运行时执行工具
function executeTool(name, input) {
  if (name === 'get_weather') return "15°C,多云";
  throw new Error(`未知工具: ${name}`);
}

// 回传结果
const toolUse = assistantMessage.content[0];
const result = executeTool(toolUse.name, toolUse.input);
const userMessage = {
  role: 'user',
  content: [{ type: 'tool_result', tool_use_id: toolUse.id, content: result }]
};

console.log(JSON.stringify({ assistantMessage, userMessage }, null, 2));
查看输出与解释
{
  "assistantMessage": {
    "role": "assistant",
    "content": [
      {
        "type": "tool_use",
        "id": "tool_1",
        "name": "get_weather",
        "input": {
          "location": "San Francisco"
        }
      }
    ]
  },
  "userMessage": {
    "role": "user",
    "content": [
      {
        "type": "tool_result",
        "tool_use_id": "tool_1",
        "content": "15°C,多云"
      }
    ]
  }
}

展示客户端工具的核心三步:模型输出tool_use,运行时执行,回传tool_result。

查询天气并回答的工程实现

假设 Agent 需要回答“旧金山天气如何”,提供了 get_weather 工具,schema 要求 location 必需。用户请求缺少具体城市时,模型可能推断默认值或询问。实际场景中,模型生成工具调用,应用从响应中提取 tool_use,调用天气 API,获取温度字符串,然后作为工具结果回传。

处理时需注意:1) 确保 tool_use_id 正确映射,避免并行调用时混淆;2) 结果内容不能是超大对象,应简洁;3) 如果工具执行失败,需在 tool_result 中传递错误内容,让模型决定下一步,而非直接抛出异常导致断链。

闭环失效的边界条件

模型可能输出非法工具名或参数,例如 get_weather 的 location 传成数字。此时运行时校验失败,若直接报错中断,模型无法得知原因。正确做法是将错误信息作为 tool_result 内容返回,例如 content: "参数错误:location 必须是字符串",让模型根据错误修正调用。

此外,当模型一次输出多个 tool_use 且调用之间有依赖时,运行时必须等待前一个结果再调用后一个。若忽略顺序并行执行,可能因参数缺失而失败。还需注意每次工具调用都会消耗 token,结果过大需截断,否则上下文长度超限导致后续调用失败。

回答前,多想一步

容易答错的地方

认为模型会直接执行工具
模型只生成结构描述,不执行任何代码或访问真实系统。所有副作用必须由应用层代码实现,否则工具只是空壳。
忽略工具结果回传格式
工具结果必须包装成 tool_result 块并关联 tool_use_id,若直接以文本形式拼接在用户消息里,模型可能无法关联结果与调用,导致语义混淆。
试着用自己的话回答

面试官还会怎么问?

并行工具调用时如何匹配结果?

每个 tool_use 有唯一 id,对应 tool_result 必须携带该 id。运行时按响应中的多个块分别执行,并按 id 回传,可乱序执行但结果要准确地与调用对应。

工具执行结果超长怎么办?

需要截断或压缩,例如只取前 N 字符、提取摘要或保留关键字段。或者采用专门的结果处理工具,避免阻塞上下文。

工具调用失败如何告知模型?

不要抛出异常导致中断,而是将错误信息放在 tool_result 的 content 中,可能并用 is_error: true 标记,模型会理解并尝试修正或转换策略。

从一道题,走向一组知识

把知识连起来

工具调用

在 Agent 设计中,什么能力应该做成工具调用而不是写进系统提示词?

同属「工具调用」专题,接着看 Agent 工具设计 工具调用 系统提示词 边界 在具体场景中的处理方式。

工具调用

工具参数中的自由文本字段(如查询语句)应如何限定格式降低误用?

同属「工具调用」专题,接着看 工具调用 自由文本参数 格式约束 在具体场景中的处理方式。

参考资料

  • Tool use with Claude - Claude Platform Docs

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 从文本到函数调用的结构化转换
  3. 查询天气并回答的工程实现
  4. 闭环失效的边界条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑