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)进行多轮检索、工具调用和验证。
相关推荐
AI浩2 分钟前
Xiaomi-Lens-0 技术报告
人工智能·计算机视觉·1024程序员节
Rocky Ding*3 分钟前
【三年面试五年模拟】2026-10-20_淘天AI应用研发一面面经全解析
论文阅读·人工智能·深度学习·机器学习·面试·aigc·ai-native
Wang's Blog4 分钟前
Java 项目实战: 交友项目 - 圈子功能的表设计方案
java·开发语言·交友
Latchh9 分钟前
WebP转JPG背景变黑、边缘毛刺?4种方法
图像处理·人工智能·计算机视觉
碧海银沙音频科技研究院15 分钟前
基于炬芯ATS308X的DNN全连接神经网络手写数字识别系统设计
人工智能·深度学习·算法
xiangzhihong818 分钟前
番茄小说系统:从读者门户到作家与平台运营的多端实践
人工智能
古法搬砖工21 分钟前
MCP:给 AI Agent 装一个“万能 USB 接口”
人工智能·skill·mcp·搬砖工
能源革命21 分钟前
AI 日报|2026-10-23
人工智能
文丑颜不良啊22 分钟前
LeetCode601~625题目解析
java·leetcode
天空属于哈夫克327 分钟前
企业微信 API 二次开发与 AI 结合:如何设计智能消息处理流程
人工智能·企业微信