AI百事通

从零搭建RAG系统:LangChain与ChromaDB实战教程

📅 2026-06-10📰 ai_generated👁 1 次阅读
从零搭建RAG系统:LangChain与ChromaDB实战教程
RAGLangChainChromaDB教程向量数据库

引言

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应用的关键技术,值得深入学习。