大语言模型 RAG 架构实战:从文档到智能问答

Nina Santos | 2026-08-26T23:03:28 | Python, AI

完整实现一个 RAG 系统,涵盖文档切分、向量化、检索增强生成和评估,使用 LangChain + ChromaDB。

# 大语言模型 RAG 架构实战 ## RAG 是什么? Retrieval-Augmented Generation(检索增强生成)让大模型能"查阅"外部知识库后再回答,解决幻觉和知识过时问题。 ## 架构 ``` 用户问题 -> 向量化 -> 向量数据库检索 -> Top-K 文档片段 | v LLM (问题 + 上下文) -> 回答 ``` ## 文档切分 ```python from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, separators=["\n\n", "\n", "。", ",", " "], length_function=len, ) # 加载文档 from langchain.document_loaders import PyPDFLoader loader = PyPDFLoader("technical_manual.pdf") pages = loader.load() # 切分 chunks = splitter.split_documents(pages) print("切分为 {} 个片段".format(len(chunks))) ``` ## 向量存储 ```python 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" ) # 检索 retriever = vectorstore.as_retriever( search_type="mmr", # 最大边际相关性(多样性) search_kwargs={"k": 5} # 返回 5 个片段 ) ``` ## 构建 RAG Chain ```python from langchain.chat_models import ChatOpenAI from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate template = '''基于以下上下文回答问题。如果上下文中没有相关信息,请说"我无法在文档中找到相关信息"。 上下文: {context} 问题:{question} 回答:''' prompt = PromptTemplate(template=template, input_variables=["context", "question"]) llm = ChatOpenAI(model="gpt-4", temperature=0) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, chain_type_kwargs={"prompt": prompt}, return_source_documents=True, ) result = qa_chain({"query": "系统支持哪些认证方式?"}) print("回答:", result["result"]) print("来源:", [doc.metadata for doc in result["source_documents"]]) ``` ## 优化技巧 1. **Hybrid Search**:结合关键词搜索和向量搜索 2. **Re-ranking**:用 Cross-Encoder 对检索结果重排序 3. **Chunk 策略**:按段落/章节切分比固定长度效果更好 4. **元数据过滤**:在向量搜索前先按类别/日期过滤

← Back to Blog