RAG 检索增强生成完整实现方案
核心概念 RAG 通过检索外部知识库增强 LLM 输出质量,缓解幻觉问题。 RAG整体分为离线知识库构建(索引阶段)、在线问答推理(检索+生成阶段) 两大模块,行业通用标准流程,分朴素RAG(最简可用)、进阶RAG(生产优化)两层讲解,附技术选型与极简代码。
1. 离线阶段:知识库构建(一次性/定时增量更新)
作用:把企业私有文档转为可语义检索的向量索引,只需要跑一次,新增文档增量执行。
1.1. 步骤1:数据源接入 & 文本清洗
- 支持数据源:PDF/Word/Markdown、网页、数据库、接口文档、聊天记录
- 解析工具:PyPDF2、Unstructured、LangChain DocumentLoader、LlamaIndex
- 清洗操作:去水印、去乱码、去重复段落、剔除空白行、统一换行符,只保留有效正文
1.2. 步骤2:文本分块 Chunking(决定检索效果最关键一步)
长文档不能直接向量化,必须切割小块,适配模型上下文窗口:
- 通用参数:
chunk_size=500~1000字符,chunk_overlap=50~150字符(重叠防止段落语义断裂) - 切割算法:
- 基础:固定字符切割(RecursiveCharacterTextSplitter)
- 进阶:语义分割(按句子/段落边界拆分,不割裂完整语义)
- 元数据绑定:每个Chunk附带来源、标题、页码、更新时间,方便回答溯源
1.3. 步骤3:Embedding文本向量化
用嵌入模型把文字转为多维语义向量,语义相近的文本向量距离更近,用于相似度检索:
1.3.1. 主流模型选型
- 开源中文:BGE-M3、m3e、all-MiniLM-L6-v2(轻量)
- 闭源API:OpenAI text-embedding、阿里通义Embedding、腾讯混元Embedding
原理:相同模型生成的向量才能做相似度匹配,查询和文档必须用同一个Embedding模型
1.4. 步骤4:向量入库 & 构建索引
将「向量+原文Chunk+元数据」存入向量数据库,数据库内置相似度索引,百万级数据毫秒检索:
- 轻量本地测试:Chroma、FAISS(单机无服务)
- 生产分布式:Milvus、Weaviate、PGVector(Postgres向量插件)、Pinecone
2. 在线阶段:用户提问实时链路(每次问答执行)
2.1. 步骤1:Query预处理(优化检索召回)
用户提问先做增强,解决短句、歧义问题:
- 查询改写、Query扩展、意图识别、关键词提取
例:用户问“金税四期工单流程”,自动扩展为「金税四期工单提交、流转、审批、闭环规则」
2.2. 步骤2:Query向量化 + 粗召回(Retrieve)
- 用户问题用同一个Embedding模型生成查询向量
- 向量库执行余弦相似度匹配,召回Top-K(一般K=8~15)最相似文本块
2.3. 步骤3:重排序 Rerank(进阶优化,朴素RAG可省略)
粗召回存在大量低相关文本,用Cross-Encoder重排模型做二次打分,过滤无关内容,只保留Top3~5高匹配片段,大幅减少幻觉:
- 轻量开源:bge-reranker、bce-reranker
2.4. 步骤4:Prompt组装增强上下文
把用户问题 + 筛选后的文档片段 + 约束指令拼接成提示词,强制大模型只能基于检索内容回答:
标准Prompt模板示例:
你是专业运维助手,仅根据下方参考资料回答用户问题,禁止编造未提及内容,回答末尾标注资料来源。
参考资料:
{context}
用户问题:{question}
2.5. 步骤5:LLM生成答案并输出
将组装好的Prompt送入大模型,输出回答,附带文档来源溯源。
3. 两种实现方案:朴素RAG vs 生产级进阶RAG
3.1. 1)朴素RAG(最简Demo,快速验证)
流程:文档解析 → Chunk → Embedding入库 → Query向量化召回 → 直接拼接Prompt生成
省略:Query改写、Rerank、去重、分层检索,适合学习、小文档测试
3.2. 2)进阶RAG(企业落地标准)
增加优化模块:
- 多路检索:向量检索+关键词检索(BM25)混合召回,弥补纯语义漏招
- Rerank重排过滤低相关片段
- 文档分层:父文档检索(大Chunk存完整上下文,小Chunk做向量检索)
- 幻觉校验:LLM自检回答是否和资料冲突
- 增量更新向量库、缓存高频问答
4. 极简Python代码实现(LangChain+Chroma本地RAG)
# 安装依赖
# pip install langchain sentence-transformers chromadb pypdf
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import SentenceTransformerEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOllama
from langchain.chains import RetrievalQA
# 1.加载文档、切分Chunk
loader = PyPDFLoader("运维手册.pdf")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
split_docs = text_splitter.split_documents(docs)
# 2.初始化Embedding模型
embedding = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
# 3.向量入库
vector_db = Chroma.from_documents(split_docs, embedding, persist_directory="./chroma_db")
vector_db.persist()
# 4.构建检索器,召回top4
retriever = vector_db.as_retriever(search_kwargs={"k": 4})
# 5.本地大模型(Ollama llama3)
llm = ChatOllama(model="llama3")
# 6.组装RAG问答链
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, return_source_documents=True)
# 7.提问测试
res = qa_chain.invoke({"query": "金税四期工单处理流程"})
print(res["result"])
print("参考文档:", res["source_documents"])
5. 核心组件选型清单
5.1. Embedding模型
- 轻量本地:all-MiniLM、bge-small
- 高精度中文:bge-m3、m3e
- API:OpenAI embedding、腾讯混元Embedding
5.2. 向量数据库
- 测试单机:Chroma、FAISS
- 生产集群:Milvus、PGVector、Weaviate
5.3. LLM大模型
- 本地开源:Llama3、Qwen、GLM(Ollama一键部署)
- API:GPT、通义千问、混元大模型
5.4. 开发框架
- 快速开发:LangChain、LlamaIndex
- 原生自研:手动实现Embedding、相似度计算、向量存储
6. 结合你简历场景:AI大模型容器化RAG落地思路
你简历里做过Ollama+K8s大模型部署,RAG线上部署流程:
- K8s部署向量库Milvus集群,持久化存储向量数据
- 后端服务容器化:文档解析服务、Embedding推理服务、RAG问答服务
- Harbor私有镜像管理RAG全套镜像,HPA弹性扩缩容应对问答峰值
- 监控接入Prometheus+Grafana:监控检索耗时、向量库查询QPS、LLM推理延迟
- 配套自动化脚本:定时扫描知识库增量文档,自动分块、向量化入库
关联文档