# 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 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 |