Files
HuiBrain/README.md
EduBrain Dev 4c6a20e5fc chore: 项目更名为 HuiBrain
全局替换 EduBrain -> HuiBrain, edu-brain -> huibrain, edu_brain -> hui_brain, EDUBRAIN -> HUIBRAIN
涉及文件:README.md, pyproject.toml, docker-compose.yml, .env, .env.example,
app/config.py, app/main.py, app/wework_bot.py, app/__init__.py, app/mcp/server.py,
static/index.html, docs/IMAGE_API_GUIDE.md
2026-04-14 15:03:43 +08:00

230 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HuiBrain - 中文直播教育知识库系统
基于 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 |
## 项目结构
```
huibrain/
├── 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. 环境准备
```bash
# 克隆项目
git clone <repo-url>
cd huibrain
# 复制配置文件
cp .env.example .env
# 安装依赖
pip install -r requirements.txt
```
### 2. 配置 .env
编辑 `.env` 文件,至少配置以下项:
```env
# 数据库(默认 SQLite无需额外配置
DATABASE_URL=sqlite+aiosqlite:///hui_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. 启动服务
```bash
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 部署
```bash
docker-compose up -d
```
## 图片搜索工作流
```
用户上传图片
→ DeepSeek Vision OCR 识别文字
→ 检查 OCR 内容是否已存在(去重)
→ MiniMax M2.7 提取关键词标签
→ 存入 SQLite + BM25 索引
用户搜索 "孩子不想上学"
→ 从 DB 倒序取图片(每批 N 张,可配置)
→ 并发池发给 MiniMax M2.7 判断
→ 匹配结果通过 SSE 实时推送到前端
→ 找够指定数量或遍历完 DB 后结束
```
## 企业微信机器人
### 功能
| 场景 | 说明 |
|------|------|
| 单聊发关键词 | 搜索图片知识库,返回匹配结果(图片+预览文字) |
| 单聊发图片 | 自动 OCR 识别并录入知识库(自动去重) |
| 进入会话 | 自动发送欢迎语 |
### 配置
1. 在企业微信管理后台创建智能机器人,开启 API 模式(长连接)
2. 获取 Bot ID 和 Secret
3.`.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 |