切换日光/暗黑模式
105. Agent 工具调用与工具审批
学习目标
这一节开始实现聊天组件里的工具调用能力,让大模型不只是回答文本,而是能调用系统里的工具。
学完后,你应该能理解:
- 为什么 Agent 系统需要工具调用;
- 工具定义里要包含哪些信息;
- 为什么课程使用工具块而不是只依赖普通 JSON;
- 工具调用结果如何继续交给大模型;
- 什么是工具审批;
- 用户拒绝工具后,Agent 为什么不能继续执行危险操作。
为什么需要工具调用
前面模块配置、前端代码、后端接口都已经能编辑。
接下来要做的是让 AI 主动完成这些事情。
这就需要给聊天组件接入工具,例如:
- 查询当前模块基础信息;
- 查询前端代码;
- 更新前端代码;
- 查询后端接口;
- 执行 SQL;
- 读取技能;
- 询问用户确认。
没有工具调用,AI 只能给你一段建议文本。
有了工具调用,AI 才能读取真实上下文、修改真实数据,并把结果继续带回对话。
工具定义
课程里先定义工具类型。
一个工具通常需要包含:
- 工具名称;
- 工具描述;
- 参数结构;
- 执行函数;
- 前置拦截器;
- 后置拦截器;
- 执行结果。
类型定义很重要。
如果没有稳定类型,后面写工具时很容易把字段名、参数名或返回结构写错。
对 JS/TS 开发者来说,这里就是先给工具系统定义 interface,再让每个工具按这个协议实现。
工具块
课程里使用类似标签的工具块来表达工具调用。
大模型回复时,可能先写一段推理,再输出工具块,最后再补充说明。
系统会在回复结束后解析工具块,提取其中的工具调用信息。
这种方式比完全依赖模型随手输出 JSON 更稳定,因为工具调用有明确边界。
但它也有代价:
- 需要解析标签;
- 需要处理多个工具块;
- 需要判断工具块是否完整;
- 需要决定什么时候执行工具。
课程当前选择更稳的方式:等模型回复结束后,再统一解析和执行工具。
多个工具的执行结果
当模型一次返回多个工具调用时,系统会逐个匹配工具列表。
基本流程是:
- 根据工具名称找到工具定义;
- 执行前置拦截器;
- 执行工具主体;
- 执行后置拦截器;
- 收集工具执行结果;
- 把结果包装成工具消息;
- 再发给大模型继续判断下一步。
下一步是继续调用工具,还是直接回复用户,由模型根据新上下文决定。
这就是 Agent 的循环。
工具审批
不是所有工具都应该直接执行。
比如执行 SQL、修改代码、保存后端接口,都可能造成真实影响。
课程里实现了工具审批,也可以理解成人机确认。
当工具需要执行前,系统可以弹出确认内容,让用户选择:
- 确认执行;
- 拒绝执行。
如果用户拒绝,工具返回“用户拒绝执行工具”之类的结果。
模型拿到这个结果后,就不能假装工具已经成功。
为什么审批要进入工具流程
工具审批不是 UI 装饰。
它必须进入工具执行链路。
也就是说,执行函数不能在用户还没确认时就继续往下跑。
课程里通过类似 promise 的方式等待用户选择。
用户点击确认或取消后,前置拦截器才返回对应结果,工具流程才继续。
这和前端常见的异步弹窗很像:业务逻辑要等待弹窗结果,而不是弹窗显示出来后代码继续乱跑。
拒绝和确认的区别
课程里用“查询当前时间”这类简单工具验证流程。
当用户拒绝工具时,工具结果会明确告诉模型执行被拒绝。
当用户确认工具时,工具才能返回真实结果。
这个机制后面会用于更危险的工具,例如:
- 执行 SQL;
- 修改前端代码;
- 修改后端接口;
- 创建数据库表。
阶段重点
这一节的核心是把聊天组件从“问答框”升级成“Agent 执行器”。
工具定义提供能力,工具块让模型表达调用意图,执行链路负责真正调用,工具审批负责保护用户和系统。
理解这条链路后,后面技能发现和模块自动生成才有运行基础。