尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

使用 Python 基于Ollama构建个人私有知识库(AI生成)

使用 Python 基于Ollama构建个人私有知识库(AI生成)
📅 发布时间:2026/6/19 12:14:02

使用 Python 基于 Ollama 构建个人私有知识库是一个非常实用的项目,可以实现本地化、隐私安全的文档问答系统。以下是完整的路径和步骤,帮助你从零开始搭建一个基于 Ollama 的本地知识库系统。


🌟 目标

构建一个本地运行的私有知识库问答系统,支持:

  • 上传本地文档(PDF、Word、TXT 等)
  • 使用 Ollama 调用本地大模型(如 llama3, mistral, nomic-embed-text)
  • 向量化文档内容并存储
  • 用户提问时,从知识库中检索并生成回答

✅ 技术栈

组件 作用
Ollama 本地运行大语言模型(LLM)和嵌入模型
LangChain 构建 RAG(检索增强生成)流程
ChromaDB 本地向量数据库(轻量、无需服务器)
Python 主语言
Unstructured / PyPDF2 / python-docx 文档解析

🛠️ 环境准备

1. 安装 Ollama

前往官网安装:https://ollama.com/

# macOS / Linux
curl -fsSL https://ollama.com/install.sh | sh# 启动 Ollama 服务
ollama serve

2. 拉取模型(建议)

ollama pull llama3
ollama pull nomic-embed-text

nomic-embed-text 是 Ollama 推荐的嵌入模型,用于生成文本向量。


📁 项目结构

private-kb/
├── data/                   # 存放你的文档
├── vectorstore/            # 向量数据库存储目录
├── ingest.py               # 文档加载与向量化
├── query.py                # 查询接口
├── utils.py                # 工具函数
└── requirements.txt

📦 安装 Python 依赖

pip install langchain langchain-ollama chromadb unstructured pypdf python-docx

注意:langchain-ollama 是 LangChain 对 Ollama 的集成包。


📝 步骤一:文档加载与预处理(ingest.py)

# ingest.py
import os
from langchain_community.document_loaders import (PyPDFLoader,TextLoader,Docx2txtLoader,
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_ollama import OllamaEmbeddings# 文档目录
DATA_DIR = "data"
VECTORSTORE_DIR = "vectorstore"def load_documents():documents = []for filename in os.listdir(DATA_DIR):file_path = os.path.join(DATA_DIR, filename)if filename.endswith(".pdf"):loader = PyPDFLoader(file_path)elif filename.endswith(".txt"):loader = TextLoader(file_path, encoding="utf-8")elif filename.endswith(".docx"):loader = Docx2txtLoader(file_path)else:continuedocuments.extend(loader.load())return documentsdef split_documents(documents):text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50,)return text_splitter.split_documents(documents)def create_vectorstore():print("Loading documents...")docs = load_documents()print(f"Loaded {len(docs)} documents.")print("Splitting documents...")splits = split_documents(docs)print("Creating embeddings and vector store...")embeddings = OllamaEmbeddings(model="nomic-embed-text")vectorstore = Chroma.from_documents(documents=splits,embedding=embeddings,persist_directory=VECTORSTORE_DIR,)vectorstore.persist()print("Vector store created and saved.")if __name__ == "__main__":create_vectorstore()

🔍 步骤二:查询知识库(query.py)

# query.py
from langchain_ollama import ChatOllama
from langchain_community.vectorstores import Chroma
from langchain_ollama import OllamaEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParserVECTORSTORE_DIR = "vectorstore"# 初始化嵌入模型和向量数据库
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma(persist_directory=VECTORSTORE_DIR, embedding_function=embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})# 初始化 LLM
llm = ChatOllama(model="llama3", temperature=0.3)# 提示模板
template = """你是一个问答助手,请根据以下上下文回答问题:
{context}问题: {question}请用中文回答,尽量简洁准确。
"""
prompt = ChatPromptTemplate.from_template(template)# 构建 RAG 链
rag_chain = ({"context": retriever, "question": RunnablePassthrough()}| prompt| llm| StrOutputParser()
)def ask_question(question: str):return rag_chain.invoke(question)if __name__ == "__main__":while True:q = input("\n问: ")if q.lower() in ["quit", "exit", "退出"]:breakresponse = ask_question(q)print(f"答: {response}")

🧪 使用流程

1. 准备文档

将你的 PDF、TXT、DOCX 文件放入 data/ 目录。

2. 向量化文档

python ingest.py

第一次运行会较慢,后续增量更新可扩展脚本。

3. 启动问答

python query.py

输入问题,例如:

问: 我的简历里写了哪些技能?
答: 根据文档内容,你提到了 Python、机器学习、LangChain 和 Ollama...

✅ 可选优化

功能 实现方式
增量更新 检查文件哈希,避免重复处理
Web 界面 使用 Streamlit 或 FastAPI
更好分块 使用 SemanticChunker
多轮对话 加入 RunnableWithMessageHistory
支持更多格式 使用 unstructured 包

🌐 扩展:Web UI(Streamlit 示例)

# app.py
import streamlit as st
from query import ask_questionst.title("私人知识库问答系统")if "messages" not in st.session_state:st.session_state.messages = []for message in st.session_state.messages:with st.chat_message(message["role"]):st.markdown(message["content"])if prompt := st.chat_input("请输入问题"):st.session_state.messages.append({"role": "user", "content": prompt})with st.chat_message("user"):st.markdown(prompt)with st.chat_message("assistant"):response = ask_question(prompt)st.markdown(response)st.session_state.messages.append({"role": "assistant", "content": response})

启动:

streamlit run app.py

🧩 总结:完整路径

步骤 操作
1 安装 Ollama 并拉取 llama3 和 nomic-embed-text
2 安装 Python 依赖(LangChain + Chroma + 文档解析库)
3 编写 ingest.py 将文档切片并存入 Chroma 向量库
4 编写 query.py 实现 RAG 问答
5 (可选)添加 Web 界面(Streamlit/FastAPI)

📚 参考资料

  • Ollama: https://ollama.com
  • LangChain Ollama 文档: https://python.langchain.com/docs/integrations/llms/ollama
  • Chroma: https://www.trychroma.com
  • Unstructured: https://unstructured.io

如果你希望我提供 完整项目打包代码 或支持 自动增量更新/去重/多用户 等高级功能,也可以继续告诉我!

相关新闻

  • Codeforces Round 1048 (Div. 2) 补题笔记
  • React学习笔记(一)
  • IDEA大幅度提升编译速度配置 - 指南

最新新闻

  • Presenton开源AI演示生成工具:企业级演示文稿创作的完整解决方案
  • Awesome-AI 开源仓库架构设计与技术学习路线工程化沉淀方案
  • (2026新)珠海正规防水补漏公司口碑榜TOP5权威推荐!卫生间/厨房/阳台/屋顶/天花板/地下室渗漏水检测维修攻略-靠谱漏水检测维修师傅推荐 - 安佳防水
  • 深入解析CAN总线标识符过滤:原理、配置与MSCAN实战指南
  • 终极指南:跨平台获取macOS系统镜像的完整解决方案
  • 深入解析MC68HC908AS32A SPI模块:从寄存器配置到中断与错误处理实战

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号