Skip to content

TheOverSizee/PaiSmart

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

派聪明(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/          # 页面组件
│   └── ...            # 其他工具和配置
└── ...               # 构建配置文件

核心功能

派聪明的架构概览

知识库管理

派聪明提供了完整的文档上传与解析功能,支持文件分片上传和断点续传,并支持标签进行组织管理。文档可以是公开的,也可以是私有的,并且可以与特定的组织标签关联,以便更好地进行权限分类。

派聪明文档处理

AI驱动的RAG实现

派聪明的核心是 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;
    // 其他字段和方法
}

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •