本指南将手把手教你如何构建一个基于 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
项目准备
- 克隆项目模板:
git clone https://github.com/vercel/ai-sdk-rag-starter
cd ai-sdk-rag-starter
pnpm install
- 创建数据库
你可以选择:
- 使用 Vercel Postgres(免费托管);
- 或者在本地搭建 Postgres。
- 配置数据库连接
复制 .env.example 为 .env 并设置数据库连接字符串:
cp .env.example .env
设置 DATABASE_URL。
- 执行数据库迁移:
pnpm db:migrate
- 配置 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 工具
让模型可以根据用户提问,从数据库中检索相关信息作为回答依据。
检索过程:
- 对问题进行嵌入
- 查数据库中语义最相近的文本段
- 返回这些段落作为上下文
十、体验与优化
- 在页面中显示模型调用的工具名称(如:calling tool: addResource);
- 设置
maxSteps: 3,支持模型多轮调用工具并继续生成最终回答; - 查看数据库中的内容变化,验证是否真正保存了嵌入信息。
总结
你已经成功构建了一个支持:
✅ 用户输入
✅ 实时嵌入内容
✅ 向量语义检索
✅ 工具调用增强模型能力
✅ RAG 工作流串联
的智能聊天机器人!
未来你可以进一步拓展:
- 多语言支持
- 图片/文档嵌入
- 多模态输入
- 权限与身份识别