为什么需要 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 架构来补充。




