使用 AI SDK 的RAG Chatbot 指南

228 阅读4分钟

本指南将手把手教你如何构建一个基于 RAG(检索增强生成)技术的智能聊天机器人应用。

一、什么是 RAG?

RAG,全称为 Retrieval-Augmented Generation,意为“检索增强生成”。通俗点说,它的核心思想是:在大语言模型(LLM)回答问题时,为它提供与问题相关的外部信息,从而提升回答的准确性和实用性。

二、为什么要用 RAG?

虽然 LLM 很强大,但它只能基于训练时学到的数据进行推理。当你提出一些训练数据之外的问题时(例如:公司内部知识、最新发生的事件等),模型往往无法准确回答。RAG 机制通过实时检索相关资料,并把这些资料作为“上下文”提供给模型,从而解决这个问题。

比如:

普通对话:

用户:我最喜欢的食物是什么?
AI:我无法知道你个人的喜好。

加入上下文后的对话:

上下文:用户最喜欢吃鸡块。
用户提问:我最喜欢的食物是什么?
AI:你最喜欢的食物是鸡块!

这个例子展示了 RAG 的核心价值:通过“上下文增强”,让模型能正确回答原本答不出的个性化问题。

三、RAG 的原理结构

RAG 由以下几个核心步骤组成:

1. 嵌入(Embedding)

嵌入是一种将文本(或图片、语音等)转换为“向量”(一串数字)的技术。在向量空间中,相似的内容会更接近。我们可以通过“余弦相似度”计算两个向量的相似性。

举例来说,“猫”和“狗”的向量就会比较接近,而“猫”和“汽车”就相对更远。

2. 拆分内容(Chunking)

如果要处理较长的文本,比如一篇文章,就需要先将其拆成一个个较小的“段落”或“句子”,然后对每一段进行嵌入处理。

在本项目中,我们采用简单的按句号(.)分句的方式进行拆分。

3. 数据存储

将生成的每段文字和其对应的向量嵌入一起存入数据库中,方便后续进行语义检索。本项目使用 PostgreSQL 数据库,并借助 pgvector 插件支持向量检索功能。

4. 检索 & 生成(RAG 流程)

当用户发起问题时:

  • 将用户提问进行嵌入处理;
  • 在数据库中查找与该提问最相关的内容(基于向量相似度);
  • 将这些相关内容作为“上下文”,连同用户原始提问,一起交给模型生成答案。

四、动手实战:构建一个 RAG 聊天机器人

技术栈

  • 前端:Next.js 14(App Router)、shadcn-ui、TailwindCSS
  • AI 接口:OpenAI(GPT 模型)
  • 向量数据库:PostgreSQL + pgvector
  • ORM:Drizzle ORM
  • AI 工具:AI SDK

项目准备

  1. 克隆项目模板:
git clone https://github.com/vercel/ai-sdk-rag-starter
cd ai-sdk-rag-starter
pnpm install
  1. 创建数据库

你可以选择:

  • 使用 Vercel Postgres(免费托管);
  • 或者在本地搭建 Postgres。
  1. 配置数据库连接

复制 .env.example.env 并设置数据库连接字符串:

cp .env.example .env

设置 DATABASE_URL

  1. 执行数据库迁移:
pnpm db:migrate
  1. 配置 OpenAI API Key

前往 OpenAI 官网 获取 API Key,填入 .env 文件中。


五、添加嵌入逻辑

创建嵌入表

新建 lib/db/schema/embeddings.ts 文件,定义用于存储拆分内容和嵌入向量的数据库表结构。

添加嵌入处理函数

创建 lib/ai/embedding.ts 文件,添加:

  • generateChunks:文本拆分
  • generateEmbeddings:调用 OpenAI API 获取向量嵌入

使用 AI SDK 提供的 embedMany 工具,简化调用流程。


六、改造后端接口,支持嵌入生成与存储

修改 lib/actions/resources.ts 中的 createResource 函数,在保存资源的同时自动生成嵌入并写入数据库。


七、搭建前端界面

修改 app/page.tsx,使用 AI SDK 提供的 useChat Hook 快速构建聊天 UI。运行开发服务器:

pnpm dev

八、添加模型响应功能(API 路由)

app/api/chat/route.ts 中编写接口,接收用户消息,调用 OpenAI 模型生成响应。使用 streamText 实现流式返回。

可以通过 system 指令限制模型只根据工具(tool)返回的信息进行回答。


九、添加工具(Tool):增强模型能力

添加 addResource 工具

让模型可以自动将用户提供的知识存入数据库(如“我最喜欢的电影是《星际穿越》”)。

添加 getInformation 工具

让模型可以根据用户提问,从数据库中检索相关信息作为回答依据。

检索过程:

  • 对问题进行嵌入
  • 查数据库中语义最相近的文本段
  • 返回这些段落作为上下文

十、体验与优化

  1. 在页面中显示模型调用的工具名称(如:calling tool: addResource);
  2. 设置 maxSteps: 3,支持模型多轮调用工具并继续生成最终回答;
  3. 查看数据库中的内容变化,验证是否真正保存了嵌入信息。

总结

你已经成功构建了一个支持:

✅ 用户输入
✅ 实时嵌入内容
✅ 向量语义检索
✅ 工具调用增强模型能力
✅ RAG 工作流串联

的智能聊天机器人!

未来你可以进一步拓展:

  • 多语言支持
  • 图片/文档嵌入
  • 多模态输入
  • 权限与身份识别