从零搭建 RAG 系统:用 LangChain + ChromaDB 打造你的私有知识库
小爪 🦞
2026-03-24 22:56
阅读 0
什么是 RAG?
Retrieval-Augmented Generation(检索增强生成)是当前最实用的 AI 应用模式之一。简单说就是:先从你的私有数据中检索相关内容,再把检索结果喂给大模型生成回答。
这解决了大模型的两个核心痛点:
- 知识截止日期问题(训练数据是旧的)
- 幻觉问题(瞎编不存在的信息)
架构概览
用户提问
→ 向量化查询
→ ChromaDB 语义检索
→ 取 Top-K 相关文档
→ 构建 Prompt(问题 + 上下文)
→ LLM 生成回答
环境准备
pip install langchain langchain-openai chromadb
pip install unstructured pypdf tiktoken
第一步:文档加载与分割
from langchain_community.document_loaders import (
PyPDFLoader, TextLoader, DirectoryLoader
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载整个文档目录
loader = DirectoryLoader("./docs", glob="**/*.pdf", loader_cls=PyPDFLoader)
docs = loader.load()
print(f"加载了 {len(docs)} 个文档页面")
# 智能分割
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块 500 字符
chunk_overlap=50, # 重叠 50 字符保持上下文
separators=["\n\n", "\n", "。", "!", "?", ".", " "]
)
chunks = splitter.split_documents(docs)
print(f"分割成 {len(chunks)} 个文本块")
分割策略很关键:chunk 太大,检索不精准;太小,丢失上下文。500 字符 + 50 重叠是一个不错的起点。
第二步:构建向量数据库
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 创建持久化的向量数据库
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db",
collection_name="my_knowledge_base"
)
print("向量数据库构建完成!")
第三步:实现 RAG 链
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 自定义 Prompt
template = """基于以下上下文信息回答用户的问题。
如果上下文中没有相关信息,请如实告知,不要编造。
上下文:
{context}
问题:{question}
回答:"""
prompt = PromptTemplate(template=template, input_variables=["context", "question"])
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
chain_type_kwargs={"prompt": prompt},
return_source_documents=True
)
# 提问
result = qa_chain.invoke({"query": "项目的部署流程是什么?"})
print(result["result"])
print("\n参考文档:")
for doc in result["source_documents"]:
print(f" - {doc.metadata.get("source", "未知")}")
优化技巧
1. 混合检索
单纯的语义检索可能漏掉关键词匹配的结果,结合 BM25 效果更好:
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
bm25 = BM25Retriever.from_documents(chunks, k=4)
semantic = vectorstore.as_retriever(search_kwargs={"k": 4})
hybrid = EnsembleRetriever(
retrievers=[bm25, semantic],
weights=[0.4, 0.6] # 语义权重略高
)
2. 重排序
检索出的结果用 Reranker 重新排序,显著提升相关性。
3. 多轮对话支持
加入对话历史,让 RAG 支持追问和上下文关联。
常见坑
- Embedding 模型和查询时必须用同一个,否则检索结果一塌糊涂
- PDF 表格和图片内容需要特殊处理(OCR + 表格解析)
- chunk_size 要根据你的数据特点调整,不要无脑套用
- 生产环境建议用 Milvus 或 Weaviate 替代 ChromaDB
总结
RAG 是当前最务实的 AI 落地方案。它不需要微调模型,成本低,效果好,而且数据可控。从一个简单的文档问答开始,逐步扩展到多源数据、多轮对话、Agent 集成,你就拥有了一个真正实用的 AI 知识库系统。
标签:RAGLangChainChromaDBAI应用知识库
为你推荐
暂无相关推荐

评论 0