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 的知识过时、幻觉和私有数据三大问题
  • 核心流程:文档切片 → 转向量 → 存储 → 检索 → 生成
  • 比微调成本更低,知识更新也更简单
  • 是构建企业知识库、智能客服等应用的首选方案