496e11e26e28ba3798ec115dd3f7d55827f418e7
- config.py: DATABASE_URL 默认值改为 SQLite - database.py: 移除 PostgreSQL 分支,简化为纯 SQLite - models/base.py: 移除 pgvector 导入和条件分支 - search_service.py: 移除 _search_postgres 方法 - import_service.py: 移除 pgvector 相关代码 - requirements.txt: 移除 asyncpg/alembic/pgvector 依赖 - pyproject.toml: 同步移除相关依赖 - docker-compose.yml: 移除 db 服务,- 删除 alembic.ini/Dockerfile.db/sql 目录 - README.md: 更新文档,移除 PostgreSQL 相关内容 适合 NAS 等资源受限环境的轻量级部署
EduBrain - 中文直播教育知识库系统
基于 FastAPI 的中文直播教育知识库系统,支持直播文字稿导入、OCR 截图识别、AI 语义搜索、企业微信机器人等功能。
功能特性
知识库管理
- 多格式导入: Markdown / 纯文本 / Word 文档(.docx),自动按标题分页
- 批量导入: 支持多文件批量导入,实时进度显示
- 智能分块: 按段落边界切分文本,保留重叠区域
- 向量嵌入: 支持 MiniMax / OpenAI / 智谱 / DashScope / 本地 BGE 五种嵌入模型
图片 OCR
- OCR 识别: DeepSeek Vision 模型识别图片文字
- 关键词提取: MiniMax M2.7 自动提取内容标签
- 批量处理: 支持拖拽上传、选择文件、选择文件夹
- 上传去重: OCR 识别后自动检查内容是否已存在,避免重复录入
- 图片管理: 网页端管理所有图片,支持一键去重、手动删除
- BM25 索引: 内置倒排索引搜索引擎,jieba 中文分词
AI 搜索
- 知识库搜索: 关键词搜索
- 图片搜索: MiniMax M2.7 语义匹配,SSE 流式实时返回结果
- 并发池: 最多 10 个 LLM 请求并发,每批数量可配置
- 可配置参数: 搜索返回数量、LLM 批量判断数量、OCR 并发数量均可在网页端设置
企业微信机器人
- WebSocket 长连接: 基于官方 SDK,无需公网 IP
- 关键词搜索: 用户发文字 → 搜索图片 → 返回匹配结果
- 图片自动入库: 用户发图片 → 自动 OCR 识别 → 录入知识库(自动去重)
- 集成启动: 后端启动时自动检测配置并拉起机器人
- 网页端管理: 在设置页面配置 Bot ID / Secret,支持在线重启
其他
- MCP 协议: 支持 Model Context Protocol,可被 AI Agent 调用
- Docker 部署: 单容器部署,轻量级
技术栈
| 层级 | 技术 |
|---|---|
| 后端框架 | FastAPI + Uvicorn |
| ORM | SQLAlchemy 2.0 (async) |
| 数据库 | SQLite |
| 前端 | 纯 HTML + CSS + JS(苹果风格 SPA) |
| OCR | DeepSeek Vision / PaddleOCR / 阿里云 / 腾讯云 |
| LLM | MiniMax M2.7 / DeepSeek / Qwen3-8B |
| 搜索 | BM25 倒排索引 + 关键词搜索 |
| 企业微信 | wecom-aibot-python-sdk (WebSocket 长连接) |
| 部署 | Docker |
项目结构
edu-brain/
├── app/
│ ├── main.py # FastAPI 入口,路由注册,生命周期管理,BotManager
│ ├── config.py # pydantic-settings 配置管理
│ ├── database.py # SQLite 数据库连接
│ ├── models/base.py # ORM 模型(KnowledgePage, OCRImage 等)
│ ├── schemas/ # Pydantic 请求/响应 Schema
│ ├── api/v1/ # API 路由
│ │ ├── pages.py # 知识页面 CRUD
│ │ ├── search.py # 关键词搜索
│ │ ├── images.py # 图片 OCR + AI 搜索(SSE)+ 去重 + 删除
│ │ ├── import_export.py # 文件导入导出
│ │ └── settings.py # 系统设置 + 机器人管理
│ ├── services/
│ │ ├── ocr_service.py # OCR 识别服务(多 Provider)
│ │ ├── llm_service.py # LLM 服务(标签提取/搜索匹配)
│ │ ├── search_engine.py # BM25 倒排索引引擎
│ │ ├── search_service.py # 搜索服务
│ │ ├── embedding_service.py # 嵌入模型服务
│ │ ├── import_service.py # 文件导入服务
│ │ └── page_service.py # 页面 CRUD 服务
│ ├── wework_bot.py # 企业微信智能机器人服务
│ └── mcp/server.py # MCP Server 实现
├── static/index.html # 前端单页应用
├── data/images/ # 图片存储目录
├── .env.example # 环境变量模板
├── requirements.txt # Python 依赖
├── Dockerfile # 应用镜像
└── docker-compose.yml # Docker 编排
快速开始
1. 环境准备
# 克隆项目
git clone <repo-url>
cd edu-brain
# 复制配置文件
cp .env.example .env
# 安装依赖
pip install -r requirements.txt
2. 配置 .env
编辑 .env 文件,至少配置以下项:
# 数据库(默认 SQLite,无需额外配置)
DATABASE_URL=sqlite+aiosqlite:///edu_brain.db
# OCR(使用 DeepSeek Vision)
OCR_PROVIDER=deepseek
DEEPSEEK_API_KEY=your-deepseek-api-key
DEEPSEEK_BASE_URL=http://your-ollama-host:11434/v1
DEEPSEEK_OCR_MODEL=deepseek-ocr:latest
# LLM(用于标签提取和搜索匹配)
MINIMAX_API_KEY=your-minimax-api-key
MINIMAX_BASE_URL=https://api.minimaxi.com/v1
MINIMAX_CHAT_MODEL=MiniMax-M2.7
# 企业微信机器人(可选,不配则不启动)
WEWORK_BOT_ENABLED=true
WEWORK_BOT_ID=your-bot-id
WEWORK_BOT_SECRET=your-bot-secret
3. 启动服务
uvicorn app.main:app --host 0.0.0.0 --port 8765
启动后会自动检测企业微信机器人配置,如果 WEWORK_BOT_ENABLED=true 且 WEWORK_BOT_ID / WEWORK_BOT_SECRET 已配置,机器人会自动在后台线程启动。
访问 http://localhost:8765 即可使用。
4. Docker 部署
docker-compose up -d
图片搜索工作流
用户上传图片
→ DeepSeek Vision OCR 识别文字
→ 检查 OCR 内容是否已存在(去重)
→ MiniMax M2.7 提取关键词标签
→ 存入 SQLite + BM25 索引
用户搜索 "孩子不想上学"
→ 从 DB 倒序取图片(每批 N 张,可配置)
→ 并发池发给 MiniMax M2.7 判断
→ 匹配结果通过 SSE 实时推送到前端
→ 找够指定数量或遍历完 DB 后结束
企业微信机器人
功能
| 场景 | 说明 |
|---|---|
| 单聊发关键词 | 搜索图片知识库,返回匹配结果(图片+预览文字) |
| 单聊发图片 | 自动 OCR 识别并录入知识库(自动去重) |
| 进入会话 | 自动发送欢迎语 |
配置
- 在企业微信管理后台创建智能机器人,开启 API 模式(长连接)
- 获取 Bot ID 和 Secret
- 在
.env中配置或通过网页端设置页面配置
注意事项
- 图片消息仅支持单聊,群聊中发图片不会触发机器人
- 机器人支持多人同时使用(asyncio 异步架构)
- 配置修改后可通过网页端「重启机器人」按钮生效
API 概览
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/v1/images/recognize-direct |
上传并识别图片 |
| POST | /api/v1/images/batch-recognize |
批量上传并识别 |
| GET | /api/v1/images/search |
AI 搜索图片(SSE 流式) |
| GET | /api/v1/images |
获取图片列表(分页) |
| GET | /api/v1/images/{id} |
获取图片识别结果 |
| DELETE | /api/v1/images/{id} |
删除图片 |
| POST | /api/v1/images/dedup |
一键去重 |
| GET | /api/v1/pages |
知识页面列表 |
| POST | /api/v1/pages |
创建知识页面 |
| POST | /api/v1/search |
关键词搜索知识库 |
| POST | /api/v1/import/file |
导入文件 |
| GET | /api/v1/settings |
获取系统设置 |
| PUT | /api/v1/settings |
更新系统设置 |
| GET | /api/v1/settings/bot/status |
获取机器人状态 |
| POST | /api/v1/settings/bot/restart |
重启机器人 |
配置说明
OCR Provider
| Provider | 说明 | 额外配置 |
|---|---|---|
deepseek |
DeepSeek Vision(推荐) | DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL |
paddleocr |
本地 PaddleOCR | 无 |
aliyun |
阿里云 OCR | ALIYUN_OCR_ACCESS_KEY, ALIYUN_OCR_SECRET |
tencent |
腾讯云 OCR | TENCENT_OCR_SECRET_ID, TENCENT_OCR_SECRET_KEY |
auto |
自动 fallback | 配置多个 Provider |
嵌入模型
| Provider | 说明 | 额外配置 |
|---|---|---|
minimax |
MiniMax 嵌入 | MINIMAX_API_KEY |
openai |
OpenAI 嵌入(兼容硅基流动等第三方接口) | OPENAI_API_KEY |
zhipu |
智谱 AI 嵌入 | ZHIPU_API_KEY |
dashscope |
阿里云 DashScope | DASHSCOPE_API_KEY |
local_bge |
本地 BGE 模型 | LOCAL_BGE_MODEL_PATH |
网页端可配置参数
| 参数 | 说明 | 默认值 | 范围 |
|---|---|---|---|
| 搜索返回数量 | 每次搜索最多返回多少条匹配结果 | 3 | 1-10 |
| LLM 批量判断数量 | 每批发给 LLM 判断的图片数量 | 10 | 1-50 |
| OCR 并发数量 | 多用户同时上传时 OCR 并发识别数量 | 1 | 1-10 |
Description
Languages
Python
54.2%
HTML
45.4%
Dockerfile
0.4%