派聪明(PaiSmart)是一个企业级的 AI 知识库管理系统,采用检索增强生成(RAG)技术,提供智能文档处理和检索能力。
核心技术栈包括 ElasticSearch、Kafka、WebSocket、Spring Security、Docker、MySQL 和 Redis。
它的目标是帮助企业和个人更高效地管理和利用知识库中的信息,支持多租户架构,允许用户通过自然语言查询知识库,并获得基于自身文档的 AI 生成响应。
系统允许用户:
- 上传和管理各种类型的文档
- 自动处理和索引文档内容
- 使用自然语言查询知识库
- 接收基于自身文档的 AI 生成响应
用到的技术栈包括,先说后端的:
- 框架 : Spring Boot 3.4.2 (Java 17)
- 数据库 : MySQL 8.0
- ORM : Spring Data JPA
- 缓存 : Redis
- 搜索引擎 : Elasticsearch 8.10.0
- 消息队列 : Apache Kafka
- 文件存储 : MinIO
- 文档解析 : Apache Tika
- 安全认证 : Spring Security + JWT
- AI集成 : DeepSeek API/本地 Ollama+豆包 Embedding
- 实时通信 : WebSocket
- 依赖管理 : Maven
- 响应式编程 : WebFlux
后端的整体项目结构:
src/main/java/com/yizhaoqi/smartpai/
├── SmartPaiApplication.java # 主应用程序入口
├── client/ # 外部API客户端
├── config/ # 配置类
├── consumer/ # Kafka消费者
├── controller/ # REST API端点
├── entity/ # 数据实体
├── exception/ # 自定义异常
├── handler/ # WebSocket处理器
├── model/ # 领域模型
├── repository/ # 数据访问层
├── service/ # 业务逻辑
└── utils/ # 工具类再说前端的,包括:
- 框架 : Vue 3 + TypeScript
- 构建工具 : Vite
- UI组件 : Naive UI
- 状态管理 : Pinia
- 路由 : Vue Router
- 样式 : UnoCSS + SCSS
- 图标 : Iconify
- 包管理 : pnpm
前端的整体项目结构:
frontend/
├── packages/ # 可重用模块
├── public/ # 静态资源
├── src/ # 主应用程序代码
│ ├── assets/ # SVG图标,图片
│ ├── components/ # Vue组件
│ ├── layouts/ # 页面布局
│ ├── router/ # 路由配置
│ ├── service/ # API集成
│ ├── store/ # 状态管理
│ ├── views/ # 页面组件
│ └── ... # 其他工具和配置
└── ... # 构建配置文件派聪明提供了完整的文档上传与解析功能,支持文件分片上传和断点续传,并支持标签进行组织管理。文档可以是公开的,也可以是私有的,并且可以与特定的组织标签关联,以便更好地进行权限分类。
派聪明的核心是 RAG 实现:
- 将上传的文档进行语义分块
- 调用豆包 Embedding 模型为每个文本块生成高维向量
- 将向量存储到 ElasticSearch 以支持语义搜索和关键词搜索
- 可以根据用户的查询检索相关文档
- 为 LLM 提供完整的上下文,从而生成更准确、基于文档的响应内容
派聪明通过组织标签支持多租户架构。每个用户可以创建或加入一个或多个组织,每个组织可以拥有独立的知识库和文档管理。这样,企业可以在同一系统中管理多个团队或部门的知识库,而无需担心数据混淆或权限问题。
系统采用 WebSocket 技术,提供用户与 AI 系统之间的实时交互,支持响应式聊天界面,便于知识检索和 AI 互动。
在开始之前,请确保已安装以下软件:
- Java 17
- Maven 3.8.6 或更高版本
- Node.js 18.20.0 或更高版本
- pnpm 8.7.0 或更高版本
- MySQL 8.0
- Elasticsearch 8.10.0
- MinIO 8.5.12
- Kafka 3.2.1
- Redis 7.0.11
- Docker(可选,用于运行 Redis、MinIO、Elasticsearch 和 Kafka 等服务)
派聪明的架构具备一个现代化的、云原生应用程序的特点,具有清晰的关注点分离、可扩展的组件和与 AI 技术的集成。模块化设计允许随着技术的发展,特别是快速变化的 AI 集成领域,未来可以扩展和替换单个组件。
控制层用于处理 HTTP 请求,验证输入,管理请求/响应格式化,并将业务逻辑委托给服务层。控制器按领域功能组织。遵循 RESTful 设计原则,集成了性能监控和日志记录,用于跟踪 API 使用和故障排除。
@RestController
@RequestMapping("/api/v1/documents")
public class DocumentController {
@Autowired
private DocumentService documentService;
@DeleteMapping("/{fileMd5}")
public ResponseEntity<?> deleteDocument(
@PathVariable String fileMd5,
@RequestAttribute("userId") String userId,
@RequestAttribute("role") String role) {
// 参数验证和委托给服务
documentService.deleteDocument(fileMd5);
// 响应处理
}
}服务层主要用来处理应用的业务逻辑,具有事务感知能力,能够处理跨越多个数据源的操作。
@Service
public class DocumentService {
@Autowired
private FileUploadRepository fileUploadRepository;
@Autowired
private MinioClient minioClient;
@Autowired
private ElasticsearchService elasticsearchService;
@Transactional
public void deleteDocument(String fileMd5) {
// 文档删除的业务逻辑
// 协调多个仓储和系统
}
}数据访问层使用 Spring Data JPA 进行数据库操作,提供了对 MySQL 的 CRUD 操作。
@Repository
public interface FileUploadRepository extends JpaRepository<FileUpload, Long> {
Optional<FileUpload> findByFileMd5(String fileMd5);
@Query("SELECT f FROM FileUpload f WHERE f.userId = :userId OR f.isPublic = true OR (f.orgTag IN :orgTagList AND f.isPublic = false)")
List<FileUpload> findAccessibleFilesWithTags(@Param("userId") String userId, @Param("orgTagList") List<String> orgTagList);
}实体层由映射到数据库表的 JPA 实体以及用于 API 请求和响应的 DTO(数据传输对象)组成。
@Entity
public class FileUpload {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fileMd5;
private String fileName;
private String userId;
private boolean isPublic;
private String orgTag;
// 其他字段和方法
}




