工具执行、中断与 human-in-the-loop
30 秒导读: 在 Genkit 里,一个「工具」不是什么特殊物件,而是一个多了
interrupt能力的 Action。本章讲两件事:(1) 一次工具调用如何被解析、并行执行、 拼回消息给模型;(2) Genkit 独有的中断/恢复机制——工具可以主动喊「停,我要问人」, 让整轮生成暂停,等外部(通常是人)给答复后再从暂停点续跑。
本章聚焦「单次工具如何被解析、执行、中断、恢复」。至于「何时进入这个工具循环、循环转几圈」, 是 第 3 章 generate 与工具循环 的职责——它是发动机,本章是发动机里 被反复调用的那个零件。
1. 这是什么(零基础也能懂)
一句话定义
工具(tool)= 一个你写的普通函数 + 一份「说明书」。 你把说明书交给模型,模型在对话中觉得 「这里该调用它」时,就吐出一个「请帮我用参数 X 调用工具 Y」的请求;Genkit 负责找到真函数、 带上参数跑一遍、把结果塞回给模型。
解决什么问题 / 给谁用
大语言模型只会「说话」,不会「做事」——它不能查数据库、不能发邮件、不能读今天的天气。工具就是给
模型接上手脚:你把 getWeather(city) 这个函数注册成工具,模型就能在回答「北京今天要带伞吗」时,
先请求调用 getWeather("北京"),拿到真实数据再作答。
一个最小例子(用起来什么样)
下面这段展示工具从「定义」到「被自动调用」的全流程:
// 示意,非源码:体现 defineTool + 自动工具循环的用法
const getWeather = ai.defineTool(
{
name: 'getWeather',
description: '查询某座城市的当前天气', // 这句会原样给模型看
inputSchema: z.object({ city: z.string() }),
outputSchema: z.object({ tempC: z.number() }),
},
async ({ city }) => { // 这就是「真函数」
return { tempC: 22 }; // 真实实现里会去调天气 API
}
);
const { text } = await ai.generate({
prompt: '北京今天要带伞吗?',
tools: [getWeather], // 把工具交给模型
});
// generate 内部会:模型请求 getWeather → Genkit 执行 → 结果回灌 → 模型给出最终回答