AIHero
    09 / 16Vercel AI SDK 教程

    使用 Vercel AI SDK 流式生成对象

    学习如何使用 Vercel AI SDK 流式接收 LLM 的结构化输出。

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

    滚动式代码讲解

    1

    上一个示例介绍了如何从 LLM 获取结构化输出,但所有输出都是一次性生成的。

    等待一小段时间后,全部输出会同时出现。

    2

    如果希望在输出生成时就看到内容,也就是流式传输一个对象,该怎么办?

    只需把 generateObject to streamObject.

    export const createRecipe = async (prompt: string) => {
    const { object } = await generateObject({
    model,
    schema,
    prompt,
    system:
    `You are helping a user create a recipe. ` +
    `Use British English variants of ingredient names,` +
    `like Coriander over Cilantro.`,
    });
    return object.recipe;
    };

    与上一个示例相比,会看到几处变化。

    首先,需要等待对象的最终结果。这里通过 await result.object.

    原因是 streamObject 会在第一个数据块到达时立即返回结果,而 await result.object 可以让我们等待最终对象。

    获取部分对象

    如果希望访问生成过程中的部分对象,可以使用 result.partialObjectStream.

    export const createRecipe = async (prompt: string) => {
    const result = await streamObject({
    model,
    system:
    `You are helping a user create a recipe. ` +
    `Use British English variants of ingredient names,` +
    `like Coriander over Cilantro.`,
    schemaName: "Recipe",
    schema,
    prompt,
    });
    for await (const obj of result.partialObjectStream) {
    console.clear();
    console.dir(obj, { depth: null });
    }
    const finalObject = await result.object;
    return finalObject.recipe;
    };

    它是异步可迭代对象,因此可以使用 for await...of 循环,记录对象传来时的每次更新。

    先清空控制台,再记录对象,就能看到它实时流入。

    运行看看会得到什么输出。我们问它如何制作鹰嘴豆泥。

    const recipe = await createRecipe(
    "How to make hummus?",
    );

    可以看到,对象内容在生成时不断传入,逐步构建成完整对象。

    流的最后一个数据块包含完整对象。

    使用场景

    在实际应用中,不会只把内容记录到控制台,而是通过网络发送这些数据块。

    这样用户就能实时看到对象逐步生成。与其一直等待后突然出现全部内容,显示进度总会带来更好的体验。

    这就是 streamObject 函数在 AI SDK 中的作用。

    登录以保存进度。