Windows 10系统下使用Ollama+LangChain构建本地知识库完全指南

云信安装大师
90
AI 质量分
11 5 月, 2025
3 分钟阅读
0 阅读

Windows 10系统下使用Ollama+LangChain构建本地知识库完全指南

引言

在当今信息爆炸的时代,如何高效管理和利用本地知识成为一个重要课题。本文将带你使用Ollama和LangChain在Windows 10系统上搭建一个功能完善的本地知识库系统,无需依赖云服务,保护你的数据隐私。

准备工作

环境要求

  1. Windows 10操作系统(版本1903或更高)
  2. Python 3.8或更高版本
  3. 至少8GB内存(推荐16GB)
  4. 至少20GB可用磁盘空间

需要安装的软件

  1. Python环境
  2. Git for Windows
  3. Ollama(本地大语言模型运行环境)

第一步:安装基础环境

1.1 安装Python

访问Python官网下载最新版本的Python安装包。

安装时务必勾选”Add Python to PATH”选项:

验证安装是否成功:

代码片段
python --version
pip --version

1.2 安装Git for Windows

Git官网下载并安装Git。

验证安装:

代码片段
git --version

第二步:安装和配置Ollama

2.1 下载Ollama

访问Ollama官网下载Windows版本。

或者使用PowerShell命令下载:

代码片段
Invoke-WebRequest -Uri "https://ollama.ai/download/OllamaSetup.exe" -OutFile "OllamaSetup.exe"

2.2 运行安装程序

双击OllamaSetup.exe完成安装。

2.3 测试Ollama运行

打开新的终端窗口,运行:

代码片段
ollama run llama2

第一次运行会自动下载模型(约4GB),耐心等待完成。

第三步:设置Python虚拟环境

创建一个专门的虚拟环境来管理依赖:

代码片段
python -m venv langchain-env
.\langchain-env\Scripts\activate

第四步:安装LangChain和相关依赖

在激活的虚拟环境中运行:

代码片段
pip install langchain ollama chromadb sentence-transformers pypdf python-dotenv tiktoken

第五步:构建本地知识库系统

5.1 项目结构准备

创建以下目录结构:

代码片段
my_knowledge_base/
│── documents/          # 存放PDF、TXT等文档
│── src/
│   │── utils.py        # 工具函数
│   │── config.py       # 配置文件
│   └── main.py         # 主程序
└── .env                # 环境变量文件

5.2 config.py配置

代码片段
import os
from dotenv import load_dotenv

load_dotenv()

class Config:
    # Ollama配置
    OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434")
    MODEL_NAME = os.getenv("MODEL_NAME", "llama2")

    # ChromaDB配置
    PERSIST_DIRECTORY = "db"
    CHROMA_SETTINGS = {
        "persist_directory": PERSIST_DIRECTORY,
        "anonymized_telemetry": False,
    }

    # Embedding配置 
    EMBEDDING_MODEL_NAME = "all-MiniLM-L6-v2"

    # Document loader配置 
    DOCUMENT_DIRECTORY = "documents"
    ALLOWED_EXTENSIONS = [".pdf", ".txt", ".md"]

5.3 utils.py工具函数

代码片段
import os 
from langchain.document_loaders import PyPDFLoader, TextLoader, UnstructuredMarkdownLoader 
from langchain.text_splitter import RecursiveCharacterTextSplitter 

def load_documents(config):
    """加载文档目录中的所有文件"""
    documents = []

    for file in os.listdir(config.DOCUMENT_DIRECTORY):
        file_path = os.path.join(config.DOCUMENT_DIRECTORY, file)
        _, ext = os.path.splitext(file)

        if ext.lower() not in config.ALLOWED_EXTENSIONS:
            continue

        try:
            if ext.lower() == ".pdf":
                loader = PyPDFLoader(file_path)
            elif ext.lower() == ".txt":
                loader = TextLoader(file_path, encoding="utf-8")
            elif ext.lower() == ".md":
                loader = UnstructuredMarkdownLoader(file_path)

            documents.extend(loader.load())

        except Exception as e:
            print(f"Error loading {file_path}: {str(e)}")

    return documents 

