# kb-rag
**Repository Path**: StackAI/kb-rag
## Basic Information
- **Project Name**: kb-rag
- **Description**: 可自托管的企业知识库 / RAG 系统:文档解析 + 向量与 BM25 混合检索 + 标注评测闭环;可以与https://github.com/liulangjietou/customer_work 配合使用
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: https://github.com/liulangjietou/customer_work
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-09-22
- **Last Updated**: 2026-09-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# kb-rag
[](LICENSE)
[](https://github.com/liulangjietou/kb-rag/actions/workflows/ci.yml)
[](https://openjdk.org/projects/jdk/17/)
[](https://spring.io/projects/spring-boot)
[](https://www.python.org/downloads/release/python-3110/)
[](https://nodejs.org/)
[](kb-rag-deploy/docker-compose.lite.yml)
[](kb-rag-deploy/docker-compose.lite.yml)
[](kb-rag-deploy/docker-compose.lite.yml)
[](kb-rag-deploy/docker-compose.yml)
[](kb-rag-deploy/docker-compose.lite.yml)
[](kb-rag-deploy/docker-compose.yml)
[](kb-rag-deploy/README.md)
可自托管的企业知识库与 RAG 系统,提供文档接入、混合检索、有据问答、评测发布与 Agent 长期记忆。
管理人员维护知识与应用,员工使用已授权的正式应用,外部系统通过 REST / MCP 接入。
[全景架构](#全景架构) · [核心流程](#核心流程) · [快速启动](#快速启动) · [对外接入](#对外接入) · [文档导航](#文档导航)
## 作品演示
[](https://www.bilibili.com/video/BV1ECe76iEBz/?spm_id_from=333.1368.list.card_archive.click&vd_source=03686e8b5675ab4a5314432c9c02feeb)
## 全景架构
[](docs/assets/kb-rag-architecture.png)
[查看高清 PNG(6144 × 4608)](docs/assets/kb-rag-architecture.png) · [下载可编辑 SVG](docs/assets/kb-rag-architecture.svg)
| 能力 | 当前实现 |
| --- | --- |
| 接入与加工 | 文件与聊天记录、网页抓取、S3 / OSS / Confluence;双解析实现、清洗脱敏、预览确认、父子切分与多模态索引 |
| 检索与回答 | BM25 + 向量、可选图路 / 图片检索、多库路由、融合与重排、引用与诊断、非流式 / SSE 问答 |
| 应用与员工 | 版本比较、评测门禁、快照发布与回滚;员工应用授权、持久会话、运行恢复、原文引用与答案评价 |
| 知识运营 | 首页待办与最近访问、来源健康、失败项重试、文档审核 / 有效期 / 回收站、质量问题纠正与回归 |
| Agent 与企业治理 | 长期记忆与画像、REST / MCP、多租户 / RBAC / 文档 ACL、SSO / 邮箱审核注册、Token 配额、审计与监控 |
### 工程组成
| 目录 | 职责 |
| --- | --- |
| [kb-rag-server](kb-rag-server/) | Java 17 / Spring Boot 主服务;业务编排、权限、索引、检索与全部模型调用 |
| [kb-rag-parse-java](kb-rag-parse-java/) / [kb-rag-parser](kb-rag-parser/) | Java / Python 两套解析服务,共用 HTTP 契约,二选一部署;输出 Markdown、页与图片 |
| [kb-rag-web](kb-rag-web/) | React 18 / TypeScript / Ant Design 管理台与员工工作台 |
| [kb-rag-deploy](kb-rag-deploy/) | Compose、环境变量模板、OpenAPI、部署与恢复手册 |
MySQL 保存业务事实,MinIO 保存原件与解析产物;ES / Qdrant / Neo4j 承载派生检索数据。
部署模板使用 `KB_CACHE_PROVIDER=local`(MySQL 会话 + 进程内权限缓存);`redis` 模式共享会话与权限缓存。
后台任务仍采用[单实例执行基线](kb-rag-deploy/docs/DURABLE-SCHEDULING-DECISION.md)。
## 核心流程
### 1. 文档入库
```mermaid
flowchart TB
A["上传 / 来源同步"] --> B["校验文件 → 原件入 MinIO → 登记文档版本"]
B --> C["异步解析 → 清洗 / 脱敏 → 图片文本代理"]
C --> D["预览确认(可选)→ 切分 → 嵌入"]
D --> E["MySQL 分片事实 → ES / Qdrant 派生索引"]
E --> F["索引就绪 → 激活文档版本"]
E -. 写入失败 .-> R["同步状态 / 定时补偿"]
R -. 重试 .-> E
```
无嵌入 Key 时分片标记 `SKIPPED`,仍可用 BM25 检索。是否对用户可见还受审核、有效期与授权控制。
### 2. 检索与回答
```mermaid
flowchart TB
Q["问题 / 图片 → 图像分路 → 可选改写 → 多库路由"]
Q --> S["按应用配置解析实时 / 发布快照
限定知识库、文档与版本可见范围"]
S --> V["向量召回
ES / Qdrant"]
S --> B["BM25
Elasticsearch"]
S --> G["可选图路
Neo4j"]
V & B & G --> F["库内融合 → 跨库 RRF → 近重复归并 → 重排
父子归并 → 禁用内容处理 → 阈值 / top_n"]
F --> N["证据 nodes + score_type + degraded"]
N --> O["search:返回检索结果"]
N --> C["chat:证据 / 历史组装 → 模型生成 → 回答与引用"]
```
图示为文本混合检索主链;图片检索按多模态配置分路。可降级阶段通过 `degraded` 返回原因,
例如 `vector_route_unavailable`;需要生成回答时仍须配置对话模型。
### 3. 应用发布与质量回归
```mermaid
flowchart TB
subgraph P["应用发布"]
direction LR
A["配置应用
提交测试版"] --> B["门禁双跑
三态裁决"]
B -- "通过 / 强制留痕" --> C["冻结索引
与可见版本集"]
C --> D["RELEASED
历史快照可回滚"]
end
subgraph Q["知识质量问题"]
direction LR
E["检索 BAD / 零命中
建立问题"] --> F["领取与纠正
用例 / 标准证据"]
F --> G["实际答案评测
人工核验"]
G --> H["确认解决
验证新版应用"]
end
P -- "调用反馈与持续改进" --> Q
```
最终答案门禁由版本配置显式开启;质量问题通过当前用例、配置、语料、证据与评分核验后才能确认解决,修正结果用于后续发布。
发布快照固定语料基线,禁用内容和当前授权仍会约束可见性。员工答案评价单独保存,尚未自动转为知识质量问题。
### 4. 员工问答与断线恢复
```mermaid
sequenceDiagram
participant U as 员工工作台
participant A as 员工 API
participant D as MySQL 会话 / 运行账本
participant R as 检索与生成执行器
U->>A: POST 问题 + request_id
A->>A: 校验 app:use、应用范围与知识库权限
A->>D: 幂等保存问题、正式版本与运行
A-->>U: run_id / 当前状态
A->>R: 首次受理后调度执行
R->>D: 保存证据、正文检查点与终态
U->>A: GET / SSE 订阅同一 run_id
A->>D: 重验当前权限,读取已提交状态
A-->>U: snapshot → done
Note over U,A: 断线或刷新仅重新读取;不重复提交模型任务
U->>A: 明确点击停止
A->>D: 先持久化停止状态
A->>R: 再取消上游生成
```
历史与引用读取同样重验权限。进程中断后由过期扫描标记遗留运行,不自动重新生成答案。
## 快速启动
建议先用 **lite + 零 Key** 验证「上传 → 检索」:MySQL + Elasticsearch + MinIO,约需 8GB 可用内存。
full 模式使用独立 Qdrant,建议 16GB 以上。准备 Docker Compose、JDK 17、Maven 3.6+、Node.js 22;
选择 Python 解析服务时另需 Python 3.11+。
以下各代码块均从**仓库根目录**开始;解析、主服务和管理台分别占用一个终端。
### 1. 中间件
```bash
cd kb-rag-deploy
cp .env.example .env
# 编辑 .env,替换全部 CHANGE_ME_* 口令;DASHSCOPE_API_KEY 可留空
./scripts/preflight.sh lite
docker compose -f docker-compose.lite.yml up -d
docker compose -f docker-compose.lite.yml ps
```
等 `mysql`、`elasticsearch`、`minio` 均为 `healthy` 后启动应用。保留模板中的 `KB_CACHE_PROVIDER=local` 即无需 Redis。
### 2. 解析服务(二选一,终端 A)
```bash
# Java 实现
cd kb-rag-parse-java
mvn -B -ntp -DskipTests package
set -a; source ../kb-rag-deploy/.env; set +a
java -jar target/kb-rag-parse-java-1.1.0.jar --server.port=20001
```
改用 Python 实现
```bash
cd kb-rag-parser
python3.11 -m venv .venv
.venv/bin/pip install -r requirements.txt
set -a; source ../kb-rag-deploy/.env; set +a
.venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 20001
```
两套实现共用 [解析契约](kb-rag-deploy/docs/openapi/kb-parser.yaml),行为比对方法见 [Java 解析服务](kb-rag-parse-java/README.md#与-python-实现的等价性)。