什么是 RAG?RAG 的主要流程是什么?
最后更新:1/12/2026
AI 助手
会员专享功能
只有会员才能使用 AI 生成答案功能。 立即升级
Other Answers (2)
RAG (Retrieval-Augmented Generation) 概述
什么是RAG?
RAG (Retrieval-Augmented Generation) 是一种结合检索和生成的大语言模型增强技术,它通过从外部知识库检索相关文档来辅助大语言模型生成更准确、更具事实性的回答。
RAG的主要优势
- 解决大模型幻觉问题:通过基于检索的真实信息生成回答
- 知识可更新:无需重新训练模型即可更新知识库
- 来源可追溯:可以展示生成回答所依据的文档
- 降低计算成本:相比扩大模型参数规模,检索增强是一种更经济的知识扩展方式
RAG的主要流程
1. 文档预处理与索引
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# 加载文档
loader = PyPDFLoader("example.pdf")
pages = loader.load()
# 文档分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
docs = text_splitter.split_documents(pages)
# 创建向量索引
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embeddings)
db.save_local("faiss_index")
2. 查询处理与检索
# 加载已有索引
db = FAISS.load_local("faiss_index", embeddings)
# 查询转换与检索
query = "什么是RAG?"
docs_and_scores = db.similarity_search_with_score(query, k=3)
3. 上下文增强生成
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# 定义提示模板
template = """基于以下上下文回答问题。如果不知道就说不知道。
上下文:
{context}
问题: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 构建RAG链
llm = ChatOpenAI(model="gpt-3.5-turbo")
chain = {"context": lambda x: db.similarity_search(x["question"], k=3),
"question": lambda x: x["question"]} | prompt | llm
# 执行查询
response = chain.invoke({"question": "什么是RAG?"})
print(response.content)
RAG的变体与进阶技术
- HyDE (Hypothetical Document Embeddings):先让模型生成假设性回答,再用其嵌入进行检索
- Self-RAG:模型自我评估是否需要检索以及检索结果的相关性
- FLARE:在生成过程中动态触发检索
- 迭代检索:基于初步结果进行多轮检索优化
应用场景
- 问答系统
- 客服机器人
- 法律/医疗专业咨询
- 企业内部知识库
- 事实核查
RAG通过将大语言模型的生成能力与精确的信息检索相结合,有效提升了生成内容的准确性和可靠性。
什么是 RAG?
RAG(Retrieval-Augmented Generation)是一种结合了信息检索和自然语言生成技术的模型。RAG 的设计目的是为了提高生成式模型在回答问题时的准确性和可靠性,特别是在处理需要大量背景知识的任务时。通过将检索模块与生成模块相结合,RAG 能够在生成答案之前,从大量的文档库中检索相关的上下文信息,从而提高生成答案的质量。
RAG 的主要流程
RAG 的主要流程可以分为以下几个步骤:
-
输入处理:
- 用户输入一个问题或任务。
- 例如,用户输入:“谁是美国第一位总统?”
-
文档检索:
- 使用检索模型(如 BM25、TF-IDF 或者基于 Transformer 的检索模型)从文档库中检索与输入问题相关的文档片段。
- 例如,检索到的文档片段可能包含:“乔治·华盛顿是美国的第一任总统,任期从 1789 年到 1797 年。”
-
上下文生成:
- 将检索到的文档片段与原始问题一起输入到生成模型中。
- 生成模型可以是基于 Transformer 的模型,如 T5 或 BART。
-
答案生成:
- 生成模型根据输入的问题和检索到的文档片段生成最终答案。
- 例如,生成的答案可能是:“美国的第一位总统是乔治·华盛顿。”
-
输出答案:
- 将生成的答案返回给用户。
代码示例
以下是一个简单的 RAG 实现示例,使用 Hugging Face 的 transformers 库中的预训练模型和检索器。
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
# 初始化 tokenizer 和 retriever
tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq")
retriever = RagRetriever.from_pretrained("facebook/rag-token-nq", index_name="exact", use_dummy_dataset=True)
# 初始化生成模型
generator = RagSequenceForGeneration.from_pretrained("facebook/rag-token-nq", retriever=retriever)
# 用户输入问题
question = "谁是美国第一位总统?"
# 编码问题
input_ids = tokenizer(question, return_tensors="pt").input_ids
# 生成答案
generated = generator.generate(input_ids)
answer = tokenizer.batch_decode(generated, skip_special_tokens=True)[0]
# 输出答案
print("生成的答案:", answer)
解释
-
初始化 tokenizer 和 retriever:
RagTokenizer用于将问题编码为模型可以理解的格式。RagRetriever用于从文档库中检索相关的文档片段。
-
初始化生成模型:
RagSequenceForGeneration是一个结合了检索和生成的模型,它使用RagRetriever从文档库中检索相关文档片段,并将这些片段与问题一起输入到生成模型中。
-
用户输入问题:
- 用户输入一个需要回答的问题。
-
编码问题:
- 使用
tokenizer将问题转换为模型可以处理的输入格式。
- 使用
-
生成答案:
- 使用
generator.generate方法生成答案。
- 使用
-
输出答案:
- 将生成的答案解码并输出给用户。
通过这种方式,RAG 能够在生成答案时利用大量的背景知识,从而提高答案的准确性和可靠性。