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

news/2025/9/28 18:32:15/文章来源:https://www.cnblogs.com/jiftle/p/19117378

使用 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 并拉取 llama3nomic-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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合肥网络公司seo建站淮北seo

[背景简介]MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。mysql虽然功能未必很强大,但因为它的开源、广泛传播&#xf…

Codeforces Round 1048 (Div. 2) 补题笔记

2A 略 2B 经典的一类题,选择一个顺序(一般是删除)最大/小化答案,这种一般都是正/逆序直接贪心就对了。 2C 简单但很好的题,提示我们瞪不出来,可以数学化一下题意,可能更容易意识到操作的本质。 2D(upsolved) …

泰州市建设监理协会网站仙桃哪里做网站

管理的技巧就是通过其他人实现你的工作目标。 写作的技巧就是创造一个能够激发其他人进行思考的环境。 需要有一个激发人们创造力的体系。 团队成员优势无补带来的威力。 让成员认为他所做的是他想做的事情。 雕塑就是把隐藏在石头里的形象挖掘出来。转载于:https://www.cnblog…

【RabbitMQ】消息可靠性保障

本章目标掌握生产者确认(Publisher Confirms)机制,确保消息到达Broker。深入理解消费者确认(Consumer Acknowledgments)的最佳实践。学习死信队列(Dead Letter Exchange, DLX)处理失败消息。实现完整的消息可靠…

CPU 测试脚本

CPU 测试脚本Posted on 2025-09-28 18:23 大势趋007 阅读(0) 评论(1) 收藏 举报cpu 测试记录#!/bin/bash# 冒泡排序算法测试 - CPU负载测试 # 兼容旧版本Bashbubble_sort() {local array_name=$1eval "local…

Day23static详解

static修饰德成员变量,属于类的本身,被该类德所有实例共享,在类中可以通过类名直接访问,再导入包时打破必须通过类名访问静态成员的规则,将指定的静态成员直接引入当前类的作用域 package oop1.Demo7; //被fianl定…

11.prometheus监控之黑盒(blackbox)监控

一、黑盒监控"白盒监控"--需要把对应的Exporter程序安装到被监控的目标主机上,从而实现对主机各种资源及其状态的数据采集工作。但是由于某些情况下操作技术或其他原因,不是所有的Exporter都能部署到被监控…

网站访问量有什么用网站开发代码用什么软件

重点是要在程序管理窗口中“查看已安装的更新”打开当前系统中已安装更新列表,找到两个IE11的更新(见下图“卸载文件“)并卸载掉,这样windows功能中的ie11才会变成ie8. 打开控制面板 进入面板,点击程序,进…

自己做的网站怎么接入数据库嘉兴企业网站推广方法

配置IPsec on GRE Tunnel with IOS Firewall and NAT<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />详细配置见附件

openssh升级

openssh升级## 功能```支持centos7.5升级openssh9.8``` ## 备份```/etc/pam.d/sshd/etc/ssh/sshd_config```## 物料```openssh.repoopenssh.tar.gz ```----```[openssh]name=openssh9.8baseurl=file:///openssh/gpgche…

实用指南:月匣 - 百度推出的AI情感陪伴与剧情互动应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

电子商务网站的建设与维护企业网站内容如何更新

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.字符指针 2.指针数组 3.数组指针 4.数组传…

做纸巾定制的网站广告设计宣传画册

一、 选题的依据及意义 随着信息化技术的发展&#xff0c;敬老院的信息化管理也迎来了机遇和挑战&#xff0c;我们积极应对这场战斗&#xff0c;丝毫不懈怠。因为&#xff0c;在未来的互联网是一个开放的环境&#xff0c;而传统的管理是一个独立的对象维护和医疗管理模式&…

宜昌的网站建设wordpress菜单出不来

在制作项目的时候遇到一个需求&#xff0c;点击一个按钮弹出一个input输入框&#xff0c;并让输入框获得焦点&#xff0c;项目中引用了element-ui 在网上查找了很多方法&#xff0c;但是在实际使用中发现了一个问题无论是使用$ref获取input元素然后使用focus方法还是使用饿了么…

Python虚拟环境及创建和使用虚拟环境(Python3)

一、什么是Python虚拟环境 简单说,虚拟环境是一个独立的 Python 运行环境,它与系统全局的 Python 环境完全隔离。每个虚拟环境可以有自己独立的 Python 解释器版本(如果需要)。 每个虚拟环境中安装的第三方库(如 …

团队协作必备:16款在线协同编辑文档方案对比

为解决企业在线协同编辑文档的选型难题,本文深度评测了含坚果云在内的16款主流工具。文章从协作办公、数据安全与功能特色等多维度进行全面对比分析,旨在为不同需求的企业提供实用选型指南,帮助团队找到最合适的协同…

石材企业网站源码自创图片软件

文章目录 了解操作系统定义目的操作系统体系结构功能特征操作系统的区别(64位与32位)操作系统的地址内存管理缓存 了解操作系统 定义 操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件 目的 方便性,有效性(提高系统资源的利用率,提高系统的吞吐量) 操作系统体…

变电站、开闭所、环网柜、配电站

1、概念变电站:“区域总电源”,把高压电(如 220kV)变成 10kV,是所有下游设备的电来源;开闭所:“10kV 中转站”,把变电站来的 10kV 电分给周边的环网柜和配电站;环网柜:“10kV 小节点”,给配电站分支供电,还…

IDEA大幅度提升编译速度配置 - 指南

IDEA大幅度提升编译速度配置 - 指南2025-09-28 18:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

免费只做网站公司装修工程

《死锁实验报告》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《死锁实验报告(3页珍藏版)》请在人人文库网上搜索。1、操作系统实验二报告一实验名称&#xff1a;死锁的检测与解除二实验目的&#xff1a;观察死锁产生的条件&#xff0c;并使用适当的算法&#xff0c;…