RAG 技术原理、核心流程与最佳实践指南
前言
检索增强生成(Retrieval-Augmented Generation, RAG)是连接大语言模型(LLM)与私有知识库的关键技术。随着大模型应用的深入,RAG 在解决知识时效性、减少幻觉以及提升专业领域准确性方面扮演着核心角色。本文将深入解析 RAG 的原理、核心流程及工程化最佳实践。
发展历史
RAG 的概念最早由 Lewis 等人在 2020 年提出,旨在结合预训练语言模型的生成能力与外部文档的检索能力。早期研究主要集中在向量检索与文本生成的结合上。随着 Transformer 架构的普及和 Embedding 技术的成熟,RAG 逐渐从学术概念走向工业级应用,成为企业构建智能问答系统的标准范式。
原理与流程
RAG 的核心思想是通过检索外部数据,增强大模型的生成效果。其基本流程如下:
graph LR
P[数据处理] -.-> R[检索]
R --> A[利用 | 增强]
A --> G[生成]
- 数据预处理:这是常被忽略但至关重要的一步。高质量的效果依赖于高准确率的检索,而检索准确率直接取决于数据的清洗与处理质量。
- 检索(Retrieval):根据用户查询(Query),按照特定策略从海量数据中匹配相关内容。
- 利用与增强(Augmentation):将检索到的上下文信息整合进 Prompt,扩充模型的知识边界。
- 生成(Generation):大模型基于增强后的输入生成最终回答。
1. 数据处理
目标是将非结构化数据转化为模型可理解的特征。
1.1 数据结构化
传统上将数据分为三类:
- 高度结构化:Markdown, HTML, JSON, YAML 文件。
- 半结构化:Word 文档,带有部分格式信息的文本。
- 低结构化:PDF, 图片,纯文本。
传统方法通常先将数据转为文本,再提取特征。例如使用 OCR 识别 PDF 中的文字。现代多模态模型(如 GPT-4V)支持直接处理图像,提供了更多操作空间,但在企业级应用中,文本向量化仍是主流。
1.2 特征提取
推荐使用大模型 Embedding 进行特征提取。Embedding 对内容的特征提取主要有三种语义模式:
1.2.1 对称语义(Symmetric Semantics)
向量相似度是对称的,即 Similarity(A, B) = Similarity(B, A)。
- 应用场景:词向量(Word2Vec, GloVe)、文档相似度计算。
- 度量方式:余弦相似度(Cosine Similarity)。
1.2.2 非对称语义(Asymmetric Semantics)
向量相似度具有方向性,Similarity(A, B) ≠ Similarity(B, A)。
- 应用场景:问答系统(QA)、推荐系统、翻译模型。
- 特点:问题与答案的关系是非对称的,用户兴趣与物品属性也是非对称的。
1.2.3 混合语义
结合前两者优点,通常配合 Instruction Tuning,让模型理解指令意图。
- 代表模型:m3e, bge, gte 等开源 Embedding 模型。
1.2.4 范围控制
并非所有参与特征化的内容都能带来增益。在生成式场景中,精准的范围控制尤为重要。
- 示例:在 OnCall 小助手场景中,数据集应仅包含'问题 + 原因 + 结论',而非全部通话录音转写文本,否则噪声会干扰检索精度。
1.3 大文本分块(Chunking)
受限于上下文窗口,对大文本进行分治是必要的。
- 规则分割:使用
CharacterTextSplitter或RecursiveCharacterTextSplitter,基于字符数或自然段落分割,保留重叠(Overlap)以维持上下文连贯性。 - 结构感知分割:针对特定格式,如
MarkdownTextSplitter,PythonCodeTextSplitter,HTMLHeaderTextSplitter。 - Token 级分割:使用
SentenceTransformersTokenTextSplitter确保 Token 计数准确。 - 算法分割:基于 BERT 的中文分割模型
nlp_bert_document-segmentation_chinese-base,或基于 NLTK/spaCy 的分词器。 - 总结法:对于超长文本,先利用大模型提取关键摘要再进行索引,适合文档库规模极大的场景。
2. 检索与召回
准备好数据后,检索阶段决定了信息的获取效率。
2.1 常见检索方法
- 向量检索:将 Embedding 存入向量数据库(如 Milvus, Pinecone, ES Vector),发起 Query 时召回 Top-N 相似向量。
- 关键字检索:使用 Elasticsearch/OpenSearch,基于 TF-IDF 或 KNN 算法计算关键词相似度。
- 图数据检索:将数据关系存入 Neo4j/NebulaGraph,适用于社交网络分析、知识图谱关联查询。
- 关系数据库检索:适用于电商推荐、客服场景,从结构化表中筛选信息。
- 搜索引擎:开放域场景常先用搜索引擎填充信息,或采用后置的 ReAct 范式。
2.2 混合检索(Hybrid Search)
单一检索方式往往存在局限。混合策略结合向量检索(语义匹配)与关键字检索(精确匹配),按一定权重排序,能显著提升召回率。
- 策略:加权融合(Weighted Fusion)或重排序(Re-ranking)。
2.3 Query 生成与优化
检索前的 Query 处理直接影响准确率。
- 直接输入:Workflow 场景下,用户输入明确,可直接作为 Query。
- 模板拼装:结合用户画像、上下文、Prompt 设定等信息,格式化后特征化。适用于虚拟社交等复杂场景。
- 小模型生成:为避免模板带入过多噪声导致幻觉,可用轻量级模型总结用户意图后再检索。
- 动态检索:结合 ReAct 范式,根据推理步骤动态调整检索策略。
3. 利用、增强与生成
拿到检索结果后,需将其有效融入生成过程。
3.1 Prompt 上下文拼接
最基础的方式是将检索结果直接拼接在 Prompt 中。
- LangChain 实现:大多数 RAG Chain 默认采用此方式。
- 注意:需控制总 Token 数,避免超出模型上下文限制。
3.2 先拼接,再总结
为节省 Input Token,可先对检索内容进行摘要,再发送给大模型。
- 适用场景:检索结果较多且冗余度高时。
- 实现:通常将摘要模块集成在模型层,配合大量意图识别训练。
4. RAG 典型场景
- Knowledge(知识库):最常见的用法,用于企业内部文档问答。
- Memory(记忆):理论上属于 RAG 范畴,用于存储长期对话历史,但常被单独分类。
- 意图识别:利用检索结果作为 Few-shot 辅助,增强 CoT(思维链)能力。
- ReAct:RAG 可作为 Action 的一部分,辅助模型规划任务。
5. 评估与优化
构建 RAG 系统后,需关注以下指标:
- 检索准确率(Recall@K):相关文档是否出现在 Top-K 结果中。
- 生成质量:回答的准确性、流畅度及事实一致性。
- 幻觉率(Hallucination Rate):模型编造事实的比例。
- 延迟(Latency):端到端的响应时间。
优化建议:
- 引入重排序(Re-ranker):在粗排后增加精排模型,提升 Top 结果的相关性。
- 元数据过滤:在检索阶段增加权限、时间等元数据过滤条件。
- 提示词工程:优化 System Prompt,明确告知模型'若检索内容不足则回答不知道'。
6. 安全与隐私
- 提示词注入:防止用户通过特殊构造的 Query 绕过系统限制。
- 数据脱敏:在入库前对敏感个人信息(PII)进行掩码处理。
- 访问控制:确保检索结果符合用户的权限范围,避免越权访问。
结语
RAG 的思想看似简单,但工程落地涉及数据治理、检索策略、模型调优等多个环节。具体实施需紧密结合业务场景,持续迭代优化。

