返回项目列表
Ollama LangChain RAG 向量数据库 Python

本地大模型知识库问答系统

本地大模型知识库问答系统

项目背景

在企业场景中,经常需要基于私有文档进行问答。传统的云端方案存在数据安全和成本问题。本项目探索在本地运行 LLM + RAG 的可行方案。

技术方案

整体架构

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   文档上传    │────▶│  文本分割    │────▶│   向量化    │
└─────────────┘     └─────────────┘     └─────────────┘


┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   答案展示    │◀────│  LLM 生成   │◀────│  相似度检索  │
└─────────────┘     └─────────────┘     └─────────────┘


                    ┌─────────────┐
                    │   Ollama   │
                    │  (本地 LLM) │
                    └─────────────┘

核心组件

  1. 文档处理:支持 PDF、Word、Markdown 等格式
  2. 文本分割:基于语义的分块策略
  3. 向量存储:Chroma DB 本地向量数据库
  4. 检索增强:Hybrid Search (向量 + 关键词)
  5. LLM 生成:Ollama 支持的多种模型

关键代码

文档向量化

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma

# 加载文档
loader = PyPDFLoader("document.pdf")
documents = loader.load()

# 文本分割
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = splitter.split_documents(documents)

# 向量化
embeddings = HuggingFaceEmbeddings(
    model_name="BAAI/bge-large-zh-v1.5"
)

# 存储到 Chroma
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

RAG 问答

from langchain.chat_models import ChatOllama
from langchain.chains import RetrievalQA

# 初始化 Ollama
llm = ChatOllama(
    model="llama2:7b-chat-q4_0",
    temperature=0.7
)

# 创建 QA Chain
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
)

# 问答
result = qa_chain({"query": "文档中提到的核心技术方案是什么?"})
print(result["result"])

性能优化

模型量化

模型量化级别显存需求质量评分
Llama 2 7BQ4_0~4GB85
Llama 2 7BQ5_1~5GB90
Mistral 7BQ4_0~4GB88

批处理优化

对于大量文档处理,使用批处理提升效率:

# 批量向量化
for batch in tqdm(list(batches)):
    embeddings = embed_model.embed_documents(batch)
    vectorstore.add_vectors(embeddings, batch)

使用场景

  • 企业内部知识库
  • 私有文档问答
  • 技术文档助手
  • 合同分析审核

部署要求

  • 最低配置:16GB RAM + 6GB GPU
  • 推荐配置:32GB RAM + 10GB GPU
  • 存储:根据文档量,约 1GB/千页