个人知识库系统可以帮助我们高效管理分散的学习笔记、工作文档、技术资料等内容,使用Python搭建该系统不仅开发成本低,还能灵活定制自动更新规则,适配不同的资料存储需求。本文将完整介绍搭建流程和自动更新的实现方式。
环境准备与依赖安装
首先我们需要准备Python 3.8及以上版本的运行环境,然后安装所需的第三方库,主要用到的库包括Flask用于搭建Web服务,watchdog用于监控文件变化实现自动更新,sqlalchemy用于操作SQLite数据库存储知识库元数据。
pip install flask watchdog sqlalchemy
知识库核心结构设计
我们的知识库系统分为两部分存储:一是知识内容的原始文件,存放在本地指定目录中;二是知识元数据,包括文件名称、路径、更新时间、标签等,存储在SQLite数据库中方便查询。
数据库模型定义
使用sqlalchemy定义知识条目的数据模型,代码如下:
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime
# 创建数据库连接,数据库文件为knowledge.db
engine = create_engine('sqlite:///knowledge.db')
Base = declarative_base()
# 定义知识条目模型
class KnowledgeItem(Base):
__tablename__ = 'knowledge_items'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(200), nullable=False) # 知识标题
file_path = Column(String(500), nullable=False) # 原始文件路径
update_time = Column(DateTime, default=datetime.now) # 最后更新时间
tags = Column(String(200)) # 知识标签
# 创建数据表
Base.metadata.create_all(engine)
# 创建会话类
Session = sessionmaker(bind=engine)
Flask服务搭建与基础接口开发
接下来使用Flask搭建Web服务,提供知识查询、添加、删除的基础接口,方便我们操作知识库内容。
服务初始化与基础接口
from flask import Flask, request, jsonify
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from datetime import datetime
app = Flask(__name__)
# 初始化数据库会话
engine = create_engine('sqlite:///knowledge.db')
Session = sessionmaker(bind=engine)
@app.route('/knowledge', methods=['GET'])
def get_knowledge_list():
# 获取知识库列表,支持按标签筛选
tags = request.args.get('tags')
session = Session()
if tags:
items = session.query(KnowledgeItem).filter(KnowledgeItem.tags.like(f'%{tags}%')).all()
else:
items = session.query(KnowledgeItem).all()
result = [
{
'id': item.id,
'title': item.title,
'file_path': item.file_path,
'update_time': item.update_time.strftime('%Y-%m-%d %H:%M:%S'),
'tags': item.tags
} for item in items
]
session.close()
return jsonify(result)
@app.route('/knowledge', methods=['POST'])
def add_knowledge():
# 添加新知识条目
data = request.json
session = Session()
new_item = KnowledgeItem(
title=data.get('title'),
file_path=data.get('file_path'),
tags=data.get('tags', ''),
update_time=datetime.now()
)
session.add(new_item)
session.commit()
session.close()
return jsonify({'msg': '添加成功', 'id': new_item.id})
if __name__ == '__main__':
app.run(debug=True, port=5000)
实现知识库自动更新功能
自动更新的核心逻辑是监控我们存放知识文件的目录,当目录中有文件新增、修改、删除时,自动同步更新数据库中的元数据,不需要手动调用添加接口。
文件监控实现
使用watchdog库监控指定目录的文件变化,代码如下:
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from datetime import datetime
# 监控的知识文件存放目录,可自定义修改
WATCH_DIR = './knowledge_files'
engine = create_engine('sqlite:///knowledge.db')
Session = sessionmaker(bind=engine)
class KnowledgeFileHandler(FileSystemEventHandler):
def on_created(self, event):
# 新增文件时,自动添加知识条目到数据库
if not event.is_directory:
file_path = event.src_path
file_name = os.path.basename(file_path)
session = Session()
# 检查是否已存在该路径的记录
exist_item = session.query(KnowledgeItem).filter_by(file_path=file_path).first()
if not exist_item:
new_item = KnowledgeItem(
title=file_name,
file_path=file_path,
tags='自动添加',
update_time=datetime.now()
)
session.add(new_item)
session.commit()
session.close()
print(f'自动添加知识条目:{file_name}')
def on_modified(self, event):
# 文件修改时,更新对应条目的更新时间
if not event.is_directory:
file_path = event.src_path
session = Session()
item = session.query(KnowledgeItem).filter_by(file_path=file_path).first()
if item:
item.update_time = datetime.now()
session.commit()
session.close()
print(f'更新知识条目时间:{os.path.basename(file_path)}')
def on_deleted(self, event):
# 文件删除时,同步删除数据库中的记录
if not event.is_directory:
file_path = event.src_path
session = Session()
item = session.query(KnowledgeItem).filter_by(file_path=file_path).first()
if item:
session.delete(item)
session.commit()
session.close()
print(f'删除知识条目:{os.path.basename(file_path)}')
def start_file_monitor():
# 启动文件监控
event_handler = KnowledgeFileHandler()
observer = Observer()
observer.schedule(event_handler, WATCH_DIR, recursive=True)
observer.start()
print(f'开始监控目录:{WATCH_DIR}')
整合自动更新与Flask服务
修改主程序,在启动Flask服务的同时启动文件监控,实现完整的自动更新功能:
from flask import Flask, request, jsonify
import threading
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from datetime import datetime
app = Flask(__name__)
WATCH_DIR = './knowledge_files'
engine = create_engine('sqlite:///knowledge.db')
Session = sessionmaker(bind=engine)
# 数据库模型定义(同之前的KnowledgeItem定义,此处省略重复代码)
Base = declarative_base()
class KnowledgeItem(Base):
__tablename__ = 'knowledge_items'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(200), nullable=False)
file_path = Column(String(500), nullable=False)
update_time = Column(DateTime, default=datetime.now)
tags = Column(String(200))
# 文件监控类(同之前的KnowledgeFileHandler定义,此处省略重复代码)
class KnowledgeFileHandler(FileSystemEventHandler):
def on_created(self, event):
# 新增文件处理逻辑
pass
def on_modified(self, event):
# 文件修改处理逻辑
pass
def on_deleted(self, event):
# 文件删除处理逻辑
pass
@app.route('/knowledge', methods=['GET'])
def get_knowledge_list():
# 查询接口逻辑
pass
@app.route('/knowledge', methods=['POST'])
def add_knowledge():
# 添加接口逻辑
pass
if __name__ == '__main__':
# 启动文件监控线程
monitor_thread = threading.Thread(target=start_file_monitor)
monitor_thread.daemon = True
monitor_thread.start()
# 启动Flask服务
app.run(debug=True, port=5000)
功能测试与扩展建议
我们可以在./knowledge_files目录下新增一个测试文本文件,观察控制台是否输出自动添加的日志,然后调用查询接口验证数据是否已经入库。如果需要扩展功能,可以添加知识内容全文检索、标签管理、知识分类等功能,进一步优化个人知识库的使用体验。
注意事项
- 监控目录需要提前手动创建,否则会抛出异常
- 如果知识文件是二进制格式,需要调整文件标题提取的逻辑,避免读取乱码
- 生产环境使用建议关闭Flask的debug模式,同时添加接口权限校验