def split_documents(documents):
    """分割文档为适合处理的块"""
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len,
        is_separator_regex=False,
    )

    return text_splitter.split_documents(documents)

5.4 main.py主程序

代码片段
from langchain_community.embeddings import OllamaEmbeddings 
from langchain_community.vectorstores import Chroma 
from langchain_community.chat_models import ChatOllama 
from langchain.chains import RetrievalQA 

from config import Config 
from utils import load_documents, split_documents 

def initialize_knowledge_base():
    """初始化知识库"""
    config = Config()

    print("Loading documents...")
    documents = load_documents(config)

    if not documents:
        raise ValueError("No documents found in the document directory.")

    print(f"Loaded {len(documents)} document(s)")

    print("Splitting documents...")
    texts = split_documents(documents)

    print(f"Split into {len(texts)} chunks")

    print("Creating embeddings...")

    embeddings = OllamaEmbeddings(
        base_url=config.OLLAMA_BASE_URL,
        model=config.MODEL_NAME,
    )

    db = Chroma.from_documents(
        texts, 
        embeddings, 
        persist_directory=config.PERSIST_DIRECTORY,
        client_settings=config.CHROMA_SETTINGS,
    )

    db.persist()

    return db 

def create_qa_chain(db):
    """创建问答链"""
    config = Config()

    llm = ChatOllama(
        base_url=config.OLLAMA_BASE_URL,
        model=config.MODEL_NAME,
        temperature=0,   #降低随机性以获得更确定性的回答  
     )

     retriever = db.as_retriever(search_kwargs={"k":3})   #每次检索3个最相关的文档块

     return RetrievalQA.from_chain_type(
         llm=llm,
         chain_type="stuff",
         retriever=retriever,
         return_source_documents=True,
     )

if __name__ == "__main__":
     try:
         print("Initializing knowledge base...")
         db = initialize_knowledge_base()

         qa_chain = create_qa_chain(db)

         while True:
             query = input("\nAsk a question (or type 'quit' to exit): ")
             if query.lower() == 'quit':
                 break

             result = qa_chain({"query": query})
             print("\nAnswer:", result["result"])

             if result["source_documents"]:
                 print("\nSources:")
                 for doc in result["source_documents"]:
                     print(f"- {doc.metadata['source']} (page {doc.metadata.get('page', 'N/A')})")   

     except KeyboardInterrupt:
         print("\nExiting...")   
     except Exception as e:  
         print(f"Error: {str(e)}")  

第六步:使用知识库系统

1.将你的文档(PDF、TXT或MD格式)放入documents文件夹

2.运行主程序:

代码片段
python src/main.py  

3.程序会首先处理所有文档并创建向量数据库(第一次运行可能需要较长时间)

4.完成后可以输入问题与你的知识库交互

示例问答:

代码片段
Ask a question (or type 'quit' to exit): What is the main topic of document X?  

Answer: The main topic of document X is about artificial intelligence applications in healthcare...  

Sources:  
- documents/X.pdf (page1)  
- documents/X.pdf (page3)  

常见问题解决

Q: Ollama运行时提示端口冲突
A:修改config.py中的端口号或关闭占用11434端口的其他程序

Q:处理大型PDF文件时内存不足
A:尝试减小chunk_size(如500)或在更高配置的机器上运行

Q:回答质量不高
A:尝试:
1.使用更大的模型(如ollamapull llama2:13b)
2.调整检索参数(search_kwargs={"k":5})

优化建议

1. 增量更新:修改代码支持只处理新增文档而非重建整个数据库
2. 前端界面:添加简单的Flask或Gradio界面提升用户体验
3. 混合搜索:结合关键词搜索和向量搜索提升召回率

总结

通过本教程,你已成功在Windows10上搭建了基于Ollam和LangChain的本地知识库系统。这个方案具有以下优势:

✓完全离线运行,保护数据隐私
✓支持多种文档格式(PDF/TXT/MD等)
✓可扩展性强,可轻松集成更大模型或更多功能

下一步你可以尝试:
-添加更多文档扩展知识库覆盖面
-实验不同的嵌入模型和LLM组合优化效果

原创 高质量