做一个有温度和有干货的技术分享作者 —— Qborfy
今天我们来学习 RAG(Retrieval-Augmented Generation)检索增强生成
一句话核心: RAG 是一种让大模型能够”查资料再回答”的技术,通过检索外部知识库来增强生成内容的准确性和时效性。
通俗地讲,如果把大模型比作一个学生,传统模型就像”闭卷考试”——只能凭借训练时记住的知识回答问题。而 RAG 就像”开卷考试”——遇到问题时,可以先翻书查资料,然后基于查到的内容给出更准确的答案。
需要注意的是,RAG 并不是让模型”记住”新知识,而是在回答问题时动态地从外部知识库中检索相关信息,然后将这些信息作为上下文提供给模型。
它的核心价值在于解决大模型的知识局限性:包括知识过时、缺乏专业领域知识、容易产生幻觉(编造不存在的信息)等问题。通过 RAG,我们可以让模型访问最新的、专业的、私有的知识,而无需重新训练模型。
是什么
1 | --- |
通过一张图来理解 RAG 的工作原理:
1 | graph TB |
RAG 工作流程说明:
这个流程的核心在于,用户的问题会经过两个关键阶段:
离线阶段(知识库构建):
- 将原始文档进行文本提取和分块处理
- 使用 Embedding 模型将文本块转换为向量
- 存储到向量数据库中,这个过程只需要执行一次
在线阶段(检索增强生成):
- 用户提问后,先将问题向量化
- 在向量数据库中进行语义检索,找到最相关的文档块
- 将检索到的文档和原始问题一起构建提示词
- 输入大模型生成最终答案,并附带引用来源
RAG 的核心组成
一个完整的 RAG 系统通常包含以下几个关键部分:
1. 知识库构建
文档处理流程:
1 | 原始文档 → 文本提取 → 分块(Chunking) → 向量化(Embedding) → 存入向量数据库 |
- 文档加载:支持 PDF、Word、网页、Markdown 等多种格式
- 文本分块:将长文档切分成小块,便于检索和处理
- 向量化:使用 Embedding 模型将文本转换为向量
- 向量存储:将向量存入专门的向量数据库
2. 检索系统
- 语义检索:基于问题的语义含义找到相关文档
- 混合检索:结合关键词检索和语义检索
- 重排序(Reranking):对检索结果进行二次排序,提高相关性
3. 生成系统
- 提示词工程:设计合适的 Prompt 模板
- 上下文管理:控制输入大模型的文档长度
- 答案生成:基于检索内容生成最终回答
RAG vs 其他方法对比
| 维度 | 传统大模型 | Fine-tuning | RAG |
|---|---|---|---|
| 知识更新 | 需要重新训练 | 需要重新微调 | 实时更新文档即可 |
| 成本 | 推理成本 | 训练成本高 | 中等(检索+推理) |
| 准确性 | 可能产生幻觉 | 较准确但固化 | 基于真实文档,可追溯 |
| 专业知识 | 通用知识 | 可定制 | 灵活添加专业文档 |
| 可解释性 | 黑盒 | 黑盒 | 可追溯到源文档 |
怎么做
下面我们通过几个案例来理解 RAG 的使用场景和实现方式。
案例 1:企业知识库问答系统
这是 RAG 最经典的应用场景,帮助员工快速查询公司内部文档。
场景描述:
- 公司有大量内部文档:产品手册、技术文档、规章制度等
- 员工需要快速找到相关信息
- 传统搜索只能找到文档,还需要人工阅读
RAG 解决方案:
1 | from langchain.embeddings import OpenAIEmbeddings |
案例 2:智能客服系统
场景:电商平台需要自动回答用户关于商品、物流、售后的问题。
实现要点:
- 知识库:商品信息、常见问题、物流政策、售后流程
- 检索策略:混合检索(关键词 + 语义)
- 答案生成:友好的对话式回答
1 | from langchain.chains import RetrievalQA |
案例 3:学术论文助手
场景:研究人员需要快速查询和理解大量学术论文。
技术亮点:
- 文档分块策略:按段落或固定长度分块
- 元数据管理:保存论文标题、作者、发表时间等
- 引用追踪:显示答案来自哪篇论文的哪个部分
1 | from langchain.document_loaders import PyPDFLoader |
实战案例:完整的 RAG 系统
下面我们用 LangChain 实现一个完整的 RAG 系统:
1 | from langchain.document_loaders import DirectoryLoader, TextLoader |
进阶技巧
1. 混合检索(Hybrid Search)
结合关键词检索和语义检索,提高准确率:
1 | from langchain.retrievers import BM25Retriever, EnsembleRetriever |
2. 重排序(Reranking)
对检索结果进行二次排序,提高相关性:
1 | from langchain.retrievers import ContextualCompressionRetriever |
3. 多查询检索(Multi-Query Retrieval)
自动生成多个相关查询,扩大检索范围:
1 | from langchain.retrievers.multi_query import MultiQueryRetriever |
❄️ 冷知识
分块大小很关键:
chunk_size太小会丢失上下文,太大会引入噪音。一般建议 500-1000 字符,具体取决于文档类型。中文文档通常比英文需要更小的chunk_size。Overlap 不是越大越好:
chunk_overlap(重叠部分)是为了避免重要信息被切断,但过大会导致重复内容过多,影响检索效率。一般设置为chunk_size的 10-20%。向量数据库的选择:
- Chroma:轻量级,适合原型开发
- Pinecone:云服务,适合生产环境
- Milvus:开源,适合大规模部署
- Weaviate:支持混合检索,功能强大
Embedding 模型的影响:不同的 Embedding 模型会显著影响检索效果。OpenAI 的
text-embedding-3-large效果好但成本高,国产模型如智谱的embedding-2性价比更高。RAG 的”幻觉”问题:虽然 RAG 能减少幻觉,但如果检索到的文档不相关,模型仍可能基于错误信息生成答案。因此检索质量是 RAG 系统的核心。
与 Function Calling 的关系:RAG 可以看作是一种特殊的 Function Calling,其中”函数”就是”检索知识库”。实际应用中,两者常常结合使用:用 Function Calling 决定何时需要检索,用 RAG 执行检索和生成。
GraphRAG 的兴起:微软提出的 GraphRAG 将知识库构建为知识图谱,能够更好地理解实体关系和复杂查询,是 RAG 技术的重要发展方向。
参考资料
- 本文作者: Qborfy
- 本文链接: https://www.qborfy.com/ailearn/daily/18.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
