AIHero
    15 / 16Vercel AI SDK 教程

    使用 Vercel AI SDK 调用工具

    通过一个尽可能简单的示例,学习如何在 TypeScript 中使用 Vercel AI SDK 调用工具。

    Matt Pocock
    Matt Pocock
    源代码下一课
    本页目录

    到目前为止,我们一直在让 LLM 回答问题、扫描文档和提取数据。

    但 LLM 能做的远不止这些,它们还可以与现实世界交互。

    实现方式是调用我们提供的工具或函数。

    Vercel AI SDK 为此提供了一流的解决方案。

    先创建一个最简单的工具,再逐步扩展。

    滚动式代码讲解

    1

    我们的工具只需向控制台记录内容。创建它时,先导入 tool from ai.

    2

    任何工具首先都需要描述它将接收的参数。

    可以通过在工具上指定 parameters 来添加。

    这和前面结构化输出的做法一样,使用 Zod Schema 完成。

    3

    还会使用 describe 描述 LLM 的各种参数。

    4

    接下来需要说明工具要做什么。

    通过指定一个 execute 函数来完成。

    这个 execute 函数可以是异步的,因此几乎能完成任何事情,例如调用 API、写入数据库等。

    在这个例子中,只需向控制台记录内容。

    5

    接下来为工具添加一个 description 字段。

    它会告诉 LLM 应该如何使用这个工具。

    import { tool } from "ai";
    const logToConsoleTool = tool({});

    工具创建好了,现在把它用于一次 generateText 调用。

    滚动式代码讲解

    1

    创建一个名为 logToConsole的函数,并传入模型和提示词。

    2

    提供系统提示词,鼓励它使用工具。

    3

    最后把工具传给它。

    import { generateText } from "ai";
    const logToConsole = async (prompt: string) => {
    await generateText({
    model,
    prompt,
    });
    };

    回顾一下,我们创建了工具,把它传给 generateText ,并为它提供了简单的 系统提示词.

    看看运行后会发生什么。

    Hello, world!

    成功!控制台中打印出了“hello world”。

    调试

    效果不错,但过程不够透明。该如何调试呢?

    滚动式代码讲解

    1

    把结果中的 steps 属性解构出来,它来自 generateText.

    steps ,它是 LLM 执行的每一步组成的数组。

    我们稍后会介绍 steps ,因为它会涉及智能体行为和推理等有趣内容。

    2

    现在只从第一步中取出一个属性,也就是工具调用。

    它会列出这一步调用的全部工具。

    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 进行调试,可以了解工具调用正在发生什么。

    登录以保存进度。