基于 LangChain 从零搭建本地知识库问答系统
企业数据安全日益重要,如何既利用大模型的能力,又保证数据不出域?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、多轮对话支持等功能。