前言
检索增强生成(Retrieval-Augmented Generation, RAG)是近年来大语言模型(LLM)落地应用中最关键的技术架构之一。它通过引入外部知识库,有效解决了大模型知识截止、幻觉问题以及私有数据无法利用的痛点。
本文将深入解析 RAG 的核心原理、完整技术流程、数据处理策略、检索优化方案及工程化最佳实践,帮助开发者构建高效、准确的企业级知识库系统。
一、RAG 发展背景与核心定义
1.1 为什么需要 RAG?
大语言模型虽然具备强大的通用能力,但在面对特定领域知识时存在明显局限:
- 知识时效性:模型训练数据截止于过去,无法获取最新信息。
- 幻觉问题:模型可能编造事实,缺乏依据。
- 隐私与安全:企业敏感数据不能直接用于模型微调或公开访问。
RAG 通过'检索 + 生成'的模式,在不重新训练模型的前提下,将外部权威数据注入到生成过程中,实现精准回答。
1.2 核心流程概览
RAG 的标准工作流包含四个主要阶段:
- 数据预处理:清洗、分块、向量化。
- 检索召回:根据用户查询匹配相关文档片段。
- 上下文增强:将检索结果组装为 Prompt。
- 模型生成:基于增强后的上下文输出最终答案。
graph LR
A[用户 Query] --> B(检索模块)
C[知识库] --> B
B --> D{重排序/过滤}
D --> E[Prompt 构建]
E --> F[大模型生成]
F --> G[最终回答]
二、数据预处理与特征提取
高质量的数据处理是 RAG 效果的基础。若输入数据质量差,检索准确率将大幅下降。
2.1 数据结构化与清洗
原始数据通常包含噪声,需进行标准化处理:
- 非结构化文本:PDF、Word、Markdown 等,需去除页眉页脚、特殊符号、HTML 标签。
- 多模态数据:图片、表格可通过 OCR 或专用解析器转换为文本描述。
- 结构化数据:数据库记录可转为自然语言描述后入库。
2.2 文本分块(Chunking)策略
由于 Embedding 模型和 LLM 的上下文窗口限制,长文档必须分割。常见策略包括:
2.2.1 固定长度分块
按字符数或 Token 数切分。简单但容易破坏语义完整性。
from langchain.text_splitter import CharacterTextSplitter
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_text(text)
2.2.2 递归分块
优先按段落、标题分割,再按大小切分,保留层级结构。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
separators=["\n\n", "\n", " ", ""],
chunk_size=1000,
chunk_overlap=200
)
2.2.3 语义分块
利用 Embedding 相似度判断段落边界,确保语义连贯。
2.3 Embedding 模型选择
Embedding 负责将文本映射为向量。选择需考虑场景:
- 对称语义:适用于文档间相似度计算(如 Word2Vec)。
- 非对称语义:适用于问答匹配(Query vs Document),如 BGE-M3、M3E。
- 指令微调模型:支持 Instruction Tuning,能更好理解任务意图,如 GTE-Qwen。
建议优先选用开源且性能优秀的中文模型,如 BAAI/bge-large-zh-v1.5。
三、检索与召回机制
检索是 RAG 的核心环节,决定了上下文的准确性。
3.1 向量检索
将文本转化为向量存入向量数据库(Vector DB),使用近似最近邻搜索(ANN)算法。
- 常用库:Milvus、Pinecone、ChromaDB、Faiss。
- 索引算法:HNSW(高精度)、IVF(高吞吐)。
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
vector_store = Chroma.from_documents(documents=chunks, embedding=embeddings)
results = vector_store.similarity_search(query, k=5)
3.2 关键字检索
结合 BM25 等传统算法,对专有名词、实体词更敏感。适合精确匹配场景。
3.3 混合检索(Hybrid Search)
结合向量检索与关键字检索,加权融合结果,提升召回率。
- 策略:RRF(倒数排名融合)或线性加权。
- 重排序(Rerank):使用 Cross-Encoder 模型对初步召回结果进行精细化打分,选取 Top-N。
3.4 Query 优化
直接搜索用户 Query 往往效果不佳,需进行改写:
- Query 重写:补全省略信息,统一术语。
- 多路召回:同时发起多个不同策略的检索请求。
- HyDE:假设性文档嵌入,先生成假答案再检索。
四、生成与增强策略
检索到的内容需经过处理才能送入 LLM。
4.1 Prompt 构建
典型模板如下:
你是一个智能助手。请根据以下参考信息回答问题。
参考信息:
{context}
问题:{query}
请基于参考信息作答,如果不知道请说明。
4.2 上下文管理
- 滑动窗口:当检索结果过多时,丢弃最旧或相关性最低的片段。
- 摘要压缩:先对检索内容进行摘要,减少 Token 消耗。
4.3 幻觉抑制
- 约束输出:在 System Prompt 中明确要求'仅依据提供信息'。
- 置信度阈值:设定相似度阈值,低于阈值则拒绝回答。
五、评估与监控
构建 RAG 系统后,必须建立评估体系。
5.1 评估指标
- 检索指标:Recall@K, MRR(平均倒数排名)。
- 生成指标:Faithfulness(忠实度)、Answer Relevance(答案相关性)。
- 工具:Ragas、TruLens。
5.2 持续迭代
收集用户反馈(点赞/点踩),分析 Bad Case,优化分块策略或 Embedding 模型。
六、最佳实践总结
- 数据质量优先:清洗比模型调优更重要。
- 分层存储:热数据用内存库,冷数据用对象存储。
- 缓存机制:对高频 Query 设置缓存,降低延迟。
- 安全合规:对检索内容进行权限校验,防止越权访问。
- 成本优化:小模型做检索,大模型做生成;合理使用量化技术。
七、结语
RAG 并非银弹,其效果高度依赖业务场景与数据质量。开发者需根据实际业务需求,灵活调整检索策略与生成参数,并建立完善的监控闭环,才能实现稳定可靠的知识服务。

