Skip to content

105. Agent 工具调用与工具审批

学习目标

这一节开始实现聊天组件里的工具调用能力,让大模型不只是回答文本,而是能调用系统里的工具。

学完后,你应该能理解:

  • 为什么 Agent 系统需要工具调用;
  • 工具定义里要包含哪些信息;
  • 为什么课程使用工具块而不是只依赖普通 JSON;
  • 工具调用结果如何继续交给大模型;
  • 什么是工具审批;
  • 用户拒绝工具后,Agent 为什么不能继续执行危险操作。

为什么需要工具调用

前面模块配置、前端代码、后端接口都已经能编辑。

接下来要做的是让 AI 主动完成这些事情。

这就需要给聊天组件接入工具,例如:

  • 查询当前模块基础信息;
  • 查询前端代码;
  • 更新前端代码;
  • 查询后端接口;
  • 执行 SQL;
  • 读取技能;
  • 询问用户确认。

没有工具调用,AI 只能给你一段建议文本。

有了工具调用,AI 才能读取真实上下文、修改真实数据,并把结果继续带回对话。

工具定义

课程里先定义工具类型。

一个工具通常需要包含:

  • 工具名称;
  • 工具描述;
  • 参数结构;
  • 执行函数;
  • 前置拦截器;
  • 后置拦截器;
  • 执行结果。

类型定义很重要。

如果没有稳定类型,后面写工具时很容易把字段名、参数名或返回结构写错。

对 JS/TS 开发者来说,这里就是先给工具系统定义 interface,再让每个工具按这个协议实现。

工具块

课程里使用类似标签的工具块来表达工具调用。

大模型回复时,可能先写一段推理,再输出工具块,最后再补充说明。

系统会在回复结束后解析工具块,提取其中的工具调用信息。

这种方式比完全依赖模型随手输出 JSON 更稳定,因为工具调用有明确边界。

但它也有代价:

  • 需要解析标签;
  • 需要处理多个工具块;
  • 需要判断工具块是否完整;
  • 需要决定什么时候执行工具。

课程当前选择更稳的方式:等模型回复结束后,再统一解析和执行工具。

多个工具的执行结果

当模型一次返回多个工具调用时,系统会逐个匹配工具列表。

基本流程是:

  • 根据工具名称找到工具定义;
  • 执行前置拦截器;
  • 执行工具主体;
  • 执行后置拦截器;
  • 收集工具执行结果;
  • 把结果包装成工具消息;
  • 再发给大模型继续判断下一步。

下一步是继续调用工具,还是直接回复用户,由模型根据新上下文决定。

这就是 Agent 的循环。

工具审批

不是所有工具都应该直接执行。

比如执行 SQL、修改代码、保存后端接口,都可能造成真实影响。

课程里实现了工具审批,也可以理解成人机确认。

当工具需要执行前,系统可以弹出确认内容,让用户选择:

  • 确认执行;
  • 拒绝执行。

如果用户拒绝,工具返回“用户拒绝执行工具”之类的结果。

模型拿到这个结果后,就不能假装工具已经成功。

为什么审批要进入工具流程

工具审批不是 UI 装饰。

它必须进入工具执行链路。

也就是说,执行函数不能在用户还没确认时就继续往下跑。

课程里通过类似 promise 的方式等待用户选择。

用户点击确认或取消后,前置拦截器才返回对应结果,工具流程才继续。

这和前端常见的异步弹窗很像:业务逻辑要等待弹窗结果,而不是弹窗显示出来后代码继续乱跑。

拒绝和确认的区别

课程里用“查询当前时间”这类简单工具验证流程。

当用户拒绝工具时,工具结果会明确告诉模型执行被拒绝。

当用户确认工具时,工具才能返回真实结果。

这个机制后面会用于更危险的工具,例如:

  • 执行 SQL;
  • 修改前端代码;
  • 修改后端接口;
  • 创建数据库表。

阶段重点

这一节的核心是把聊天组件从“问答框”升级成“Agent 执行器”。

工具定义提供能力,工具块让模型表达调用意图,执行链路负责真正调用,工具审批负责保护用户和系统。

理解这条链路后,后面技能发现和模块自动生成才有运行基础。

AI Agent 课程学习文档。