为什么需要 RAG

大模型有两个天然局限:一是知识有截止日期,不知道最新的信息;二是不知道你公司的内部资料。

RAG(Retrieval-Augmented Generation,检索增强生成)解决的就是第二个问题。它让 AI 在回答问题之前,先从你的知识库里检索相关内容,然后基于检索到的内容生成回答。

简单说:RAG = 搜索 + AI 回答

RAG 的基本流程

用户提问
  ↓
① 把问题转成向量(embedding)
  ↓
② 在向量数据库中搜索最相关的文档片段
  ↓
③ 把检索到的片段 + 原始问题一起发给大模型
  ↓
④ 大模型基于检索到的内容生成回答

关键在于第②步:不是简单的关键词匹配,而是语义搜索。用户问"退货政策是什么",即使文档里写的是"商品退换货规则",也能匹配到。

搭建一个简单的 RAG 系统

第一步:准备文档

把你的知识库文档准备好。支持的格式很多:PDF、Word、Markdown、网页、纯文本。

第二步:文档分块(Chunking)

长文档需要拆分成小块(通常 500-1000 tokens 一块)。分块策略很重要:

  • 按段落分块优于按字数分块
  • 每块之间保留一些重叠(overlap),避免信息在分块边界丢失
  • 表格和代码块最好整块保留,不要拆开

第三步:向量化(Embedding)

把每个文档块转成一个向量(一串数字),代表这段文字的"含义"。

常用的 embedding 模型:

  • OpenAI text-embedding-3-small(效果好,需要 API)
  • BGE-M3(开源,支持中文,本地运行)
  • Jina embeddings v3(开源,多语言)

第四步:存入向量数据库

把向量存入向量数据库,用于后续搜索。

常用向量数据库:

  • Chroma(轻量,适合本地开发)
  • Milvus(高性能,适合生产环境)
  • Qdrant(Rust 编写,速度快)
  • FAISS(Facebook 开源,适合大规模)

第五步:检索 + 生成

用户提问时,把问题向量化,在数据库中搜索最相似的 Top-K 个文档块,然后把这些块和问题一起发给大模型。

# 简化示例
relevant_chunks = vector_db.search(question_embedding, top_k=5)
context = "
".join(relevant_chunks)
prompt = f"根据以下信息回答问题:
{context}

问题:{question}"
answer = llm.generate(prompt)

提升 RAG 质量的技巧

1. 分块质量决定回答质量 垃圾分块 → 垃圾检索 → 垃圾回答。花时间优化分块策略比换模型更有效。

2. 混合搜索 向量搜索 + 关键词搜索结合使用。向量搜索擅长语义匹配,关键词搜索擅长精确匹配(如产品型号、人名)。

3. 重排序(Reranking) 检索到的 Top-K 结果用一个更精确的模型重新排序,把最相关的排到最前面。

4. 回答引用来源 让 AI 在回答中标注信息来自哪个文档,方便用户验证。

5. 定期更新索引 知识库文档更新后,需要重新向量化并更新数据库。

现成的 RAG 工具

不想自己搭?这些工具可以开箱即用:

  • Dify:开源 LLM 应用平台,可视化搭建 RAG 流程
  • FastGPT:国产开源 RAG 平台,中文支持好
  • Anything LLM:本地 RAG 工具,隐私安全
  • ChatGPT + 文件上传:最简单但功能有限

RAG 的局限

RAG 不是万能的。它依赖检索质量——如果知识库里没有相关内容,AI 也答不出来。它也不能做复杂推理("根据这三条政策,我的情况应该怎么处理"),需要更高级的 Agent 架构来补充。