什么是 RAG

RAG(Retrieval-Augmented Generation,检索增强生成)是让大模型"阅读"你的私有文档并回答问题的技术方案。它的工作流程是:

用户提问 → 在文档中检索相关内容 → 把检索结果和问题一起发给 LLM → LLM 生成答案

RAG 解决了大模型的两个核心问题:知识截止日期和私有数据访问。

技术栈选型

组件推荐方案替代方案
LLMClaude API / DeepSeekOpenAI GPT-4o
框架LangChainLlamaIndex
向量数据库Chroma(轻量)Pinecone, Milvus, Weaviate
Embedding 模型text-embedding-3-smallbge-large-zh(中文)
文档解析Unstructured / PyPDFLangChain 内置 loader

第一步:环境搭建

pip install langchain langchain-community chromadb openai unstructured

第二步:加载和切分文档

from langchain.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载文档
loader = DirectoryLoader('./docs/', glob="**/*.txt", loader_cls=TextLoader)
documents = loader.load()

# 切分文档(每个 chunk 约 500 字,重叠 50 字)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", ",", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"共加载 {len(documents)} 个文档,切分为 {len(chunks)} 个片段")

第三步:向量化存储

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

第四步:构建问答链

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)

# 提问
answer = qa_chain.run("公司年假政策是什么?")
print(answer)

第五步:优化检索质量

基础 RAG 的检索质量通常不够好,三个优化技巧:

结合关键词检索(BM25)和语义检索,取长补短。

from langchain.retrievers import BM25Retriever, EnsembleRetriever

bm25_retriever = BM25Retriever.from_documents(chunks)
semantic_retriever = vectorstore.as_retriever()

ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, semantic_retriever],
    weights=[0.3, 0.7]
)

2. 重排序(Re-Ranking)

检索出 Top-10 个相关片段,再用 Cross-Encoder 模型重新排序,取 Top-3。

from sentence_transformers import CrossEncoder

reranker = CrossEncoder('BAAI/bge-reranker-large')
# 对检索结果重新打分排序

3. 查询改写(Query Rewriting)

用户的问题往往不够精确,先用 LLM 改写问题再检索。

rewrite_prompt = "将以下用户问题改写为更精确的检索查询:{query}"
rewritten_query = llm.invoke(rewrite_prompt.format(query=user_query))

进阶:带记忆的多轮对话 RAG

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain

memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=vectorstore.as_retriever(),
    memory=memory
)

常见问题

问题原因解决方案
检索不到相关内容文档切分粒度不合适调整 chunk_size 和 overlap
答案不准确检索到的内容不相关加 Re-Ranking 或混合检索
回答太慢检索+推理串行使用流式输出,优化 embedding 模型
中文效果差embedding 模型偏英文使用 bge-large-zh 等中文模型

总结

RAG 是 2026 年 AI 应用开发的基础技能。一个基础 RAG 系统 100 行代码就能搭建,但要达到生产级别,还需要混合检索、重排序、查询改写等优化。建议先跑通基础流程,再逐步优化。