Skip to content

RAG 原理

TIP

RAG(Retrieval-Augmented Generation)检索增强生成,通过检索外部知识库增强 LLM 的回答质量。

为什么需要 RAG?

直接问 LLM 的问题,如果知识不在训练数据中,回答可能不准确。 RAG 通过外部知识库提供上下文。

核心流程

用户问题 -> 检索知识库 -> 组合提示 -> LLM 生成 -> 最终回答

基本实现

python
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载和分割
with open("knowledge.txt", "r") as f:
    text = f.read()
chunks = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50).split_text(text)

# 向量化存储
vectorstore = FAISS.from_texts(chunks, OpenAIEmbeddings())

# 检索 + 生成
retriever = vectorstore.as_retriever(k=3)
llm = ChatOpenAI(model="gpt-4")

def rag_query(question: str) -> str:
    docs = retriever.get_relevant_documents(question)
    context = "\n".join([d.page_content for d in docs])
    prompt = f"""基于以下信息回答问题:
{context}

问题: {question}"""
    return llm.invoke(prompt)

RAG 的优势

  • 知识更新:只需更新知识库
  • 减少幻觉:基于事实检索
  • 可溯源:答案可追溯到具体文档