用Python + LangChain打造个人AI知识库:从零搭建RAG系统实战教程

RAG(检索增强生成)是2025年最实用的AI应用范式之一。本文将手把手教你用Python + LangChain从零搭建一个个人知识库RAG系统,让你的AI助理能够基于你自己的文档回答问题。

一、什么是RAG?

RAG = Retrieval Augmented Generation(检索增强生成)。简单来说:
1. 用户提问 → 2. 从文档库中检索相关片段 → 3. 将片段拼入提示词 → 4. AI基于检索到的信息回答

相比直接问AI,RAG的优点是:答案基于你的数据,幻觉率大幅降低,且支持私有知识不泄露。

二、环境搭建

pip install langchain langchain-community langchain-openai chromadb pypdf python-docx tiktoken
# 或使用国内镜像
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple langchain langchain-community langchain-openai chromadb pypdf python-docx tiktoken

三、核心代码实现

3.1 文档加载器

from langchain_community.document_loaders import PyPDFLoader, TextLoader, Docx2txtLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import os

def load_documents(folder_path):
    documents = []
    for file in os.listdir(folder_path):
        path = os.path.join(folder_path, file)
        if file.endswith('.pdf'):
            loader = PyPDFLoader(path)
        elif file.endswith('.txt'):
            loader = TextLoader(path, encoding='utf-8')
        elif file.endswith('.docx'):
            loader = Docx2txtLoader(path)
        else:
            continue
        documents.extend(loader.load())
    return documents

3.2 文本分块

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["

", "
", "。", ".", " ", ""]
)
chunks = text_splitter.split_documents(documents)

chunk_size=500、chunk_overlap=50是通用推荐值。对于技术文档,建议使用”\n\n”作为首选分隔符。

3.3 向量存储

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"
)

建议使用text-embedding-3-small模型,兼顾性能与成本。中文文档也可以用BGE或M3E等国产模型。

3.4 检索问答链

from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.2)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
    return_source_documents=True
)

result = qa_chain.invoke({"query": "公司的技术架构是什么样的?"})
print(f"答案:{result['result']}")

四、进阶优化技巧

1. Hybrid Search: 结合关键词搜索(BM25)和向量搜索,提升检索准确率。
2. Reranker: 检索后用Cross-Encoder对结果重排序,将最相关的内容排前面。
3. Query Transformation: 在检索前让LLM对用户问题做改写/扩展,提升检索命中率。
4. Context Compression: 压缩检索结果,只保留最相关的内容片段,减少Token消耗。

五、完整项目目录结构

my_rag/
├── data/              # 存放文档(pdf/txt/docx)
├── chroma_db/         # 向量数据库持久化目录
├── main.py            # 主程序
├── ingest.py          # 文档入库脚本
└── requirements.txt   # 依赖清单

六、总结

用LangChain搭建RAG系统只需要不到100行代码,但真正好用的RAG系统需要针对你的场景调优:文档分块策略、检索参数、提示词模板,每个环节都值得深入打磨。建议先用30份文档做实验,找到最优参数后再批量处理。

— 分享本文 —

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注