Vercel AI SDK 实战:使用 Next.js 实现结构化数据流式传输

Vercel AI SDK 实战:使用 Next.js 实现结构化数据流式传输

ai Build AI-powered applications with React, Svelte, Vue, and Solid ai 项目地址: https://gitcode.com/gh_mirrors/ai/ai

引言

在现代 Web 应用中,处理大型结构化数据时,传统的等待全部数据生成完毕再展示的方式往往会导致用户体验不佳。Vercel AI SDK 提供了一种创新的解决方案——流式对象传输(Stream Object),允许我们将结构化数据分块实时传输到客户端,显著提升应用的响应速度和用户体验。

流式对象传输的核心优势

  1. 实时反馈:用户无需等待全部数据生成完毕即可看到部分结果
  2. 降低感知延迟:即使后端处理需要较长时间,用户也能立即看到进度
  3. 资源优化:可以更早地开始处理已接收到的数据部分

基础实现方案

1. 定义数据结构模式

首先需要明确我们要传输的数据结构。使用 Zod 库定义模式是最佳实践:

import { z } from 'zod';

export const notificationSchema = z.object({
  notifications: z.array(
    z.object({
      name: z.string().describe('虚构人物姓名'),
      message: z.string().describe('消息内容,不要使用表情符号或链接'),
    })
  ),
});

这种模式定义不仅用于验证数据,还能为 AI 模型提供生成指导。

2. 服务端实现

服务端使用 streamObject 函数处理请求:

import { openai } from '@ai-sdk/openai';
import { streamObject } from 'ai';
import { notificationSchema } from './schema';

export const maxDuration = 30;

export async function POST(req: Request) {
  const context = await req.json();

  const result = streamObject({
    model: openai('gpt-4-turbo'),
    schema: notificationSchema,
    prompt: `根据以下上下文生成3条消息应用通知:` + context,
  });

  return result.toTextStreamResponse();
}

关键点:

  • 设置合理的超时时间(maxDuration)
  • 使用强大的 AI 模型(如 gpt-4-turbo)
  • 将结果转换为文本流响应

3. 客户端实现

客户端使用 useObject 钩子处理流式数据:

'use client';

import { experimental_useObject as useObject } from '@ai-sdk/react';
import { notificationSchema } from './api/use-object/schema';

export default function Page() {
  const { object, submit, isLoading, stop } = useObject({
    api: '/api/use-object',
    schema: notificationSchema,
  });

  return (
    <div>
      <button
        onClick={() => submit('期末考试周的消息')}
        disabled={isLoading}
      >
        生成通知
      </button>

      {isLoading && (
        <div>
          <div>加载中...</div>
          <button type="button" onClick={() => stop()}>
            停止
          </button>
        </div>
      )}

      {object?.notifications?.map((notification, index) => (
        <div key={index}>
          <p>{notification?.name}</p>
          <p>{notification?.message}</p>
        </div>
      ))}
    </div>
  );
}

高级应用模式

1. 数组模式(Array Mode)

当需要生成列表数据时,数组模式更为高效:

服务端调整:

const result = streamObject({
  model: openai('gpt-4-turbo'),
  output: 'array',
  schema: notificationSchema,
  prompt: `生成3条消息应用通知:` + context,
});

客户端调整:

const { object } = useObject({
  api: '/api/use-object',
  schema: z.array(notificationSchema),
});

2. 无模式(No-Schema Mode)

对于动态数据结构,可以使用无模式:

const result = streamObject({
  model: openai('gpt-4-turbo'),
  output: 'no-schema',
  prompt: `生成3条消息应用通知:` + context,
});

最佳实践建议

  1. 错误处理:始终为流式请求添加错误处理逻辑
  2. 加载状态:提供清晰的加载指示器和取消操作
  3. 性能优化:合理设置超时时间,避免长时间运行
  4. 数据验证:即使使用无模式,也应在客户端验证数据
  5. 用户体验:考虑添加渐进式渲染动画,使数据加载更平滑

常见问题解答

Q:流式传输与传统API调用有何不同? A:传统方式是等待所有数据就绪后一次性返回,而流式传输是分块实时发送,显著减少用户等待时间。

Q:如何确保流式数据的安全性? A:应在服务端和客户端都进行数据验证,即使使用无模式也应检查基本数据结构。

Q:流式传输适合所有场景吗? A:不适合小数据量或需要完整数据才能进行后续处理的场景,最适合大型结构化数据的生成。

通过 Vercel AI SDK 的流式对象传输功能,开发者可以轻松构建出响应迅速、用户体验优秀的 AI 应用,特别是在处理复杂数据结构时展现出明显优势。

ai Build AI-powered applications with React, Svelte, Vue, and Solid ai 项目地址: https://gitcode.com/gh_mirrors/ai/ai

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/7cc20f916fe3 以下是对“js做的期末项目”的介绍:这是一个以童话为主题的前端开发作品,通过一系列功能实现,打造出了一个互动性强且视觉效果吸引人的用户界面,充分展现了作者对JavaScript语言的掌握程度。在项目中,作者运用了诸多JavaScript知识点。首先是DOM操作,JavaScript与HTML文档对象模型(DOM)紧密相连,可动态地创建、修改或删除页面元素,像document.getElementById()、document.querySelector()或document.querySelectorAll()等方法,就可能被用于选择和操作DOM节点。其次,为实现用户交互,例如轮播图切换等功能,addEventListener()函数被用来添加事件监听器,涵盖点击、滑动等事件,事件处理函数则依据用户行为执行相应逻辑。再者,JavaScript能够改变元素的CSS样,通过element.style.property = value的方实现诸如轮播图过渡动画、照片墙图片淡入淡出等动态效果。在处理照片墙等涉及集合数据的场景时,数组的遍历方法,如forEach()、for...of循环或map()等,可能会被用到,以便显示或操作多个元素。闭包(Closure)在项目中也发挥了作用,它常用于封装私有变量和函数,保障数据安全,同时实现一些特定功能,像计时器控制等。为了实现自动轮播等功能,setTimeout()或setInterval()函数被用来定期执行任务,比如切换图片。在控制程序流程方面,if...else、switch语句以及逻辑运算符&&、||、!不可或缺,它们依据条件执行不同的代码块。函数是JavaScript的重要组成部分,项目中可能定义了多个函数,包括初始化页面、处理用户输入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董灵辛Dennis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值