# MiniRAG **Repository Path**: bueryouth/mini-rag ## Basic Information - **Project Name**: MiniRAG - **Description**: 轻量级本地多项目 RAG 知识库 API 服务,专为个人开发者设计。提供 REST API + MCP Server(嵌入主服务),供 AI Agent / Claude / Cursor / Continue.dev 调用私有知识库。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-09 - **Last Updated**: 2026-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MiniRAG 轻量级本地多项目 RAG 知识库 API 服务,专为个人开发者设计。提供 REST API + MCP Server(嵌入主服务),供 AI Agent / Claude / Cursor / Continue.dev 调用私有知识库。 ## 核心特性 | 特性 | 说明 | |------|------| | **多模型接口** | 支持 **Ollama / OpenAI-Chat / OpenAI-Response / Codex / Claude** 五种 LLM 接口,Embedding 支持 Ollama / OpenAI 兼容 | | **混合检索** | BM25 关键词检索 + 向量检索,RRF 融合算法,可选 Rerank 重排序 | | **语义分块** | 按 Markdown 标题层级分块,代码块/表格独立保留,携带 heading_path 元数据 | | **异步导入** | 大文档库异步导入,实时进度条(总文件/已处理/成功/跳过/失败/当前文件) | | **多格式解析** | 支持 **24 种格式**:md/txt/pdf/docx/doc/pptx/ppt/xlsx/xls/csv/tsv/html/htm/json/yaml/xml/epub/rtf/odt/rst/log 等(参考 firecrawl/anydoc) | | **多项目隔离** | 每个项目 = 独立 Chroma Collection,向量空间物理隔离 | | **项目级 MCP 开关** | 每个项目可独立开启/关闭 MCP 访问权限,精细控制哪些知识库可被 AI 访问 | | **元数据标签** | project_id / category / tags / source / format / parser / ocr_used / ocr_engine / heading_path / block_type 等 | | **增量更新** | 文件内容哈希检测,重复导入时未变化文件自动跳过 | | **目录监听** | watchdog 监听文件变化,防抖处理,自动同步知识库,UUID 标识防重复 | | **PDF OCR** | PyMuPDF 提取文本,扫描版自动触发 **RapidOCR**(本地,中文识别好),可选 **VLM 视觉模型** 理解图表 | | **MCP Server 嵌入主服务** | 启用后主服务自动提供 `/mcp/sse` 端点,无需单独启动进程;支持 stdio/HTTP 独立模式、7 个工具、3 个 Resources、API Key 认证、调用统计 | | **Continue.dev** | 提供 VSCode Continue.dev 插件配置,编码时自动检索私有文档 | | **统一配置** | 9 大分类配置,Web 页面可视化编辑,运行时生效,连接测试按钮 | | **Web 管理界面** | 白底黑字简洁界面,7 大功能模块,SVG 图标无 Emoji | | **本地单机部署** | 无外部数据库、无消息队列、单进程运行,支持打包 EXE | ## 技术栈 - **Web**: FastAPI + Uvicorn - **向量库**: ChromaDB(本地文件持久化) - **混合检索**: rank_bm25 (BM25) + Chroma (向量) + RRF 融合 - **LLM/Embedding**: 统一抽象层,支持 Ollama / OpenAI 兼容 / Claude / Codex - **语义分块**: 自研分块器(标题层级/代码/表格感知) - **文档解析**: PyMuPDF / python-docx / python-pptx / openpyxl / beautifulsoup4 / ebooklib / striprtf - **目录监听**: watchdog - **OCR**: RapidOCR (onnxruntime) + 可选 VLM 视觉模型 + 兼容 Tesseract - **MCP**: 官方 mcp SDK(stdio + HTTP/SSE) - **零重型框架**: 不依赖 LangChain / LlamaIndex / Milvus / Elasticsearch ## 快速开始 ### 前置要求 - Python 3.10+ - LLM 服务:Ollama 本地运行,或 OpenAI 兼容 API(如 vLLM / OneAPI / 云端 API) - Windows 10/11(桌面端需要 Edge WebView2 运行时,系统自带) ### 安装依赖 ```bash pip install -r requirements.txt ``` ### 方式一:桌面端(推荐) 双击启动,自带窗口,无需浏览器: ```bash python desktop.py ``` 桌面端特性: - 内嵌 PyWebView 窗口,高 DPI 清晰显示 - 系统托盘,最小化到后台运行 - 端口自动选择(8765 起),避免冲突 - 单实例锁,防止重复启动 ### 方式二:命令行启动 ```bash python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 ``` 或使用一键启动脚本: ```bash start.bat ``` ### 访问 - **Web 管理界面**: http://127.0.0.1:8000/ - **API 文档**: http://127.0.0.1:8000/docs - **桌面端**: 运行 `python desktop.py` 后自动打开窗口 ## Web 界面模块 | 模块 | 功能 | |------|------| | 系统概览 | LLM/OCR/MCP 状态、项目统计、支持格式列表、系统详情 | | 项目管理 | 创建/删除项目,**项目级 MCP 访问开关**,查看文档和块数统计 | | 文档管理 | 导入本地目录(同步/异步+进度)、查看文档列表、解析方式、OCR 状态 | | 目录监听 | 添加/移除监听(防重复)、实时统计(事件/同步/跳过/错误) | | 系统配置 | 9 大分类可视化配置,每个模块标题上方测试按钮,启用开关在标题栏 | | 集成配置 | MCP Server 双模式配置、Continue.dev 插件配置说明 | | 检索测试 | 选择项目输入查询,混合检索/Rerank 开关,查看检索结果、相似度、来源 | ## API 接口一览 ### 项目管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/v1/projects` | 创建项目(支持 mcp_enabled 参数) | | GET | `/api/v1/projects` | 列出项目 | | GET | `/api/v1/projects/{id}` | 项目详情 | | PATCH | `/api/v1/projects/{id}/mcp` | 切换项目 MCP 访问权限 | | GET | `/api/v1/projects/{id}/export` | 导出项目为 JSON(可选 include_embeddings 参数) | | POST | `/api/v1/projects/import` | 从 JSON 导入项目(支持 new_project_id/new_name/merge 参数) | | POST | `/api/v1/backup` | 全量备份(下载 data 目录 zip) | | POST | `/api/v1/restore` | 全量恢复(需 overwrite=true) | | DELETE | `/api/v1/projects/{id}` | 删除项目 | ### 文档管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/v1/documents/scan-dir` | 扫描目录导入(同步,增量更新) | | POST | `/api/v1/documents/scan-async` | 扫描目录导入(**异步**,返回 task_id) | | POST | `/api/v1/documents/upload` | 上传文件导入 | | DELETE | `/api/v1/documents` | 按 source 删除 | ### 任务管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/v1/tasks` | 列出最近异步任务 | | GET | `/api/v1/tasks/{task_id}` | 查询任务进度和状态 | ### 检索与问答 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/v1/retrieve` | 纯检索(Agent 核心接口,支持混合检索/Rerank) | | POST | `/api/v1/chat` | RAG 问答(支持多模型接口) | | POST | `/api/v1/chat/stream` | 流式问答 | **检索参数**(retrieve/chat 均支持): - `use_hybrid`: 是否启用混合检索(BM25+向量RRF融合),默认使用配置 - `use_rerank`: 是否启用Rerank重排序,默认使用配置 ### 配置管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/v1/config` | 获取全部配置 | | GET | `/api/v1/config/meta` | 配置元信息(表单渲染) | | PUT | `/api/v1/config/{section}` | 修改某分类配置 | | POST | `/api/v1/config/reset/{section}` | 重置配置 | ### 系统管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/v1/system/status` | 系统整体状态(LLM 自动检测 provider 连通性) | | POST | `/api/v1/test-connection` | 连接测试(llm / embedding) | | GET | `/api/v1/ocr/status` | OCR 状态(RapidOCR/VLM/Tesseract) | | GET | `/api/v1/mcp/status` | MCP 状态和配置 | | GET | `/api/v1/incremental/stats` | 增量更新统计 | | GET/POST/DELETE | `/api/v1/watchers` | 目录监听管理 | | GET | `/api/v1/watchers/stats` | 监听统计 | ## MCP Server 使用详解 MCP (Model Context Protocol) 让 AI 客户端(Claude Desktop / Cursor / Cline 等)可以直接调用你的本地知识库。 ### 方式一:嵌入主服务(推荐) 启用 MCP 后,主服务自动提供 `/mcp/sse` 端点,无需单独启动进程。 **1. 启用 MCP** - Web 界面:系统配置 → MCP 服务 → 启用 MCP Server - 或 API:`PUT /api/v1/config/mcp`,body `{"enabled": true}` **2. 重启主服务** ```bash # 重启后 MCP 端点自动生效 python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 ``` **3. 客户端配置** ```json { "mcpServers": { "minirag": { "url": "http://127.0.0.1:8000/mcp/sse" } } } ``` **4. 如果启用了 API Key 认证** ```json { "mcpServers": { "minirag": { "url": "http://127.0.0.1:8000/mcp/sse?api_key=你的密钥", "headers": {"X-API-Key": "你的密钥"} } } } ``` ### 方式二:独立 stdio(本地进程) 适合同一台机器上的 Claude Desktop / Cursor,不占用额外端口。 ```bash python -m app.mcp_server ``` 客户端配置: ```json { "mcpServers": { "minirag": { "command": "python", "args": ["-m", "app.mcp_server"], "cwd": "E:\\mis-workspace\\16-rag\\MiniRAG" } } } ``` ### 方式三:独立 HTTP/SSE(远程访问) 适合多设备访问,或 MCP 客户端不支持 stdio 的场景。 ```bash python -m app.mcp_server --transport http ``` 默认监听 `http://127.0.0.1:8765/sse`,可在配置中修改 `http_host` 和 `http_port`。 ### 项目级 MCP 访问控制 每个项目可以独立开启/关闭 MCP 访问: - **Web 界面**:项目管理 → 每个项目有 "MCP访问" 开关 - **API**:`PATCH /api/v1/projects/{id}/mcp`,body `{"enabled": true}` - **创建时指定**:`POST /api/v1/projects`,body 中 `mcp_enabled: true` 未开启 MCP 的项目,通过 MCP 工具检索时会返回错误提示,保护敏感项目不被 AI 访问。 ### 提供的 MCP 工具(7个) | 工具 | 参数 | 说明 | |------|------|------| | `search_knowledge` | `project_id`(必填), `query`(必填), `top_k`(默认5), `category`(可选) | 检索指定项目的知识库,返回相关文档片段 | | `ask_knowledge` | `project_id`(必填), `query`(必填), `top_k`(默认5), `category`(可选) | RAG 问答,返回 AI 生成的回答及引用来源 | | `list_projects` | 无 | 列出所有项目及其文档数/块数/MCP状态 | | `list_documents` | `project_id`(必填) | 列出项目下所有文档及元数据 | | `get_project_stats` | `project_id`(必填) | 项目详细统计(格式分布、分类分布、OCR使用) | | `search_all_projects` | `query`(必填), `top_k`(默认10) | 跨所有已开启MCP的项目检索 | | `get_system_status` | 无 | 获取系统状态(LLM连接、OCR、监听等) | ### MCP Resources(3个) AI 客户端可通过 URI 直接读取资源: | URI | 说明 | |-----|------| | `minirag://projects` | 所有知识库项目列表 | | `minirag://{project_id}/documents` | 指定项目的文档列表 | | `minirag://{project_id}/stats` | 指定项目的统计信息 | ### 常用用法示例 **在 Claude 中检索项目文档:** ``` 请使用 minirag 的 search_knowledge 工具, project_id: "my-app", query: "用户认证的实现方式", top_k: 5 ``` **获取 AI 生成的回答:** ``` 用 ask_knowledge 工具,project_id: "my-app", query: "这个项目的架构是怎样的?" ``` **先查看有哪些项目:** ``` 调用 list_projects 看看有哪些知识库可用 ``` **跨项目搜索:** ``` 不确定信息在哪个项目,用 search_all_projects 搜索 "数据库连接池配置" ``` **查看项目文档列表:** ``` 调用 list_documents,project_id: "my-app",看看有哪些文档 ``` ``` **按分类过滤检索:** ``` 检索 "api-design" 项目中 category 为 "architecture" 的文档, 查询内容:"微服务之间的通信方式" ``` **获取系统状态:** ``` 调用 get_system_status 检查知识库服务是否正常 ``` ### MCP 配置项(Web 系统配置 → MCP 服务) | 配置项 | 说明 | 默认值 | |--------|------|--------| | 启用 MCP Server | 全局开关 | false | | 运行模式 | stdio / http | stdio | | 服务名称 | MCP 客户端显示的名称 | minirag-mcp | | HTTP 监听地址 | 仅 http 模式 | 127.0.0.1 | | HTTP 端口 | 仅 http 模式 | 8765 | | API Key | 为空则不认证,设置后需在请求头或 URL 中携带 | 空 | ## Continue.dev 集成 1. 复制 `templates/local-rag-context-provider.js` 到 `~/.continue/extensions/local-rag/` 2. 在 `~/.continue/config.json` 中配置 contextProvider 3. 在 Continue 对话中输入 `@local-rag` 即可检索知识库 详见 `templates/` 目录下的配置模板。 ## OCR 配置 MiniRAG 支持三种 OCR 引擎,在 Web 系统配置 → PDF OCR 中切换: | 引擎 | 特点 | 适用场景 | |------|------|----------| | **RapidOCR**(默认) | pip 安装即用,onnxruntime 推理,中文识别好 | 绝大多数扫描版 PDF | | **VLM 视觉模型** | 通过 Ollama 视觉模型理解图表/流程图/排版 | 含大量图表、流程图的技术文档 | | **Tesseract** | 需手动安装引擎和语言包 | 已有 Tesseract 环境 | **VLM 模式配置:** - OCR 引擎选择 `vlm` - 配置 VLM API 地址(默认 Ollama 地址) - 配置 VLM 模型名称(如 `qwen2-vl:7b`) - 选择 vlm 后才显示 VLM 相关配置项 ## 数据迁移方案 ### 项目级导出/导入(推荐) 适用于选择性迁移、项目合并、跨机器传输。 **导出:** - Web:项目管理 → 导出按钮(可选是否包含向量数据) - API:`GET /api/v1/projects/{id}/export?include_embeddings=true` 导出的 JSON 包含: - 项目元数据(简称、名称、MCP开关等) - 所有向量块(ids/documents/metadatas/embeddings) - 文件哈希(导入后恢复增量更新能力) **导入:** - Web:项目管理 → 导入项目(可选合并模式) - API:`POST /api/v1/projects/import?merge=false` 导入选项: - `new_project_id`:指定新项目简称(留空使用原简称) - `new_name`:指定新项目名称 - `merge=true`:合并模式,项目已存在时追加数据 ### 全量备份/恢复 适用于整机迁移、系统重装前备份。 **备份:** - Web:项目管理 → 全量备份(下载 zip) - API:`POST /api/v1/backup` 备份内容:整个 `data/` 目录(项目、向量库、配置、哈希、监听配置) **恢复:** - Web:项目管理 → 全量恢复(需勾选确认覆盖) - API:`POST /api/v1/restore?overwrite=true` 恢复时原数据自动备份为 `data.backup-时间戳/`,恢复后需重启服务。 ### 迁移注意事项 | 注意事项 | 说明 | |----------|------| | **Embedding 模型一致性** | 导出包含向量时,导入后必须使用相同的 Embedding 模型,否则检索结果不准确 | | **文件路径** | 文件哈希存储绝对路径,迁移到新机器后路径可能不同,首次导入目录会全量重新解析 | | **目录监听** | 监听配置存储绝对路径,迁移后需在 Web 中重新添加监听 | | **配置覆盖** | 全量恢复会覆盖 `config.json`,包括 LLM 地址、API Key 等,恢复后需检查配置 | | **项目简称冲突** | 导入时如果简称已存在且未开启合并模式,会报错;开启合并则追加数据 | | **向量数据大小** | 包含 embeddings 的导出文件较大,大量文档时建议分批导出 | ### 迁移场景推荐 | 场景 | 推荐方式 | |------|----------| | 换电脑,全部迁移 | 全量备份 → 新机器全量恢复 → 修改配置和路径 | | 只迁移某个项目 | 项目导出 → 新机器导入 | | 合并两个项目 | 导出项目A → 导入到项目B(merge=true) | | 换 Embedding 模型 | 导出时不包含向量 → 导入后重新导入文档目录 | | 定期备份 | 全量备份 zip,保留历史版本 | ## 增量更新原理 - 每个文件导入时计算 SHA256 内容哈希,存储到 `data/file_hashes.json` - 重复导入时对比哈希,未变化的文件自动跳过 - 文件内容变化时重新解析并更新向量 - 目录监听模式下,文件修改自动触发增量同步 - 项目导出时包含文件哈希,导入后自动恢复增量更新能力 ## 桌面端使用 MiniRAG 提供基于 PyWebView 的桌面端,无需打开浏览器,直接在独立窗口中使用。 ### 启动 ```bash python desktop.py ``` ### 桌面端特性 - **独立窗口**:内嵌 Web 界面,高 DPI 清晰显示 - **系统托盘**:关闭窗口最小化到托盘,右键菜单可显示窗口/打开浏览器/退出 - **端口自动选择**:从 8765 开始自动查找可用端口,避免冲突 - **单实例锁**:防止重复启动 - **无控制台**:打包后不显示命令行窗口 ### 托盘菜单 - **显示窗口**:从托盘恢复主窗口 - **打开浏览器**:在默认浏览器中打开管理界面 - **退出**:完全关闭 MiniRAG ### 注意事项 - Windows 10/11 自带 Edge WebView2 运行时,无需额外安装 - 桌面端运行后,API 服务同样可以通过 `http://127.0.0.1:端口` 访问 - MCP 客户端连接时请使用桌面端实际运行的端口(启动日志中显示) ## 打包 EXE ```bash # 一键打包 build.bat # 或手动执行 pyinstaller minirag.spec ``` 打包产物在 `dist/MiniRAG/` 目录,运行 `MiniRAG.exe` 即可启动服务。 ## 目录结构 ``` MiniRAG/ ├── app/ │ ├── main.py # 入口(FastAPI + MCP 嵌入) │ ├── config_manager.py # 统一配置管理 │ ├── models.py # Pydantic 数据模型 │ ├── vector_store.py # 向量存储(多项目隔离 + 导出导入) │ ├── rag.py # RAG 检索问答 │ ├── chunker.py # 语义分块器 │ ├── hashing.py # 增量更新哈希 │ ├── task_manager.py # 异步任务管理 │ ├── watcher.py # 目录监听 │ ├── mcp_server.py # MCP Server(7工具 + 3 Resources) │ ├── llm/ # 多模型抽象层 │ │ ├── base.py │ │ ├── providers.py # Ollama/OpenAI/Claude/Codex │ │ └── factory.py │ ├── retrieval/ │ │ └── hybrid.py # 混合检索(BM25+向量+Rerank) │ ├── parser/ # 多格式解析器(24种格式) │ │ ├── __init__.py │ │ ├── pdf.py # PDF + RapidOCR/VLM │ │ ├── text.py │ │ ├── office.py │ │ ├── web.py │ │ ├── data.py │ │ └── ebook.py │ ├── routes/ # API 路由 │ │ ├── projects.py # 项目管理 + 导出导入 + 备份恢复 │ │ ├── documents.py │ │ ├── query.py │ │ ├── system.py │ │ ├── config.py │ │ └── tasks.py │ └── static/ │ ├── index.html # Web 管理界面(纯 HTML) │ ├── css/ │ │ └── style.css # 样式 │ ├── js/ │ │ └── app.js # 交互脚本 │ └── img/ │ ├── logo.png │ └── logo.ico ├── desktop.py # 桌面端启动入口(PyWebView + 系统托盘) ├── templates/ # Continue.dev 配置模板 ├── data/ # 运行时数据(自动创建) ├── requirements.txt ├── run.py # 打包入口 ├── minirag.spec # PyInstaller 配置 ├── build.bat # 一键打包脚本 ├── start.bat # 一键启动脚本 └── README.md ``` ## 配置说明 配置存储在 `data/config.json`,可通过 Web 界面或 API 修改,运行时立即生效。 | 分类 | 说明 | |------|------| | server | 服务端口、主机 | | llm | LLM provider、base_url、model、api_key | | embedding | Embedding provider、base_url、model | | rerank | Rerank 模型配置 | | ocr | OCR 引擎(rapidocr/vlm/tesseract)、DPI、VLM 配置 | | watcher | 目录监听防抖 | | chunking | 分块大小、重叠、语义分块开关 | | mcp | MCP 模式(stdio/http)、名称、HTTP 地址、API Key | | retrieval | 默认 top_k、相似度阈值、混合检索开关 | ## 常见问题 ### MCP 调用报错 "AssertionError: Unexpected message" 这是 FastAPI BaseHTTPMiddleware 与 MCP SSE 流式响应不兼容导致的。v2.4 已将 MCP 认证中间件改为纯 ASGI 中间件,升级后重启服务即可。 ### LLM 显示"未连接" 检查系统配置中 LLM 的 provider 和 base_url 是否正确。MiniRAG 会根据配置的 provider 自动检测对应服务的连通性,不再固定检测本地 Ollama。 ### 目录监听无法删除 旧版本监听 ID 格式为 `project_id::目录路径`,含特殊字符导致 URL 解析失败。v2.2 已改为 UUID,并自动迁移旧格式 ID。 ### 导出项目时报错 "Unable to serialize numpy.ndarray" v2.4 已修复,导出时自动将 numpy 数组转为 list。 ### 打包后 OCR 不可用 RapidOCR 依赖 onnxruntime 模型文件,打包时需确保 `collect_submodules('onnxruntime')` 已包含在 spec 中。使用项目自带的 `minirag.spec` 即可。 ### 换电脑后检索结果不准确 检查 Embedding 模型是否与导出时一致。如果换了模型,需要重新导入文档目录(导出时选择不包含向量)。 ### 桌面端窗口模糊 确保使用 `desktop.py` 启动,已内置高 DPI 支持。如果仍模糊,检查 Windows 显示设置中的缩放比例。 ## 版本历史 ### v2.4 - MCP 嵌入主服务,7 个工具 + 3 个 Resources + API Key 认证 - 项目模型重构:简称 + UUID 唯一 ID,自动数据迁移 - 项目导出/导入(含向量/文件哈希),全量备份/恢复 - MCP 认证改为纯 ASGI 中间件,修复 SSE 流式响应冲突 - get_system_status 改为直接调用内部函数,修复超时 ### v2.3 - OCR 升级为 RapidOCR(本地,中文识别好),保留 VLM 视觉模型接口 - LLM 连通性检测按 provider 自动适配 - Web 页面 UI 美化,测试按钮位置优化,全局去除 Emoji ### v2.2 - 重命名为 MiniRAG,系统配置增加测试按钮 - 监听 ID 改为 UUID,修复无法删除问题 - Web 页面重写为左侧导航布局,增加 Logo ### v2.1 - 多模型接口:Ollama/OpenAI-Chat/OpenAI-Response/Codex/Claude - 混合检索(BM25+向量 RRF 融合)+ 可选 Rerank - 语义分块器(按 Markdown 标题层级) - 异步导入 + 实时进度条 ### v2.0 - 统一配置系统(9 分类) - 多格式解析器重构(24 种格式,参考 anydoc) - 增量更新(SHA256 哈希) - MCP Server(stdio 模式) - Continue.dev 集成 ### v1.0 - FastAPI + ChromaDB + Ollama 核心服务 - 多格式解析、多项目隔离、元数据标签 - 纯检索 API + RAG 问答 - Web 管理页面 + 目录监听 + OCR