融合 RAG 与 AI Agent 技术的企业级智能知识平台
让每一次提问都有据可查 —— 文档上传 · 智能解析 · 混合检索 · AI 对话 · 引用溯源
核心亮点 · 系统架构 · 功能模块 · 技术栈 · 快速开始 · API 概览 · 项目结构
Argus(百眼巨人)—— 在希腊神话中,Argus 拥有一百只眼睛,即使睡着也有眼睛保持警惕。我们以此命名,寓意平台如同百眼巨人一般,全面洞察你的私有知识资产,让每一次提问都有据可查。
Argus 不是另一个"套壳 ChatGPT"。它是一个从底层构建的 RAG(检索增强生成)知识库平台,将企业私有文档与大语言模型深度融合,解决 LLM 在垂直领域应用中的三大核心痛点:
| 痛点 | Argus 的解决方案 |
|---|---|
| 🔮 幻觉编造 | 混合检索 + 证据评估 + 结构化输出,确保回答基于真实文档,无法回答时主动拒答 |
| 📚 知识割裂 | 自动文档解析 → 切片 → 向量化 → 索引,打通从文件到知识的全链路 |
| 🧠 无记忆对话 | ReactAgent + 三级短期记忆压缩,支持跨轮次的上下文感知对话 |
|
从文档上传到 AI 回答,构建了完整的 RAG 流水线: 不是简单的"搜索 + GPT 包装",而是自研了查询规划、RRF 融合排序、四级证据评估等关键环节。 |
基于 Spring AI Alibaba ReactAgent 图执行引擎,支持:
|
|
向量语义检索 + 关键词全文检索 双通道并行,RRF(Reciprocal Rank Fusion)融合排序:
|
|
graph TB
subgraph 前端层
A[Vue 3 SPA<br/>Element Plus + Pinia]
end
subgraph 网关层
B[JWT 认证过滤器<br/>Access Token + Refresh Token]
end
subgraph 业务服务层
C[认证授权<br/>注册/登录/令牌管理]
D[群组协作<br/>创建/邀请/审批/成员管理]
E[文档管理<br/>分片上传/预览/下载/软删除]
F[ETL 流水线<br/>解析/清洗/切片/向量化/索引]
G[知识问答<br/>查询规划/混合检索/证据评估/回答生成]
H[AI 助手<br/>ReactAgent/会话管理/短期记忆/SSE流式]
end
subgraph 数据与检索引擎
I[(PostgreSQL<br/>+ pgvector<br/>HNSW 向量索引)]
J[(Elasticsearch<br/>+ IK 分词器<br/>关键词检索)]
K[(MinIO<br/>对象存储<br/>文档持久化)]
end
subgraph AI 模型层
L[DashScope<br/>通义千问 Chat]
M[DashScope<br/>text-embedding-v3]
end
A --> B
B --> C & D & E & F & G & H
E --> K
F --> I & J & K
G --> I & J & L
H --> G & L
E -.->|Spring Event 异步触发| F
- 用户注册/登录、JWT 双令牌认证、角色权限(Admin / 普通用户)
- 创建知识库群组、邀请成员(邀请码机制)、加入申请与审批流程
- 群组内三级角色:Owner / Manager / Member,细粒度权限控制
- 分片上传协议:三阶段(init → chunk upload → complete),支持断点续传、秒传检测(SHA-256)
- 多格式解析:PDF / DOCX / MD / TXT,自动编码检测
- ETL 异步流水线:Spring Event +
@Async+@Retryable,7 步全自动处理 - 对象存储:MinIO S3 兼容存储,
@ConditionalOnProperty按需启用
- LLM 查询规划:自动判断 DIRECT / REWRITE / DECOMPOSE 策略,最多 3 条并行检索
- RRF 双通道融合:向量 + 关键词结果统一排序,类簇聚合 + 邻居窗口扩展
- 四级证据评估:NONE → WEAK → PARTIAL → SUFFICIENT,证据不足时主动拒答
- 引用溯源:每条回答附带引用片段、来源文档、相关性评分
- ReactAgent 图执行引擎:"思考 → 工具调用 → 生成回复"完整链路
- CHAT / KB_SEARCH 双模式:纯对话 or 知识库检索,同一会话内动态切换
- BEFORE_MODEL Hook:模型调用前自动注入上下文(compact summary → session memory → recent messages)
- 短期记忆三级压缩:
- L1 会话记忆(增量 LLM 摘要,保留关键事实和决策)
- L2 紧凑摘要(精炼的历史压缩,丢弃冗余细节)
- L3 运行时截断(Token 超 50000 时的最后防线)
- SSE 流式输出:Delta 去重 + AGENT_MODEL_FINISHED 兜底
| 层次 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 语言 | Java | 21 | Record 语法、虚拟线程、模式匹配 |
| 框架 | Spring Boot | 3.5.0 | Spring MVC,Jakarta EE 9+ |
| ORM | MyBatis-Plus | 3.5.15 | Lambda 类型安全查询 |
| 数据库 | PostgreSQL + pgvector | 16+ | HNSW 向量索引,COSINE_DISTANCE |
| 搜索引擎 | Elasticsearch | 8.x | IK 中文分词,JDK HttpClient 直连 |
| 对象存储 | MinIO | latest | S3 兼容,composeObject 合并分片 |
| AI Chat | Spring AI Alibaba | 1.1.2.0 | DashScope 原生集成(通义千问) |
| AI Agent | Spring AI Alibaba Agent | 1.1.2.0 | ReactAgent 图执行引擎 |
| AI Embedding | Spring AI | 1.1.2 | OpenAI 兼容模式,512 维向量 |
| 认证 | JJWT | 0.12.6 | HMAC-SHA256 JWT 签发与解析 |
| 密码加密 | Spring Security Crypto | — | BCrypt 自适应哈希 |
| 文档解析 | Apache PDFBox / POI | 2.0.31 / 5.2.5 | PDF + DOCX 文本提取 |
| 重试框架 | Spring Retry | — | @Retryable + @Recover 声明式重试 |
| API 文档 | Knife4j + SpringDoc | 4.5.0 | /doc.html 增强 UI,在线调试 |
| 层次 | 技术 | 版本 |
|---|---|---|
| 语言 | TypeScript | 6.0 |
| 框架 | Vue 3 (Composition API) | 3.5 |
| 构建 | Vite | 8.0 |
| 路由 | Vue Router | 5.0 |
| 状态管理 | Pinia | 3.0 |
| UI 组件 | Element Plus | 2.14 |
| HTTP 客户端 | Axios | 1.16 |
| Markdown | marked | 18.0 |
| 组件 | 用途 |
|---|---|
| PostgreSQL + pgvector | 关系型主存储 + HNSW 向量索引(512 维,COSINE_DISTANCE) |
| Elasticsearch 8.x | IK 中文分词 + BM25 关键词检索 + 两阶段 bool/rescore 打分 |
| MinIO | S3 兼容对象存储,分片合并(composeObject),条件装配 |
| DashScope | 通义千问 Chat 模型 + text-embedding-v3 Embedding 模型 |
| 组件 | 版本要求 | 说明 |
|---|---|---|
| JDK | 21 | Record 语法、虚拟线程 |
| Node.js | ≥ 20.19 | 前端构建 |
| PostgreSQL | 16+ | 需安装 pgvector 扩展 |
| Elasticsearch | 8.x | 需安装 IK 中文分词器插件 |
| MinIO | latest | 对象存储(可按需启用) |
| DashScope API Key | — | LLM Chat + Embedding 共用 |
PostgreSQL + pgvector
# 安装 pgvector 扩展
psql -h <host> -U <user> -d <database> -c "CREATE EXTENSION IF NOT EXISTS vector;"
# 执行建表脚本
psql -h <host> -U <user> -d <database> -f sql/schema.sqlMinIO(Docker)
docker run -d --name minio \
-p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
minio/minio server /data --console-address ":9001"
# 访问 http://localhost:9001 创建 Bucket(默认:argus-rag-documents)Elasticsearch + IK 分词器
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
elasticsearch:8.x
# 安装 IK 分词器
docker exec -it elasticsearch bin/elasticsearch-plugin install \
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.x/elasticsearch-analysis-ik-8.x.zip
docker restart elasticsearch编辑 Argus-backend/src/main/resources/application-local.yml,填写数据库、中间件和 LLM 配置:
# 数据库
spring.datasource.url: jdbc:postgresql://localhost:5432/dd_rag
spring.datasource.username: your_username
spring.datasource.password: your_password
# LLM
spring.ai.dashscope.api-key: ${DASHSCOPE_API_KEY}
spring.ai.openai.api-key: ${DASHSCOPE_API_KEY} # 与 DashScope 共用 Key
# 对象存储(可选)
storage.minio.endpoint: http://localhost:9000
storage.minio.access-key: minioadmin
storage.minio.secret-key: minioadmin
# Elasticsearch
elasticsearch.host: localhost
elasticsearch.port: 9200# 设置 JDK 21
export JAVA_HOME="/path/to/jdk-21"
cd Argus-backend
# 编译
./mvnw clean compile
# 启动(默认 local 环境,端口 10001)
./mvnw spring-boot:run
# API 文档:http://localhost:10001/doc.htmlcd Argus-frontend
npm install
npm run dev
# 访问:http://localhost:5173开发环境(--spring.profiles.active=dev)自动创建管理员账户:
| 用户名 | 密码 | 角色 |
|---|---|---|
admin |
admin123 |
系统管理员 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/auth/register |
用户注册 |
| POST | /api/auth/login |
用户登录(返回 Access + Refresh Token) |
| POST | /api/auth/refresh |
刷新令牌(Cookie 中的 Refresh Token) |
| POST | /api/auth/logout |
登出(清除 Refresh Token) |
| GET | /api/auth/me |
获取当前用户信息 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/groups |
创建群组 |
| GET | /api/groups |
查询可见群组列表 |
| POST | /api/groups/{id}/invitations |
创建邀请 |
| POST | /api/groups/{id}/join-request |
申请加入 |
| POST | /api/groups/invitations/{id}/accept |
接受邀请 |
| DELETE | /api/groups/{id}/members/{userId} |
移除成员 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/documents/upload/init |
初始化分片上传(秒传/续传检测) |
| POST | /api/documents/upload/chunks |
上传分片 |
| POST | /api/documents/upload/{id}/complete |
完成上传,触发 ETL |
| POST | /api/documents/upload |
小文件直接上传(≤10MB) |
| GET | /api/documents |
文档列表(多条件筛选) |
| GET | /api/documents/{id}/preview |
预览文档 |
| GET | /api/documents/{id}/download |
下载文档 |
| DELETE | /api/documents/{id} |
软删除文档 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/qa/ask |
提交问题,获取 AI 回答 + 引用溯源 |
📋 请求/响应示例
请求:
{
"groupId": 1,
"question": "文档上传流程是什么?上传失败后如何重试?"
}响应:
{
"answered": true,
"answer": "文档上传流程分为三个阶段:初始化、分片上传、完成合并。首先调用 /upload/init 初始化会话...",
"citations": [
{
"documentId": 1,
"chunkId": 15,
"fileName": "Argus使用手册.pdf",
"score": 0.97
}
]
}| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/assistant/sessions |
创建新会话 |
| GET | /api/assistant/sessions |
会话列表 |
| PATCH | /api/assistant/sessions/{id} |
重命名会话 |
| DELETE | /api/assistant/sessions/{id} |
删除会话 |
| POST | /api/assistant/chat |
同步聊天(CHAT / KB_SEARCH) |
| POST | /api/assistant/chat/stream |
流式聊天(SSE,逐字推送) |
| GET | /api/assistant/sessions/{id}/context |
获取会话上下文(含摘要) |
Argus/
├── Argus-backend/ # Spring Boot 后端
│ └── src/main/java/com/argus/rag/
│ ├── auth/ # 认证授权(JWT 双令牌)
│ ├── user/ # 用户管理
│ ├── group/ # 群组协作(邀请/审批/角色)
│ ├── document/ # 文档管理(分片上传/预览/下载)
│ ├── ingestion/ # ETL 流水线(解析/切片/向量化/索引)
│ │ └── service/pipeline/
│ │ ├── reader/ # 文档读取器
│ │ ├── parser/ # 多格式解析器(PDF/DOCX/MD/TXT)
│ │ └── transformer/ # 文本清洗 + 结构感知切片
│ ├── qa/ # 知识库问答(查询规划/RRF 融合/证据评估)
│ │ └── rag/ # 混合检索引擎
│ ├── assistant/ # AI 助手(ReactAgent/短期记忆/SSE 流式)
│ │ ├── agent/ # Agent 工厂 + 知识库检索工具
│ │ ├── memory/ # 三级短期记忆压缩
│ │ └── service/ # 对话编排 + 会话管理
│ └── engine/ # 基础设施(ES/PGvector/MinIO)
│
├── Argus-frontend/ # Vue 3 前端
│ └── src/
│ ├── api/ # 后端 API 封装
│ ├── views/ # 页面组件
│ │ ├── HomeView.vue # 产品首页
│ │ ├── documents/ # 文档管理
│ │ ├── qa/ # 知识库问答
│ │ ├── assistant/ # AI 助手
│ │ ├── groups/ # 协作小组
│ │ └── admin/ # 用户管理
│ ├── stores/ # Pinia 状态管理
│ └── components/ # 公共组件
│
├── docs/ # 项目文档
│ ├── V1.0-项目文档.md # 用户认证 + 群组管理
│ ├── V2.0-项目文档.md # 文档上传 + ETL 流水线
│ ├── V3.0-项目文档.md # 知识库问答(RAG)
│ └── V4.0-项目文档.md # AI 助手 Agent + 流式对话
│
└── sql/
└── schema.sql # 数据库建表 DDL
Argus 采用渐进式迭代的开发方式,每个版本聚焦一个核心主题:
| 版本 | 主题 | 核心交付 |
|---|---|---|
| V1.0 | 🏗️ 基础设施 | 用户认证(JWT 双令牌)、群组协作(邀请/审批/角色)、项目骨架 |
| V2.0 | 📄 文档引擎 | 分片上传(断点续传/秒传)、ETL 流水线、双路检索(向量 + 关键词) |
| V3.0 | 🧠 RAG 问答 | 查询规划(LLM)、RRF 融合排序、四级证据评估、引用溯源 |
| V4.0 | 🤖 AI Agent | ReactAgent 图引擎、CHAT/KB_SEARCH 双模式、短期记忆三级压缩、SSE 流式 |
详细的设计决策和技术文档请参阅
docs/目录。
欢迎提交 Issue 和 Pull Request!
在提交 PR 之前,请确保:
- 代码通过编译(
./mvnw clean compile) - 遵循项目现有的代码风格和命名规范
- 新增功能包含相应的 JavaDoc 或注释
本项目采用 MIT 开源协议。
Made with ❤️ by the Argus team · 让每一次提问都有据可查