引言
RAG(Retrieval Augmented Generation)是目前最流行的增强LLM知识的方法,通过从外部知识库检索相关信息,让AI回答更准确、更及时。本教程将使用LangChain框架和ChromaDB向量数据库,搭建一个完整的RAG系统。
环境准备
首先安装所需依赖:
pip install langchain chromadb openai tiktoken pypdf
本教程使用OpenAI的GPT-4o模型,你需要获取API Key并设置环境变量:
export OPENAI_API_KEY="your-api-key"
步骤一:加载文档
我们以PDF文件为例。假设有一个knowledge.pdf:
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("knowledge.pdf")
documents = loader.load()
print(f"加载了 {len(documents)} 页文档")
步骤二:文档分割
将长文档分割成小块,便于检索:
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
)
chunks = text_splitter.split_documents(documents)
print(f"分割为 {len(chunks)} 个块")
步骤三:创建向量存储
使用ChromaDB存储向量:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("向量数据库已创建并持久化")
步骤四:构建检索链
创建检索器并组合成RAG链:
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
步骤五:提问测试
query = "什么是RAG系统?"
result = qa_chain({"query": query})
print("回答:", result["result"])
print("来源:", [doc.metadata["source"] for doc in result["source_documents"]])
进阶优化
1. 使用更好的分割策略
对于代码或表格,使用LanguageRecursiveSplitter。
2. 混合检索
结合关键词搜索(BM25)和向量搜索,提高召回率。
from langchain.retrievers import BM25Retriever, EnsembleRetriever
bm25_retriever = BM25Retriever.from_documents(chunks)
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, retriever],
weights=[0.3, 0.7]
)
3. 添加记忆
使用ConversationBufferMemory保持对话上下文。
完整代码
将所有步骤整合到一个脚本rag_pipeline.py:
# rag_pipeline.py
import os
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 1. 加载
loader = PyPDFLoader("knowledge.pdf")
documents = loader.load()
# 2. 分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
# 3. 向量化
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
# 4. 检索+生成
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True)
# 5. 交互
while True:
query = input("\n请输入问题(输入exit退出):")
if query == "exit":
break
result = qa_chain({"query": query})
print(f"回答:{result['result']}")
总结
通过本教程,你已经掌握了用LangChain+ChromaDB搭建RAG系统的基本方法。你可以进一步扩展:支持多种文档格式、集成更多检索策略、部署为Web服务等。RAG是构建知识密集型AI应用的关键技术,值得深入学习。