feat: v1.2.0 - 图片去重与管理、微信机器人优化、搜索设置可配置
主要功能: - 图片上传时 OCR 内容去重(3个上传端点统一使用公共函数 _check_ocr_duplicate) - 图片管理 Tab:展示所有图片、手动删除、一键去重 - 搜索结果详情弹窗增加删除按钮(带确认弹窗) - 图片管理卡片点击查看详情(复用 showOcrDetailModal) - 搜索限制和 LLM 批量判断数量可通过网站设置 - MiniMax API 调用添加 reasoning_split=True - 企业微信机器人:WebSocket 长连接、图片搜索、配置化搜索数量 - 版本号升级至 1.2.0
This commit is contained in:
176
README.md
Normal file
176
README.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# EduBrain - 中文直播教育知识库系统
|
||||
|
||||
基于 FastAPI 的中文直播教育知识库系统,支持直播文字稿导入、OCR 截图识别、AI 语义搜索等功能。
|
||||
|
||||
## 功能特性
|
||||
|
||||
### 知识库管理
|
||||
- **多格式导入**: Markdown / 纯文本 / Word 文档(.docx),自动按标题分页
|
||||
- **批量导入**: 支持多文件批量导入,实时进度显示
|
||||
- **智能分块**: 按段落边界切分文本,保留重叠区域
|
||||
- **向量嵌入**: 支持 MiniMax / OpenAI / 智谱 / DashScope / 本地 BGE 五种嵌入模型
|
||||
|
||||
### 图片 OCR
|
||||
- **OCR 识别**: DeepSeek Vision 模型识别图片文字
|
||||
- **关键词提取**: MiniMax M2.7 自动提取内容标签
|
||||
- **批量处理**: 支持拖拽上传、选择文件、选择文件夹,按文件名去重
|
||||
- **BM25 索引**: 内置倒排索引搜索引擎,jieba 中文分词
|
||||
|
||||
### AI 搜索
|
||||
- **知识库搜索**: 向量语义搜索 + 全文检索混合排序
|
||||
- **图片搜索**: MiniMax M2.7 语义匹配,SSE 流式实时返回结果
|
||||
- **并发池**: 最多 10 个 LLM 请求并发,每批 10 张图片判断
|
||||
|
||||
### 其他
|
||||
- **MCP 协议**: 支持 Model Context Protocol,可被 AI Agent 调用
|
||||
- **Docker 部署**: 完整的 Docker Compose 编排(应用 + PostgreSQL + pgvector)
|
||||
|
||||
## 技术栈
|
||||
|
||||
| 层级 | 技术 |
|
||||
|------|------|
|
||||
| 后端框架 | FastAPI + Uvicorn |
|
||||
| ORM | SQLAlchemy 2.0 (async) |
|
||||
| 数据库 | PostgreSQL (pgvector) / SQLite |
|
||||
| 前端 | 纯 HTML + CSS + JS(苹果风格 SPA) |
|
||||
| OCR | DeepSeek Vision / PaddleOCR / 阿里云 / 腾讯云 |
|
||||
| LLM | MiniMax M2.7 / DeepSeek / Qwen3-8B |
|
||||
| 搜索 | BM25 倒排索引 + 向量语义搜索 |
|
||||
| 部署 | Docker + Docker Compose |
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
edu-brain/
|
||||
├── app/
|
||||
│ ├── main.py # FastAPI 入口,路由注册,生命周期管理
|
||||
│ ├── config.py # pydantic-settings 配置管理
|
||||
│ ├── database.py # 数据库连接(PG/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 服务
|
||||
│ └── mcp/server.py # MCP Server 实现
|
||||
├── static/index.html # 前端单页应用
|
||||
├── data/images/ # 图片存储目录
|
||||
├── .env.example # 环境变量模板
|
||||
├── requirements.txt # Python 依赖
|
||||
├── Dockerfile # 应用镜像
|
||||
├── Dockerfile.db # 数据库镜像(PG + pgvector)
|
||||
└── docker-compose.yml # Docker 编排
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 环境准备
|
||||
|
||||
```bash
|
||||
# 克隆项目
|
||||
git clone <repo-url>
|
||||
cd edu-brain
|
||||
|
||||
# 复制配置文件
|
||||
cp .env.example .env
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 2. 配置 .env
|
||||
|
||||
编辑 `.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
|
||||
```
|
||||
|
||||
### 3. 启动服务
|
||||
|
||||
```bash
|
||||
uvicorn app.main:app --host 0.0.0.0 --port 8765
|
||||
```
|
||||
|
||||
访问 http://localhost:8765 即可使用。
|
||||
|
||||
### 4. Docker 部署
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## 图片搜索工作流
|
||||
|
||||
```
|
||||
用户上传图片
|
||||
→ DeepSeek Vision OCR 识别文字
|
||||
→ MiniMax M2.7 提取关键词标签
|
||||
→ 存入 SQLite + BM25 索引
|
||||
|
||||
用户搜索 "孩子不想上学"
|
||||
→ 从 DB 倒序取图片(每批 10 张)
|
||||
→ 并发池(最多 10 个请求)发给 MiniMax M2.7 判断
|
||||
→ 匹配结果通过 SSE 实时推送到前端
|
||||
→ 找够指定数量或遍历完 DB 后结束
|
||||
```
|
||||
|
||||
## API 概览
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| POST | `/api/v1/images/recognize-direct` | 上传并识别图片 |
|
||||
| POST | `/api/v1/images/batch-recognize` | 批量上传并识别 |
|
||||
| GET | `/api/v1/images/search` | AI 搜索图片(SSE 流式) |
|
||||
| GET | `/api/v1/images/{id}` | 获取图片识别结果 |
|
||||
| GET | `/api/v1/pages` | 知识页面列表 |
|
||||
| POST | `/api/v1/pages` | 创建知识页面 |
|
||||
| POST | `/api/v1/search` | 语义搜索知识库 |
|
||||
| POST | `/api/v1/import/file` | 导入文件 |
|
||||
| GET | `/api/v1/settings` | 获取系统设置 |
|
||||
|
||||
## 配置说明
|
||||
|
||||
### 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` |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user