1. 项目概述
最近在做一个结合SpringAI Alibaba、RAG和Milvus的AI项目,目标是构建一个能理解企业私有知识库的智能助手。这个项目解决了大模型在实际应用中的几个关键痛点:知识更新滞后、无法理解私有数据、以及上下文记忆问题。
作为一个长期奋战在一线的开发者,我发现单纯依赖大模型API远远不够。企业需要的是能真正理解业务数据的AI,而不是一个只会泛泛而谈的聊天机器人。通过这个项目,我摸索出了一套可行的解决方案,现在把完整实现过程分享给大家。
2. 技术选型与架构设计
2.1 核心组件选型
SpringAI Alibaba:作为整个项目的控制中枢,它完美对接了阿里云的百炼平台,同时支持本地部署的模型。相比原生SpringAI,它对国内开发者更友好,省去了很多兼容性处理的麻烦。
Qwen系列模型:选择通义千问作为基础模型,主要考虑几点:
- 中文理解能力强
- 对长文本处理优秀
- 有适合不同场景的版本(云端qwen-plus和本地qwen3:1.7b)
Milvus向量数据库:在对比了多个向量数据库后选择了Milvus,因为:
- 专为向量搜索优化
- 支持分布式部署
- 社区活跃度高
- 与Spring生态集成方便
Redis:用于实现对话上下文记忆,选择它是因为:
- 高性能读写
- 丰富的数据结构
- 成熟的Java客户端支持
2.2 整体架构设计
项目采用分层架构:
- 接入层:SpringBoot提供的REST API
- AI服务层:SpringAI Alibaba封装的模型调用
- 记忆层:Redis存储对话上下文
- 知识库层:Milvus存储企业文档的向量化表示
- 数据源层:MySQL存储结构化业务数据
mermaid复制graph TD
A[客户端] --> B[SpringBoot API]
B --> C[AI服务层]
C --> D[Redis记忆]
C --> E[Milvus向量库]
C --> F[MySQL业务库]
3. 环境准备与基础配置
3.1 开发环境要求
- JDK 21(SpringBoot 3.x要求)
- Maven 3.6+
- Docker(用于运行Milvus和Redis)
- Ollama(本地模型运行)
3.2 关键依赖配置
在pom.xml中添加以下核心依赖:
xml复制<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.3 配置文件详解
application.yml的关键配置:
yaml复制spring:
ai:
dashscope:
api-key: your-api-key
chat:
model: qwen-plus
options:
temperature: 0.7
ollama:
base-url: http://localhost:11434
chat:
model: qwen3:1.7b
memory:
redis:
host: localhost
port: 6379
提示:temperature参数控制生成文本的随机性,0.7是一个平衡值,既不会太死板也不会太天马行空。
4. 核心功能实现
4.1 双模型战略配置
在实际项目中,我们通常需要同时使用云端和本地模型:
java复制@Configuration
public class ChatConfig {
@Bean
public ChatClient dashscopeChatClient(
@Qualifier("dashscopeChatModel") ChatModel dashscopeChatModel) {
return ChatClient.builder(dashscopeChatModel)
.defaultOptions(DashScopeChatOptions.builder()
.withModel("qwen-plus")
.withTemperature(0.7)
.build())
.build();
}
@Bean
public ChatClient ollamaChatClient(
@Qualifier("ollamaChatModel") ChatModel ollamaChatModel) {
return ChatClient.builder(ollamaChatModel)
.defaultSystem("你是一个博学的本地大模型")
.build();
}
}
使用时的路由策略:
- 对实时性要求高的查询走云端模型
- 对数据隐私要求高的操作走本地模型
- 简单对话可以双模型同时运行取优
4.2 对话记忆实现
大模型本身是无状态的,要实现多轮对话必须引入记忆机制。我们采用Redis存储对话历史:
java复制@Bean
public ChatClient dashscopeChatClient(
@Qualifier("dashscopeChatModel") ChatModel dashscopeChatModel,
RedisChatMemoryRepository redisChatMemoryRepository) {
return ChatClient.builder(dashscopeChatModel)
.defaultAdvisors(
MessageChatMemoryAdvisor.builder(
MessageWindowChatMemory.builder()
.chatMemoryRepository(redisChatMemoryRepository)
.maxMessages(50)
.build())
.build())
.build();
}
记忆管理的关键点:
- 每个会话分配唯一ID
- 控制记忆长度(避免token超限)
- 定期清理过期会话
- 支持记忆导出/导入
4.3 RAG集成实现
RAG(检索增强生成)是本项目的核心价值所在,实现步骤:
- 文档处理:将PDF/Word等文档转换为纯文本
- 分块:按语义切分成适当大小的段落
- 向量化:使用Qwen-embedding模型生成向量
- 存储:将向量和原文存入Milvus
- 检索:用户提问时先检索相关段落
- 生成:将检索结果作为上下文送入大模型
关键代码片段:
java复制// 文档向量化
List<Float> embedding = embeddingClient.embed(documentText);
// Milvus存储
InsertParam insertParam = InsertParam.newBuilder()
.withCollectionName("knowledge_base")
.addField("text", documentText)
.addField("embedding", embedding)
.build();
milvusClient.insert(insertParam);
// 检索阶段
SearchParam searchParam = SearchParam.newBuilder()
.withCollectionName("knowledge_base")
.withVector(questionEmbedding)
.withTopK(3)
.build();
List<SearchResult> results = milvusClient.search(searchParam);
5. 避坑指南与性能优化
5.1 常见问题排查
问题1:Ollama本地模型响应慢
- 检查模型是否加载到GPU
- 尝试减小模型尺寸(如用1.7b而不是7b版本)
- 调整batch size参数
问题2:Milvus检索结果不准确
- 检查embedding模型是否匹配
- 调整向量维度设置
- 优化分块策略(300-500字为佳)
问题3:对话记忆混乱
- 检查会话ID是否唯一
- 验证Redis存储是否正常
- 调整maxMessages参数
5.2 性能优化建议
-
缓存机制:
- 对常见问题缓存回答
- 向量检索结果缓存
- 使用Redis二级缓存
-
异步处理:
- 文档预处理异步化
- 非实时请求队列处理
-
混合检索:
- 结合关键词和向量搜索
- 使用BM25+余弦相似度混合评分
-
资源管理:
- 模型按需加载
- 连接池优化
- 限流保护
6. 项目扩展方向
基于当前架构,还可以进一步扩展:
-
多模态支持:
- 接入图像识别模型
- 实现图文混合问答
-
智能体生态:
- 开发专用工具集
- 实现自动化工作流
-
领域微调:
- 使用业务数据微调模型
- 构建垂直领域知识图谱
-
边缘计算:
- 关键模型本地化部署
- 离线环境支持
这个项目最让我惊喜的是SpringAI Alibaba的表现,它极大简化了AI集成的复杂度,让开发者可以更专注于业务逻辑。特别是在处理多模型切换和记忆管理时,提供的抽象层非常实用。
