本页目录
到目前为止,我们一直在让 LLM 回答问题、扫描文档和提取数据。
但 LLM 能做的远不止这些,它们还可以与现实世界交互。
实现方式是调用我们提供的工具或函数。
Vercel AI SDK 为此提供了一流的解决方案。
先创建一个最简单的工具,再逐步扩展。
滚动式代码讲解
我们的工具只需向控制台记录内容。创建它时,先导入 tool from ai.
任何工具首先都需要描述它将接收的参数。
可以通过在工具上指定 parameters 来添加。
这和前面结构化输出的做法一样,使用 Zod Schema 完成。
还会使用 describe 描述 LLM 的各种参数。
接下来需要说明工具要做什么。
通过指定一个 execute 函数来完成。
这个 execute 函数可以是异步的,因此几乎能完成任何事情,例如调用 API、写入数据库等。
在这个例子中,只需向控制台记录内容。
接下来为工具添加一个 description 字段。
它会告诉 LLM 应该如何使用这个工具。
import { tool } from "ai";const logToConsoleTool = tool({});
工具创建好了,现在把它用于一次 generateText 调用。
滚动式代码讲解
创建一个名为 logToConsole的函数,并传入模型和提示词。
提供系统提示词,鼓励它使用工具。
最后把工具传给它。
import { generateText } from "ai";const logToConsole = async (prompt: string) => {await generateText({model,prompt,});};
回顾一下,我们创建了工具,把它传给 generateText ,并为它提供了简单的 系统提示词.
看看运行后会发生什么。
Hello, world!
成功!控制台中打印出了“hello world”。
调试
效果不错,但过程不够透明。该如何调试呢?
滚动式代码讲解
把结果中的 steps 属性解构出来,它来自 generateText.
steps ,它是 LLM 执行的每一步组成的数组。
我们稍后会介绍 steps ,因为它会涉及智能体行为和推理等有趣内容。
现在只从第一步中取出一个属性,也就是工具调用。
它会列出这一步调用的全部工具。
import { generateText } from "ai";const logToConsole = async (prompt: string) => {const { steps } = await generateText({model,prompt,system:`Your only role in life is to log ` +`messages to the console. ` +`Use the tool provided to log the ` +`prompt to the console.`,tools: {logToConsole: logToConsoleTool,},});};
运行后可以看到,工具名称 logToConsole 被调用了。
还可以看到传入的参数。
[{type: 'tool-call',toolCallId: 'toolu_012hbsiE2sXvPrAwAvE3kgxM',toolName: 'logToConsole',args: { message: 'Hello, world!' }}]
如果记录 toolResults ,那么……
console.dir(steps[0]?.toolResults, { depth: null });
就能看到 工具调用的结果。这个例子中函数没有返回任何内容,因此结果是 undefined.
[{toolCallId: 'toolu_012hbsiE2sXvPrAwAvE3kgxM',toolName: 'logToConsole',args: { message: 'Hello, world!' },result: undefined}]
这些 toolResults 可以反馈给 LLM,为它提供更多信息,尤其适用于跨多步执行的情况。
因此,使用 steps 进行调试,可以了解工具调用正在发生什么。