从零搭建 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 知识库系统。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