一个基于Java的Rag系统
作者:ZhiMy
版本:0.1.0-SNAPSHOT
环境:Java 21+ / Spring Boot 3.5 / Spring AI 1.0.3
rag4j/
├── rag4j-app/ # 应用层 - Web服务入口
├── rag4j-framework/ # 框架层 - 核心抽象与通用能力
├── rag4j-project/ # 实现层 - 具体技术实现
└── test/ # 测试模块
应用服务入口,提供 REST API 接口,负责业务编排。
| 包名 | 功能说明 |
|---|---|
cn.rag4j.agent |
Agent 智能体管理(基础信息、工作流) |
cn.rag4j.chunk |
文档切片管理 |
cn.rag4j.document |
文档管理 |
cn.rag4j.directory |
目录管理 |
cn.rag4j.file |
文件上传与存储 |
cn.rag4j.knowledgebase |
知识库管理 |
cn.rag4j.model |
模型配置管理 |
cn.rag4j.config |
应用配置(异步、MyBatis、上下文等) |
核心框架抽象,定义接口规范与通用能力。
rag4j-framework/
├── rag4j-framework-common/ # 通用工具与基础类
├── rag4j-framework-chunk/ # 文档切片抽象
├── rag4j-framework-document/ # 文档处理抽象
├── rag4j-framework-dag/ # DAG 工作流引擎
├── rag4j-framework-model-suppliers/ # 模型供应商抽象
├── rag4j-framework-vector-store/ # 向量存储抽象
├── rag4j-framework-recall/ # RAG 召回抽象
├── rag4j-framework-knowledgebase/ # 知识库抽象
├── rag4j-framework-file/ # 文件处理抽象
└── rag4j-framework-system/ # 系统级功能
通用基础模块,提供:
文档切片框架,核心接口:
/**
* 文档切分接口
*/
public interface DocumentChunk<T extends BaseChunkConfig, C extends Chunk> {
// 执行切片
List<C> chunk(String text, T chunkConfig);
// 获取切片类型
String getType();
// 保存切片
List<Chunk> saveChunk(List<C> chunks);
}
文档处理框架:
DAG(有向无环图)工作流引擎,支持可视化编排:
dag/
├── engine/
│ ├── WorkflowEngine.java # 工作流执行引擎
│ └── Router.java # 节点路由器
├── executor/
│ ├── NodeExecutor.java # 节点执行器接口
│ ├── StartNodeExecutor.java # 开始节点
│ ├── EndNodeExecutor.java # 结束节点
│ ├── LlmExecutor.java # LLM 节点
│ ├── ConditionNodeExecutor.java # 条件分支节点
│ └── ExecutorFactory.java # 执行器工厂
├── model/
│ ├── def/ # 工作流定义(节点、边、条件)
│ ├── conf/ # 节点配置
│ ├── run/ # 运行时状态
│ └── entity/ # 变量实体
└── store/
└── RunStore.java # 运行状态存储
工作流执行流程:
向量存储抽象层:
vector-store/
├── store/
│ ├── IVectorStore.java # 向量存储接口
│ ├── VDocument.java # 向量文档实体
│ └── hybrid/ # 混合存储(多存储协同)
│ ├── HybridVectorStore.java
│ ├── insert/ # 插入操作
│ └── delete/ # 删除操作
└── search/
├── ISearch.java # 搜索接口
├── HybridSearch.java # 混合搜索
└── request/response/ # 请求响应实体
RAG 召回框架,实现检索增强生成的核心流程:
/**
* RAG 召回核心类
*/
public class RagRecall {
public List<Chunk> recall(RagRecallDTO ragRecallDTO) {
// 1. 搜索策略执行
List<BaseSearchResponse> search = searchStrategy.search(...);
// 2. 重排序
List<SearchRerankResponse> rerank = rerankStrategy.rerank(...);
// 3. 召回扩展
return recallExpansion.expansion(rerank);
}
}
召回流程:
模型供应商抽象,基于 Spring AI:
具体技术实现,可插拔式设计。
rag4j-project/
├── rag4j-chunk/ # 切片策略实现
├── rag4j-document/ # 文档处理实现
├── rag4j-models-suppliers/ # 模型供应商实现
│ ├── rag4j-models-suppliers-openai/ # OpenAI
│ ├── rag4j-models-suppliers-openai-compatible/ # OpenAI 兼容接口
│ └── rag4j-models-suppliers-tongyi/ # 通义千问
├── rag4j-vector-store/ # 向量存储实现
│ ├── rag4j-vector-store-pgvector/ # PostgreSQL + pgvector
│ └── rag4j-vector-store-elasticsearch/ # Elasticsearch
└── rag4j-system/ # 系统功能实现
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 用户查询 │───▶│ Embedding │───▶│ 向量检索 │
└─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ LLM 回答 │◀───│ Prompt 组装 │◀───│ Rerank │
└─────────────┘ └─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 文件上传 │───▶│ 文档解析 │───▶│ 文本切片 │
└─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 入库完成 │◀───│ 向量存储 │◀───│ Embedding │
└─────────────┘ └─────────────┘ └─────────────┘
| 组件 | 技术选型 |
|---|---|
| 语言 | Java 21+ |
| 框架 | Spring Boot 3.5 |
| AI 框架 | Spring AI 1.0.3 |
| ORM | MyBatis-Plus 3.5 |
| 向量数据库 | PostgreSQL + pgvector / Elasticsearch |
| 文档解析 | Apache Tika 3.2 |
| 对象映射 | MapStruct 1.5 |
| LLM 供应商 | OpenAI / 通义千问 / Ollama |
| 文件存储 | MinIO |
DocumentChunk 接口BaseChunkConfig 定义配置ChunkRegistry
IVectorStore 接口ISearch 接口rag4j-project/rag4j-vector-store 下创建新模块rag4j-project/rag4j-models-suppliers 下创建新模块rag4j/
├── rag4j-app/
│ └── src/main/java/cn/rag4j/
│ ├── RagApplication.java # 启动类
│ ├── agent/ # Agent 模块
│ ├── chunk/ # 切片模块
│ ├── config/ # 配置
│ ├── directory/ # 目录模块
│ ├── document/ # 文档模块
│ ├── file/ # 文件模块
│ ├── knowledgebase/ # 知识库模块
│ └── model/ # 模型模块
├── rag4j-framework/
│ ├── rag4j-framework-chunk/ # 切片框架
│ ├── rag4j-framework-common/ # 通用模块
│ ├── rag4j-framework-dag/ # DAG 引擎
│ ├── rag4j-framework-document/ # 文档框架
│ ├── rag4j-framework-file/ # 文件框架
│ ├── rag4j-framework-knowledgebase/ # 知识库框架
│ ├── rag4j-framework-model-suppliers/ # 模型供应商框架
│ ├── rag4j-framework-recall/ # 召回框架
│ ├── rag4j-framework-system/ # 系统框架
│ └── rag4j-framework-vector-store/ # 向量存储框架
├── rag4j-project/
│ ├── rag4j-chunk/ # 切片实现
│ ├── rag4j-document/ # 文档实现
│ ├── rag4j-models-suppliers/ # 模型供应商实现
│ ├── rag4j-system/ # 系统实现
│ └── rag4j-vector-store/ # 向量存储实现
├── pom.xml # 父 POM
├── README.md # 项目说明
└── ARCHITECTURE.md # 架构说明(本文档)