AI知识篇
什么是RAG检索增强
给AI装上"外挂知识库"
大语言模型虽然强大,但有两个先天不足:知识有截止日期、不了解你的私有数据。RAG(Retrieval-Augmented Generation,检索增强生成) 就是解决这个问题的——在 AI 回答之前,先从你的知识库中检索相关信息,再让 AI 基于这些信息回答。
💡 类比:普通 AI 就像闭卷考试的学生(只靠记忆),RAG 就像开卷考试——先翻书找答案,再组织语言回答。
加载图表中...
RAG 解决了什么问题?
| 问题 | 说明 | RAG 的解决方式 |
|---|---|---|
| 知识过时 | 模型训练数据有截止日期 | 检索最新文档 |
| 幻觉 | AI 可能编造事实 | 只基于真实文档回答 |
| 私有知识 | 模型不知道你的内部资料 | 建立私有知识库 |
| 来源追溯 | 不知道答案从哪来 | 可以标注引用来源 |
RAG 的工作流程
加载图表中...
流程拆解
加载图表中...
代码实现
第一步:文档切片
// 把长文档切成小段
function splitDocument(text, chunkSize = 500) {
const chunks = [];
const paragraphs = text.split("\n\n");
let current = "";
for (const para of paragraphs) {
if ((current + para).length > chunkSize) {
if (current) chunks.push(current.trim());
current = para;
} else {
current += "\n\n" + para;
}
}
if (current) chunks.push(current.trim());
return chunks;
}
const chunks = splitDocument(documentText);
// ["第一段内容...", "第二段内容...", ...]
第二步:转向量并存储
import OpenAI from "openai";
const openai = new OpenAI();
// 文本转向量
async function getEmbedding(text) {
const res = await openai.embeddings.create({
model: "text-embedding-3-small",
input: text,
});
return res.data[0].embedding;
}
// 存入 Supabase
for (const chunk of chunks) {
const embedding = await getEmbedding(chunk);
await supabase.from("documents").insert({
content: chunk,
embedding,
});
}
第三步:检索 + 生成
async function askWithRAG(question) {
// 1. 把问题转成向量
const questionEmbedding = await getEmbedding(question);
// 2. 从向量数据库检索最相关的片段
const { data: docs } = await supabase.rpc("match_documents", {
query_embedding: questionEmbedding,
match_count: 3, // 取最相关的3段
});
// 3. 组装提示词
const context = docs.map(d => d.content).join("\n\n");
// 4. 发给大语言模型
const completion = await openai.chat.completions.create({
model: "gpt-4",
messages: [
{
role: "system",
content: `根据以下参考文档回答用户的问题。如果文档中没有相关信息,请说明"文档中没有找到相关内容"。
参考文档:
${context}`
},
{ role: "user", content: question },
],
});
return {
answer: completion.choices[0].message.content,
sources: docs.map(d => d.content.slice(0, 50) + "..."),
};
}
// 使用
const result = await askWithRAG("公司年假有多少天?");
console.log(result.answer); // "根据文档,入职满一年的员工享有10天年假..."
console.log(result.sources); // ["员工手册第三章:假期规定..."]
RAG vs 微调(Fine-tuning)
| 对比 | RAG | 微调 |
|---|---|---|
| 原理 | 检索外部知识 + 生成 | 在模型上继续训练 |
| 成本 | 低(只需向量数据库) | 高(需要GPU训练) |
| 知识更新 | 简单(更新文档即可) | 复杂(需要重新训练) |
| 适合场景 | 问答、知识库、搜索 | 改变模型的风格/能力 |
| 实施难度 | 简单 | 较复杂 |
加载图表中...
RAG 的实际应用
| 应用 | 说明 |
|---|---|
| 企业知识库 | 员工问内部政策、流程 |
| 客服机器人 | 基于产品文档自动回答 |
| 技术文档问答 | 基于API文档回答开发问题 |
| 法律/医疗助手 | 基于专业文献回答 |
| 个人笔记搜索 | 搜索和总结自己的笔记 |
加载图表中...
优化 RAG 效果的技巧
| 技巧 | 说明 |
|---|---|
| 合理切片 | 太大会引入噪音,太小会丢失上下文 |
| 重叠切片 | 相邻片段有重叠部分,避免关键信息被切断 |
| 混合检索 | 向量搜索 + 关键词搜索结合 |
| 重排序 | 检索结果再用模型排序,提高相关性 |
| 优化提示词 | 明确告诉模型"只根据提供的文档回答" |
🎯 AI编程小贴士:想给你的网站加一个"智能问答"功能?告诉 AI"帮我用 Next.js + OpenAI + Supabase pgvector 实现一个 RAG 知识库问答系统",它会帮你从文档处理到前端对话界面一步步实现。
小结
- RAG 让 AI 先检索你的文档,再基于文档回答问题
- 解决了 LLM 的知识过时、幻觉和私有数据三大问题
- 核心流程:文档切片 → 转向量 → 存储 → 检索 → 生成
- 比微调成本更低,知识更新也更简单
- 是构建企业知识库、智能客服等应用的首选方案