Spring AI 应用开发
一、应用背景
- 项目场景
基于 "铁路智能运维管理系统",AI 应用聚焦于 "铁路设备维修" 功能模块及专业知识顾问场景,辅助管理人员与用户完成日常数据维护。
二、开发准备工作
(一)环境要求
-
基础依赖
- Spring Boot 版本:3.2.x 及以上
- JDK 版本:JDK 17 及以上
-
大模型配置(以 ZhiPu AI 为例)
xml
<!-- ZhiPu AI依赖 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId> </dependency> -
application.yml 配置
yaml
spring: application: name: railway-Ai ai: zhipuai: chat: enabled: true options: model: GLM-4-Air base-url: http://open.bigmodel.cn/api/paas api-key: your-api-key # 替换为实际API密钥 embedding: enabled: true model: embedding-2
三、核心功能实现
(一)普通聊天对话
-
关键组件注入
java
@Autowired private ZhiPuAiChatModel chatModel; @Autowired private ChatMemory chatMemory; // 聊天记忆管理 -
对话逻辑代码
java
public String chatByVectorStore(String message) { return ChatClient.builder(chatModel) .defaultSystem(PROFESSIONAL_SYSTEM_PROMPT) // 设置系统提示词 .build() .prompt() .advisors(new MessageChatMemoryAdvisor(chatMemory)) // 启用聊天记忆 .user(message) .call() .content(); } -
内存配置(ChatMemory Bean)
java
@Configuration public class ChatClientConfig { @Bean public ChatMemory chatMemory() { return new InMemoryChatMemory(); // 内存存储聊天历史 } }
(二)检索增强生成(RAG)
-
矢量数据库配置(Redis Stack)
yaml
spring: vectorstore: redis: index: my_vector_index # 索引名称 prefix: chatbot # 键前缀 initialize-schema: true # 自动初始化模式 data: redis: host: 127.0.0.1 # Redis地址 port: 6379 # 端口 -
PDF 解析与知识库构建
xml
<!-- PDF解析依赖 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-pdf-document-reader</artifactId> </dependency> -
服务层实现(PDF 分割与存储)
java
public void saveSourceByPage(String url) { Resource resource = resourceLoader.getResource(url); PdfDocumentReaderConfig config = PdfDocumentReaderConfig.builder() .withPagesPerDocument(1) // 按页分割 .build(); PagePdfDocumentReader reader = new PagePdfDocumentReader(resource, config); vectorStore.accept(tokenTextSplitter.apply(reader.get())); // 存入矢量数据库 } -
RAG 对话逻辑
java
public String chatByVectorStore(String message) { return ChatClient.builder(chatModel) .defaultSystem(PROFESSIONAL_SYSTEM_PROMPT) .build() .prompt() .advisors( new MessageChatMemoryAdvisor(chatMemory), new QuestionAnswerAdvisor(vectorStore) // 启用矢量数据库检索 ) .user(message) .call() .content(); }
(三)工具调用(Tool Calling)
-
工具配置类(ToolConfig)
java
@Service public class ToolConfig { // 获取当前时间工具 @Tool(name = "获取当前时间", description = "返回用户当前的日期时间") public String getCurrentDateTime() { return LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); } // 发送维修通知邮件工具 @Tool(name = "发送邮件", description = "根据设备信息生成维修通知邮件") public void sendMail( @ToolParam("设备信息列表") List<Map<String, String>> maintInfoList, @ToolParam("维修天数") Integer day, @ToolParam("接收工号列表") List<String> emailList ) { // 业务逻辑:转换参数并调用Feign客户端发送邮件 } } -
工具调用集成
java
public String invokeTool(String message) { return ChatClient.create(chatModel) .prompt() .advisors(new MessageChatMemoryAdvisor(chatMemory)) .user(message) .tools(toolConfig) // 注入工具配置 .call() .content(); }
四、功能测试与效果展示
(一)RAG 功能测试
- 测试数据:铁路设备维修规范 PDF 片段(示例内容如图 1 所示)
- 预期效果:AI 基于知识库返回设备验收标准、安装条件等相关解答。
(二)工具调用测试
-
信息检索场景
- 用户指令:"查询需要维修的设备"
- 返回结果:AI 调用
getExpire()工具,返回待维修设备列表(如馈线、隔离开关等)。
-
行动执行场景
- 用户指令:"发送邮件通知维修避雷器,5 天后,工号 123457"
- 执行结果:AI 调用
sendMail()工具,生成维修通知邮件并发送(如图 2 所示)。
五、总结与限制
-
当前进展
实现了 Spring AI 与铁路运维系统的核心功能集成,包括对话交互、RAG 知识库检索及工具调用。 -
已知问题
- 知识库规模过大时,工具调用响应延迟增加;
- 当知识库包含与工具描述冲突的信息时,可能导致 AI 决策错误。
-
未来优化方向
- 引入分层检索机制提升 RAG 效率;
- 增加工具调用权限控制与参数校验逻辑。
1329

被折叠的 条评论
为什么被折叠?



