AI

RAG 检索增强生成完整实现方案

·9 分钟阅读·3592 字

RAG 检索增强生成完整实现方案 的详细笔记

📋 目录

RAG 检索增强生成完整实现方案

核心概念 RAG 通过检索外部知识库增强 LLM 输出质量,缓解幻觉问题。 RAG整体分为离线知识库构建(索引阶段)在线问答推理(检索+生成阶段) 两大模块,行业通用标准流程,分朴素RAG(最简可用)、进阶RAG(生产优化)两层讲解,附技术选型与极简代码。

1. 离线阶段:知识库构建(一次性/定时增量更新)

作用:把企业私有文档转为可语义检索的向量索引,只需要跑一次,新增文档增量执行。

1.1. 步骤1:数据源接入 & 文本清洗

  1. 支持数据源:PDF/Word/Markdown、网页、数据库、接口文档、聊天记录
  2. 解析工具:PyPDF2、Unstructured、LangChain DocumentLoader、LlamaIndex
  3. 清洗操作:去水印、去乱码、去重复段落、剔除空白行、统一换行符,只保留有效正文

1.2. 步骤2:文本分块 Chunking(决定检索效果最关键一步)

长文档不能直接向量化,必须切割小块,适配模型上下文窗口:

  • 通用参数:chunk_size=500~1000字符chunk_overlap=50~150字符(重叠防止段落语义断裂)
  • 切割算法:
  1. 基础:固定字符切割(RecursiveCharacterTextSplitter)
  2. 进阶:语义分割(按句子/段落边界拆分,不割裂完整语义)
  • 元数据绑定:每个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+元数据」存入向量数据库,数据库内置相似度索引,百万级数据毫秒检索:

  1. 轻量本地测试:Chroma、FAISS(单机无服务)
  2. 生产分布式:Milvus、Weaviate、PGVector(Postgres向量插件)、Pinecone

2. 在线阶段:用户提问实时链路(每次问答执行)

2.1. 步骤1:Query预处理(优化检索召回)

用户提问先做增强,解决短句、歧义问题:

  • 查询改写、Query扩展、意图识别、关键词提取
    例:用户问“金税四期工单流程”,自动扩展为「金税四期工单提交、流转、审批、闭环规则」

2.2. 步骤2:Query向量化 + 粗召回(Retrieve)

  1. 用户问题用同一个Embedding模型生成查询向量
  2. 向量库执行余弦相似度匹配,召回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(企业落地标准)

增加优化模块:

  1. 多路检索:向量检索+关键词检索(BM25)混合召回,弥补纯语义漏招
  2. Rerank重排过滤低相关片段
  3. 文档分层:父文档检索(大Chunk存完整上下文,小Chunk做向量检索)
  4. 幻觉校验:LLM自检回答是否和资料冲突
  5. 增量更新向量库、缓存高频问答

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线上部署流程:

  1. K8s部署向量库Milvus集群,持久化存储向量数据
  2. 后端服务容器化:文档解析服务、Embedding推理服务、RAG问答服务
  3. Harbor私有镜像管理RAG全套镜像,HPA弹性扩缩容应对问答峰值
  4. 监控接入Prometheus+Grafana:监控检索耗时、向量库查询QPS、LLM推理延迟
  5. 配套自动化脚本:定时扫描知识库增量文档,自动分块、向量化入库

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro