什么是 RAG?RAG 的主要流程是什么?

最后更新:1/12/2026

AI 助手

会员专享功能

只有会员才能使用 AI 生成答案功能。 立即升级

Other Answers (2)

RAG (Retrieval-Augmented Generation) 概述

什么是RAG?

RAG (Retrieval-Augmented Generation) 是一种结合检索和生成的大语言模型增强技术,它通过从外部知识库检索相关文档来辅助大语言模型生成更准确、更具事实性的回答。

RAG的主要优势

  • 解决大模型幻觉问题:通过基于检索的真实信息生成回答
  • 知识可更新:无需重新训练模型即可更新知识库
  • 来源可追溯:可以展示生成回答所依据的文档
  • 降低计算成本:相比扩大模型参数规模,检索增强是一种更经济的知识扩展方式

RAG的主要流程

1. 文档预处理与索引

python
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. 查询处理与检索

python
# 加载已有索引
db = FAISS.load_local("faiss_index", embeddings)

# 查询转换与检索
query = "什么是RAG?"
docs_and_scores = db.similarity_search_with_score(query, k=3)

3. 上下文增强生成

python
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的变体与进阶技术

  1. HyDE (Hypothetical Document Embeddings):先让模型生成假设性回答,再用其嵌入进行检索
  2. Self-RAG:模型自我评估是否需要检索以及检索结果的相关性
  3. FLARE:在生成过程中动态触发检索
  4. 迭代检索:基于初步结果进行多轮检索优化

应用场景

  • 问答系统
  • 客服机器人
  • 法律/医疗专业咨询
  • 企业内部知识库
  • 事实核查

RAG通过将大语言模型的生成能力与精确的信息检索相结合,有效提升了生成内容的准确性和可靠性。

什么是 RAG?

RAG(Retrieval-Augmented Generation)是一种结合了信息检索和自然语言生成技术的模型。RAG 的设计目的是为了提高生成式模型在回答问题时的准确性和可靠性,特别是在处理需要大量背景知识的任务时。通过将检索模块与生成模块相结合,RAG 能够在生成答案之前,从大量的文档库中检索相关的上下文信息,从而提高生成答案的质量。

RAG 的主要流程

RAG 的主要流程可以分为以下几个步骤:

  1. 输入处理

    • 用户输入一个问题或任务。
    • 例如,用户输入:“谁是美国第一位总统?”
  2. 文档检索

    • 使用检索模型(如 BM25、TF-IDF 或者基于 Transformer 的检索模型)从文档库中检索与输入问题相关的文档片段。
    • 例如,检索到的文档片段可能包含:“乔治·华盛顿是美国的第一任总统,任期从 1789 年到 1797 年。”
  3. 上下文生成

    • 将检索到的文档片段与原始问题一起输入到生成模型中。
    • 生成模型可以是基于 Transformer 的模型,如 T5 或 BART。
  4. 答案生成

    • 生成模型根据输入的问题和检索到的文档片段生成最终答案。
    • 例如,生成的答案可能是:“美国的第一位总统是乔治·华盛顿。”
  5. 输出答案

    • 将生成的答案返回给用户。

代码示例

以下是一个简单的 RAG 实现示例,使用 Hugging Face 的 transformers 库中的预训练模型和检索器。

python
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)

解释

  1. 初始化 tokenizer 和 retriever

    • RagTokenizer 用于将问题编码为模型可以理解的格式。
    • RagRetriever 用于从文档库中检索相关的文档片段。
  2. 初始化生成模型

    • RagSequenceForGeneration 是一个结合了检索和生成的模型,它使用 RagRetriever 从文档库中检索相关文档片段,并将这些片段与问题一起输入到生成模型中。
  3. 用户输入问题

    • 用户输入一个需要回答的问题。
  4. 编码问题

    • 使用 tokenizer 将问题转换为模型可以处理的输入格式。
  5. 生成答案

    • 使用 generator.generate 方法生成答案。
  6. 输出答案

    • 将生成的答案解码并输出给用户。

通过这种方式,RAG 能够在生成答案时利用大量的背景知识,从而提高答案的准确性和可靠性。