基于 RAG(检索增强生成)的本地知识库问答助手,完全本地化部署,数据不出本机。
- 知识库管理:创建、编辑、删除知识库,支持添加描述用于辅助检索
- 文档管理:上传 PDF/DOCX/TXT/MD 文档,自动解析、分块、向量化,支持文件去重
- 异步处理:文档上传即时返回,后台异步完成分片和向量化,失败可手动重试
- 文档摘要:上传时自动生成文档摘要,支持全局性/概括性问答
- 智能问答:基于知识库的 RAG 问答 + 不依赖知识库的通用对话,自动切换
- 引用溯源:回答附带引用来源标签,显示知识库、文件名、分片编号,点击按需加载原文
- 思考过程:展示模型推理链路(reasoning),支持历史消息回显
- 检索增强:可选启用查询改写、BM25+向量混合检索、LLM 重排序、上下文扩展
- 流式输出:SSE 逐 token 推送,首字符延迟低
- 多知识库联合检索:单次对话可同时关联多个知识库
- 模型切换:支持在多个本地 Ollama 模型间动态切换
- 可视化配置:前端设置页面修改模型、RAG 参数、检索增强策略,支持一键重置
- 一键安装:前后端打包为 macOS .dmg 安装包
| 层次 |
技术 |
| 前端 |
Electron 28 + React 18 + TypeScript + Ant Design 6 + @ant-design/x + Zustand |
| 后端 |
Python + FastAPI + SQLAlchemy (async) + aiosqlite |
| LLM |
Ollama (默认 qwen3:14b 对话 / qwen2.5:14b 摘要 / qwen3-embedding:4b 嵌入) |
| 向量库 |
ChromaDB |
| 关系库 |
SQLite |
| 混合检索 |
rank_bm25 + jieba 分词 |
| 构建工具 |
Vite 5 + PyInstaller + electron-builder |
- 安装 Ollama
- 拉取所需模型:
ollama pull qwen3:14b
ollama pull qwen2.5:14b
ollama pull qwen3-embedding:4b
cd backend
# 创建虚拟环境
python3 -m venv .venv
source .venv/bin/activate # macOS/Linux
# 或 .venv\Scripts\activate # Windows
# 安装依赖
pip install -r requirements.txt
# 启动服务
uvicorn app.main:app --reload --host 0.0.0.0 --port 8001
cd frontend
# 安装依赖
npm install
# 开发模式(仅 Web)
npm run dev
# 开发模式(Electron)
npm run electron:dev
./build.sh
# 输出:frontend/out/*.dmg
| 方法 |
路径 |
说明 |
| POST |
/api/knowledge-bases |
创建知识库(含描述) |
| GET |
/api/knowledge-bases |
获取知识库列表 |
| GET |
/api/knowledge-bases/{id} |
获取知识库详情(含文档列表) |
| PUT |
/api/knowledge-bases/{id} |
更新知识库信息 |
| DELETE |
/api/knowledge-bases/{id} |
删除知识库(级联删除文档和向量) |
| 方法 |
路径 |
说明 |
| POST |
/api/documents/upload |
上传文档(异步处理,即时返回) |
| GET |
/api/documents |
获取文档列表(支持按知识库过滤) |
| GET |
/api/documents/{id} |
获取文档详情(含分片内容) |
| GET |
/api/documents/{id}/chunks/{index} |
获取单个分片内容(按需加载,index=-1 返回摘要) |
| POST |
/api/documents/{id}/reindex |
重新分片(用于失败重试) |
| DELETE |
/api/documents/{id} |
删除文档(同时清理向量和文件) |
| 方法 |
路径 |
说明 |
| POST |
/api/chat |
发送消息(SSE 流式返回,含引用信息) |
| POST |
/api/chat/conversations |
创建新对话 |
| GET |
/api/chat/conversations |
获取对话列表 |
| GET |
/api/chat/conversations/{id} |
获取对话详情(含消息、reasoning、references) |
| PUT |
/api/chat/conversations/{id} |
更新对话标题 |
| DELETE |
/api/chat/conversations/{id} |
删除对话 |
| GET |
/api/chat/models |
获取可用模型列表 |
| 方法 |
路径 |
说明 |
| GET |
/api/settings |
获取当前配置及默认值 |
| PUT |
/api/settings |
修改配置项 |
| POST |
/api/settings/reset |
重置为默认值 |
Atlas/
├── frontend/ # Electron + React 前端
│ ├── src/
│ │ ├── main/index.js # Electron 主进程(后端进程管理、动态端口)
│ │ ├── preload/preload.js # 预加载脚本(安全桥接)
│ │ └── renderer/ # React 渲染进程
│ │ ├── App.tsx # 根组件(布局与视图切换)
│ │ ├── components/
│ │ │ ├── ChatPanel.tsx # 对话面板(流式渲染、引用展示)
│ │ │ ├── Sidebar.tsx # 侧边栏(对话/知识库列表)
│ │ │ ├── KnowledgeBaseView.tsx # 知识库文档管理(状态展示、重试)
│ │ │ └── SettingsPage.tsx # 配置页面
│ │ ├── services/api.ts # API 服务层(HTTP + SSE 流式解析)
│ │ └── stores/ # Zustand 状态管理
│ │ ├── conversationStore.ts
│ │ └── knowledgeBaseStore.ts
│ ├── build/entitlements.mac.plist # macOS 权限声明
│ └── package.json # 依赖与 electron-builder 打包配置
│
├── backend/ # Python FastAPI 后端
│ ├── app/
│ │ ├── main.py # FastAPI 入口(生命周期、中间件、路由)
│ │ ├── config.py # 全局配置(pydantic-settings,支持前端可视化修改)
│ │ ├── api/
│ │ │ ├── chat.py # 对话 API(SSE 流式、引用溯源)
│ │ │ ├── documents.py # 文档 API(异步上传、去重、重试)
│ │ │ ├── knowledge_bases.py # 知识库 API
│ │ │ ├── settings.py # 配置管理 API
│ │ │ └── history.py # 历史消息 API
│ │ ├── core/
│ │ │ ├── rag.py # RAG 编排(查询改写、混合检索、重排序、上下文扩展)
│ │ │ ├── vectorstore.py # ChromaDB 封装(语义检索、BM25 语料获取)
│ │ │ ├── ollama.py # Ollama 模型服务(对话 + 嵌入)
│ │ │ ├── parser.py # 多格式文档解析(PDF/DOCX/TXT/MD)
│ │ │ └── chunker.py # 文本分块(中英文优化的递归分割)
│ │ ├── models/models.py # ORM 模型(KnowledgeBase, Document, Conversation, Message, Setting)
│ │ └── db/
│ │ ├── database.py # 异步引擎、会话管理、增量迁移
│ │ └── crud.py # CRUD 操作
│ ├── run.py # PyInstaller 入口
│ ├── atlas-backend.spec # PyInstaller 打包配置
│ └── requirements.txt
│
├── data/ # 运行时数据(自动生成)
│ ├── chroma/ # ChromaDB 向量库
│ ├── sqlite/atlas.db # SQLite 数据库
│ └── uploads/ # 上传的文档
│
├── build.sh # 一键构建脚本
└── TODO.md # 开发任务追踪
- PDF (.pdf) — PyMuPDF 逐页提取
- Word (.docx) — mammoth 转 Markdown(失败时回退 python-docx)
- 文本 (.txt) — 自动检测编码
- Markdown (.md)
通过前端设置页面或 PUT /api/settings 接口可调整:
| 分组 |
配置项 |
默认值 |
说明 |
| 模型配置 |
ollama_base_url |
http://127.0.0.1:11434 |
Ollama 服务地址 |
| 模型配置 |
ollama_chat_model |
qwen3:14b |
对话模型 |
| 模型配置 |
ollama_summary_model |
qwen2.5:14b |
摘要模型 |
| 模型配置 |
ollama_embedding_model |
qwen3-embedding:4b |
嵌入模型 |
| RAG 参数 |
chunk_size |
600 |
分片大小(字符数) |
| RAG 参数 |
chunk_overlap |
100 |
分片重叠(字符数) |
| RAG 参数 |
chunk_min_chars |
60 |
最小分片字符数(过短分片自动合并) |
| RAG 参数 |
retrieval_top_k |
5 |
检索 Top-K |
| 对话参数 |
max_history_messages |
10 |
最大历史消息轮数 |
| 检索增强 |
enable_query_rewrite |
false |
启用查询改写 |
| 检索增强 |
enable_hybrid_search |
false |
启用 BM25+向量混合检索 |
| 检索增强 |
enable_reranking |
false |
启用 LLM 重排序 |
| 检索增强 |
bm25_weight |
0.3 |
BM25 权重(0-1) |
| 检索增强 |
rerank_top_n |
15 |
重排序初筛数量 |
MIT