什么是RAG?
检索增强生成(Retrieval-Augmented Generation)通过将外部知识库与LLM结合,解决了大模型知识滞后和幻觉问题。本文实战教程将使用LangChain作为编排框架,Chroma作为向量数据库。
环境准备
pip install langchain chromadb sentence-transformers pypdf
Step 1: 加载文档
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("knowledge_base.pdf")
docs = loader.load()
Step 2: 文档切分
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(docs)
Step 3: 创建向量存储
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(chunks, embeddings)
Step 4: 构建检索链
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
Step 5: 添加对话记忆(进阶)
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
conversation_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=vectorstore.as_retriever(),
memory=memory
)
测试运行
query = "什么是RAG?"
result = qa_chain.run(query)
print(result)
优化技巧
1. 选择更好的嵌入模型
- 中文场景推荐
BAAI/bge-large-zh-v1.5 - 多语言场景推荐
intfloat/multilingual-e5-large
2. 调整检索策略
- MMR:增加结果多样性
- 相似度阈值:过滤低相关片段
retriever = vectorstore.as_retriever(
search_type="mmr",
search_kwargs={"k": 5, "fetch_k": 20}
)
3. 混合检索
- 结合稀疏检索(BM25)和密集检索(嵌入)
from langchain.retrievers import EnsembleRetriever
bm25_retriever = ...
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, dense_retriever],
weights=[0.5, 0.5]
)
总结
通过本教程,你已掌握搭建RAG系统的核心流程。实际应用中,建议根据文档类型和查询特点调整切分策略和检索参数。完整的代码仓库已上传至GitHub,欢迎Star。