1. 什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与大型语言模型(LLM)的技术框架。其核心思想是:当 LLM 需要回答用户查询时,先从外部知识库(如文档、数据库、网页)中检索出相关的信息片段,然后将这些信息作为上下文提供给 LLM,让 LLM 基于检索到的信息生成更准确、更可信、更具时效性的回答。
与传统仅依赖模型参数知识的生成方式相比,RAG 能够有效缓解 LLM 的"幻觉"问题,并支持动态更新知识,无需重新训练模型。
2. RAG 的核心组件与工作流程
一个典型的 RAG 系统包含以下核心组件和步骤:
- 文档加载与预处理:从各种来源(PDF、Word、网页、数据库)加载原始文档,并进行清洗、分段等预处理。
- 文本嵌入与向量化:使用嵌入模型(如 text-embedding-ada-002、BGE、Sentence-BERT)将文本片段转换为高维向量表示,并存入向量数据库。
- 查询处理与检索:将用户查询同样转换为向量,在向量数据库中进行相似性搜索(如余弦相似度),返回最相关的 K 个文本片段。
- 提示工程与上下文构建:将检索到的相关片段与用户查询一起,按照特定模板构建成提示(Prompt),输入给 LLM。
- 生成与后处理: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)进行多轮检索、工具调用和验证。