1. 项目概述
最近在开发企业级知识库系统时,我发现很多团队在构建RAG(检索增强生成)应用时,最头疼的就是文档预处理环节。特别是当面对大量非结构化文本数据时,如何高效地进行文本切割和向量化存储成为关键挑战。本文将分享一个基于Spring AI的完整解决方案,从文件上传到智能检索的全流程实现。
这个项目主要解决了三个核心问题:
- 如何设计灵活的文件上传接口,支持不同编码格式的文本文件
- 如何实现智能文本切割,在保持语义完整性的同时满足Embedding模型的输入限制
- 如何构建高效的向量存储和检索系统,为后续的RAG应用提供基础支撑
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 技术栈组成
在技术选型上,我们采用了以下核心组件:
- Spring Boot 3.5.10:作为基础框架,提供完善的Web开发支持和依赖管理
- Spring AI 1.1.0-SNAPSHOT:简化AI模型集成,提供统一的向量存储抽象
- Elasticsearch 8.x:作为向量数据库,支持高效的相似性搜索
- OpenAI Embedding API:使用text-embedding-ada-002模型生成文本向量
2.2 系统架构设计
整个系统采用分层架构设计:
code复制┌───────────────────────────────────────┐
│ 客户端应用 │
└──────────────────────┬────────────────┘
│
┌──────────────────────▼────────────────┐
│ REST API 层 │
│ ┌───────────────────────────────┐ │
│ │ VectorStoreController │ │
│ └───────────────────────────────┘ │
└──────────────────────┬────────────────┘
│
┌──────────────────────▼────────────────┐
│ 业务服务层 │
│ ┌─────────────┐ ┌───────────────┐ │
│ │文件处理服务 │ │文档切割服务 │ │
│ └─────────────┘ └───────────────┘ │
│ ┌───────────────────────────────┐ │
│ │ 向量存储服务 │ │
│ └───────────────────────────────┘ │
└──────────────────────┬────────────────┘
│
┌──────────────────────▼────────────────┐
│ 数据存储层 │
│ ┌───────────────────────────────┐ │
│ │ Elasticsearch │ │
│ └───────────────────────────────┘ │
└───────────────────────────────────────┘
这种设计确保了各层职责清晰,便于后续扩展和维护。例如,如果需要支持新的文件格式,只需修改文件处理服务层;要更换向量数据库,只需调整向量存储服务的实现。
3. 核心实现细节
3.1 文档切割服务实现
文档切割是RAG系统的关键环节,我们实现了三种切割策略:
3.1.1 字符切割策略
这是最基本的切割方式,按照固定字符数进行分割。核心逻辑如下:
java复制public List<Document> splitByCharacter(String text, String filename,
int chunkSize, int chunkOverlap) {
List<Document> documents = new ArrayList<>();
String cleanedText = text.replace("\r\n", "\n").replace("\r", "\n");
int textLength = cl
