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)进行多轮检索、工具调用和验证。
相关推荐
u1301302 小时前
AI 日报(2026年10月2日)
人工智能
吠品2 小时前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
步行cgn2 小时前
Spring 全注解开发详解
java·后端·spring
数字化顾问3 小时前
(138页PPT)流程体系的建设优化与运营(附下载方式)
大数据·运维·人工智能
长河3 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
知了学历孙老师3 小时前
非全硕士上课怎么安排:周末班、集中班还是网络班
人工智能·考研·福建成考
code2cat3 小时前
Java进阶篇之LongAdder:把统计更新分散,再读取总和
java·并发编程·原子类·longadder
ksueh3 小时前
AI网文创作软件实测:蛙趣拼文是我筛完留下的一款
人工智能·ai写作·ai工具·ai写小说
凯哥Java3 小时前
写代码怎么避免逻辑漏洞?
java·开发语言·人工智能·自动化
是翎3 小时前
AI开发工程师面试指南
人工智能·面试·职场和发展