← 返回技术专栏
RAG 实战

基于 LangChain 从零搭建本地知识库问答系统

发布于 2026-02-05 • 作者:DevOps 工程师 • 难度:中等

企业数据安全日益重要,如何既利用大模型的能力,又保证数据不出域?RAG(检索增强生成)是目前的最佳实践。本文将带你一步步搭建一个完全离线的私有知识库助手。

1. 环境准备

首先,我们需要安装必要的 Python 库。推荐使用 conda 创建一个隔离环境。

pip install langchain chromadb sentence-transformers unstructured

2. 文档加载与切分

由于 LLM 的上下文窗口有限,我们需要将长文档切分成小的 Chunks。LangChain 提供了多种切分器,这里我们使用 `RecursiveCharacterTextSplitter`。

from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

loader = DirectoryLoader('./data', glob="**/*.md")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

3. 向量化存储

使用 `sentence-transformers` 将文本转换为向量,并存储到 `Chroma` 向量数据库中。

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma

embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
db = Chroma.from_documents(texts, embeddings, persist_directory="./chroma_db")
db.persist()

4. 检索与问答

最后,我们将检索到的相关文档作为 Context,输入给 LLM 进行回答。这里可以使用本地部署的 ChatGLM3 或 LLaMA。

from langchain.chains import RetrievalQA
from langchain.llms import HuggingFacePipeline

retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(llm=local_llm, chain_type="stuff", retriever=retriever)

query = "公司的报销流程是怎样的?"
print(qa.run(query))

至此,一个基本的本地 RAG 系统就搭建完成了。你可以在此基础上增加 Web UI、多轮对话支持等功能。