RAG(检索增强生成)技术详解:从原理到实践

1. 什么是 RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与大型语言模型(LLM)的技术框架。其核心思想是:当 LLM 需要回答用户查询时,先从外部知识库(如文档、数据库、网页)中检索出相关的信息片段,然后将这些信息作为上下文提供给 LLM,让 LLM 基于检索到的信息生成更准确、更可信、更具时效性的回答。

与传统仅依赖模型参数知识的生成方式相比,RAG 能够有效缓解 LLM 的"幻觉"问题,并支持动态更新知识,无需重新训练模型。

2. RAG 的核心组件与工作流程

一个典型的 RAG 系统包含以下核心组件和步骤:

  1. 文档加载与预处理:从各种来源(PDF、Word、网页、数据库)加载原始文档,并进行清洗、分段等预处理。
  2. 文本嵌入与向量化:使用嵌入模型(如 text-embedding-ada-002、BGE、Sentence-BERT)将文本片段转换为高维向量表示,并存入向量数据库。
  3. 查询处理与检索:将用户查询同样转换为向量,在向量数据库中进行相似性搜索(如余弦相似度),返回最相关的 K 个文本片段。
  4. 提示工程与上下文构建:将检索到的相关片段与用户查询一起,按照特定模板构建成提示(Prompt),输入给 LLM。
  5. 生成与后处理:LLM 基于提示生成最终答案,并可选择进行事实核查、格式调整等后处理。

3. RAG 的优势与挑战

3.1 主要优势

  • 知识实时性:通过更新知识库即可获取最新信息,无需重新训练昂贵的 LLM。
  • 可解释性与可信度:答案可追溯到具体的源文档片段,增强了可信度。
  • 缓解幻觉:将生成约束在检索到的事实上,减少了模型"编造"信息的风险。
  • 降低知识记忆负担:LLM 无需将所有知识都压缩到参数中,专注于推理和语言生成。

3.2 常见挑战

  • 检索质量:检索不到或检索到不相关文档会直接导致生成错误。
  • 上下文长度限制:检索到的文档总长度可能超出 LLM 的上下文窗口。
  • 多跳推理:对于需要串联多个文档才能回答的复杂问题,基础 RAG 可能失效。
  • chunk 边界效应:不合理的文本切分可能导致语义断裂,影响检索效果。

4. RAG 实践:一个简单的 Python 示例

以下是一个使用 LangChain 和 Chroma 向量数据库构建简易 RAG 管道的示例代码。

python 复制代码
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
1. 加载文档
loader = TextLoader("knowledge.txt")
documents = loader.load()
2. 分割文本
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
3. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
4. 构建检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
5. 创建 LLM 和 RAG 链
llm = ChatOpenAI(model="gpt-3.5-turbo")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type="stuff"  # 简单地将所有检索到的文档塞进提示
)
6. 提问
query = "RAG 的主要优势是什么?"
answer = qa_chain.invoke({"query": query})
print(answer["result"])

5. 进阶技术与优化方向

  • 查询重写/扩展:对原始查询进行改写或生成多个相关问题,以提升检索召回率。
  • 混合检索:结合基于向量的语义检索和基于关键词的稀疏检索(如 BM25)。
  • 重排序(Re-ranking):使用更精细的交叉编码器模型对初步检索结果进行重排序,提升精度。
  • 上下文压缩:对检索到的大量文档进行摘要或过滤,只将最相关的部分放入提示。
  • Agentic RAG:引入智能体(Agent)进行多轮检索、工具调用和验证。
相关推荐
Seven971 小时前
用300行代码带你手写简化版RPC框架
java
Python私教1 小时前
Django 做一个 AI 销售助手:读取客户记录,自动生成跟进计划
人工智能·python·django
leikooo1 小时前
ARTS 0802: 合并有序链表、AI 时代的技术断层与 TCP 200ms 延迟之谜
人工智能·tcp/ip·链表
动物园猫1 小时前
塑料瓶目标检测数据集:3,000张图像 | 目标检测
人工智能·目标检测·计算机视觉
zzzzzz3101 小时前
用 TRAE Work 拆解一次“老订单系统加退款状态机”的紧急方案
人工智能·程序员·workflow
Alex Gram1 小时前
双机热备软件哪个好
java·系统架构·c#·keepalived·高可用·双机热备·双机热备软件
LitchiCheng1 小时前
DGX Spark 进行 Comfyui 文生图,5秒一张图
人工智能·python
纳兰青华2 小时前
拼图大师:从“暴力尝试“到“动态规划“的拆字艺术
java·算法·动态规划
只是甲10 小时前
Text2SQL 系列博客 02:技术原理深度剖析 - 从自然语言到 SQL 的完整链路
人工智能·text2sql·nl2sql·ai agent·自助数据分析·data agent·agentic 数据洞察