基于Spring AI Alibaba的多场景聊天AI应用:从零到一的完整实战指南_spring ai alibaba 实战
前言
随着大模型技术的快速发展,AI应用开发已成为当下最热门的技术领域之一。阿里云作为国内领先的云服务提供商,推出了Spring AI Alibaba框架,为开发者提供了便捷的AI应用开发体验。本文将通过一个完整的实战项目,深入探讨如何使用Spring AI Alibaba构建多场景的智能聊天应用。
项目概览
本项目是一个基于Spring AI Alibaba的综合性聊天AI演示平台,集成了四种不同的AI应用场景:
- 多模态智能聊天 - 支持文本和图片输入的通用对话
- 哄哄模拟器 - 创新的情感互动游戏应用
- 智能客服系统 - 基于工具调用的业务场景实现
- ChatPDF知识库 - RAG检索增强生成的文档问答
本还项目集成了三大数据库:关系,图,向量。
技术架构概览
#mermaid-svg-9IQWznXi0Dds7gSD {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9IQWznXi0Dds7gSD .error-icon{fill:#552222;}#mermaid-svg-9IQWznXi0Dds7gSD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9IQWznXi0Dds7gSD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-9IQWznXi0Dds7gSD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9IQWznXi0Dds7gSD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9IQWznXi0Dds7gSD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9IQWznXi0Dds7gSD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9IQWznXi0Dds7gSD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9IQWznXi0Dds7gSD .marker.cross{stroke:#333333;}#mermaid-svg-9IQWznXi0Dds7gSD svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9IQWznXi0Dds7gSD .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9IQWznXi0Dds7gSD .cluster-label text{fill:#333;}#mermaid-svg-9IQWznXi0Dds7gSD .cluster-label span{color:#333;}#mermaid-svg-9IQWznXi0Dds7gSD .label text,#mermaid-svg-9IQWznXi0Dds7gSD span{fill:#333;color:#333;}#mermaid-svg-9IQWznXi0Dds7gSD .node rect,#mermaid-svg-9IQWznXi0Dds7gSD .node circle,#mermaid-svg-9IQWznXi0Dds7gSD .node ellipse,#mermaid-svg-9IQWznXi0Dds7gSD .node polygon,#mermaid-svg-9IQWznXi0Dds7gSD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9IQWznXi0Dds7gSD .node .label{text-align:center;}#mermaid-svg-9IQWznXi0Dds7gSD .node.clickable{cursor:pointer;}#mermaid-svg-9IQWznXi0Dds7gSD .arrowheadPath{fill:#333333;}#mermaid-svg-9IQWznXi0Dds7gSD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9IQWznXi0Dds7gSD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9IQWznXi0Dds7gSD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-9IQWznXi0Dds7gSD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-9IQWznXi0Dds7gSD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9IQWznXi0Dds7gSD .cluster text{fill:#333;}#mermaid-svg-9IQWznXi0Dds7gSD .cluster span{color:#333;}#mermaid-svg-9IQWznXi0Dds7gSD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9IQWznXi0Dds7gSD :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 数据存储层 AI服务层 后端层 前端层 MySQL - 业务数据 Milvus - 向量存储 Neo4j - 图数据库 阿里云DashScope 通义千问模型 文本嵌入模型 Spring Boot 3.5.3 Spring AI Alibaba 1.0.0.2 ChatClient多实例配置 Vue.js 3 + TypeScript WebViewer PDF预览 响应式UI设计
技术栈深度解析
1. 核心框架选择
Spring AI Alibaba vs 原生Spring AI
项目采用了Spring AI Alibaba而非原生Spring AI,主要优势包括:
- 本土化优势:更好的中文支持和本地化服务
- 性能优化:针对阿里云基础设施的深度优化
- 成本控制:相比国外模型服务更具价格优势
- 合规性:符合国内数据安全和隐私保护要求
迁移对比示例:
// 原生Spring AI配置@Beanpublic ChatClient openAiChatClient(OpenAiChatModel model) { return ChatClient.builder(model) .defaultOptions(OpenAiChatOptions.builder() .withModel(\"gpt-4\") .build()) .build();}// Spring AI Alibaba配置@Beanpublic ChatClient dashScopeChatClient(DashScopeChatModel model) { return ChatClient.builder(model) .defaultOptions(DashScopeChatOptions.builder() .withModel(\"qwen-omni-turbo-latest\") .withMultiModel(true) // 多模态支持 .build()) .build();}
2. 多ChatClient架构设计
项目的核心创新在于针对不同应用场景配置了专门的ChatClient实例:
@Configurationpublic class CommonConfiguration { // 基础聊天客户端 - 轻松友好的对话风格 @Bean public ChatClient chatClient(DashScopeChatModel model, ChatMemory chatMemory) { return ChatClient.builder(model) .defaultOptions(DashScopeChatOptions.builder() .withModel(\"qwen-omni-turbo-latest\") .withMultiModel(true) .build()) .defaultSystem(\"你是一个可爱的傻白甜萝莉,你会用可爱的语言和我聊天。\") .defaultAdvisors( new SimpleLoggerAdvisor(), MessageChatMemoryAdvisor.builder(chatMemory).build() ) .build(); } // 游戏聊天客户端 - 角色扮演专用 @Bean public ChatClient gameChatClient(DashScopeChatModel model, ChatMemory chatMemory) { return ChatClient.builder(model) .defaultSystem(SystemConstants.GAME_SYSTEM_PROMPT) .defaultAdvisors( new SimpleLoggerAdvisor(), MessageChatMemoryAdvisor.builder(chatMemory).build() ) .build(); } // 客服聊天客户端 - 集成工具调用 @Bean public ChatClient serviceChatClient(DashScopeChatModel model, ChatMemory chatMemory, CourseTools courseTools) { return ChatClient.builder(model) .defaultSystem(SystemConstants.SERVICE_SYSTEM_PROMPT) .defaultTools(courseTools) // 关键:工具调用 .defaultAdvisors( new SimpleLoggerAdvisor(), MessageChatMemoryAdvisor.builder(chatMemory).build() ) .build(); } // PDF聊天客户端 - RAG检索增强 @Bean public ChatClient pdfChatClient(DashScopeChatModel model, ChatMemory chatMemory, VectorStore vectorStore) { return ChatClient.builder(model) .defaultSystem(\"你是一个友好且知识渊博的AI助手。基于提供的上下文信息来回答问题,如果上下文中没有相关信息,请明确告知用户。\") .defaultAdvisors( new SimpleLoggerAdvisor(), MessageChatMemoryAdvisor.builder(chatMemory).build(), QuestionAnswerAdvisor.builder(vectorStore) .searchRequest(SearchRequest.builder() .topK(10) .similarityThreshold(0.2) .build()) .build() ) .build(); }}
四大应用场景深度实现
1. 多模态智能聊天
核心特性
- 支持文本+图片的多模态输入
- 流式响应处理
- 聊天历史管理
- 暗黑/明亮主题切换
技术实现要点
后端多模态处理:
private Flux<String> multiModalChat(String prompt, String chatId, List<MultipartFile> files) { List<Media> medias = files.stream() .map(file -> new Media( MimeType.valueOf(Objects.requireNonNull(file.getContentType())), file.getResource() )).toList(); return chatClient.prompt() .user(p -> p.text(prompt).media(medias.toArray(Media[]::new))) .advisors(a -> a.param(CONVERSATION_ID, chatId)) .stream() .content();}
前端流式响应处理:
const sendMessage = async () => { const reader = await chatAPI.sendMessage(formData, currentChatId.value) const decoder = new TextDecoder(\'utf-8\') let accumulatedContent = \'\' while (true) { const { value, done } = await reader.read() if (done) break accumulatedContent += decoder.decode(value) // 实时更新消息内容 await nextTick(() => { const updatedMessage = { ...assistantMessage, content: accumulatedContent } const lastIndex = currentMessages.value.length - 1 currentMessages.value.splice(lastIndex, 1, updatedMessage) }) await scrollToBottom() }}
2. 哄哄模拟器:创新的游戏化AI应用
这是项目中最具创意的功能,通过AI角色扮演实现情感互动游戏。
游戏机制设计
- 角色设定:AI扮演生气的女友
- 数值系统:原谅值(0-100)动态变化
- 游戏目标:通过合适的回复让原谅值达到100
- 失败条件:原谅值降到0或超过最大轮次
系统提示词工程
public static final String GAME_SYSTEM_PROMPT = \"\"\" 你需要根据以下任务中的描述进行角色扮演,你只能以女友身份回答,不是用户身份或AI身份,如记错身份,你将受到惩罚。 ## Goal 你扮演用户女友的角色。现在你很生气,用户需要尽可能的说正确的话来哄你开心。 ## Rules - 初始原谅值为 20,每次交互会增加或者减少原谅值,直到原谅值达到 100,游戏通关 - 每次用户回复的话分为 5 个等级来增加或减少原谅值: -10 为非常生气,-5 为生气,0 为正常,+5 为开心,+10 为非常开心 ## Output format {女友心情}{女友说的话} 得分:{+-原谅值增减} 原谅值:{当前原谅值}/100 \"\"\";
前端游戏状态管理
// 实时解析原谅值变化const forgivenessMatch = accumulatedContent.match(/原谅值[::]\\s*(\\d+)/i)if (forgivenessMatch) { const newForgiveness = parseInt(forgivenessMatch[1]) if (!isNaN(newForgiveness)) { forgiveness.value = Math.min(100, Math.max(0, newForgiveness)) // 游戏胜利判断 if (forgiveness.value >= 100) { isGameOver.value = true gameResult.value = \'恭喜你!成功哄好了女友!💕\' } }}
3. 智能客服系统:工具调用的完美实践
工具调用架构
Spring AI的工具调用功能允许AI模型调用预定义的Java方法,实现复杂的业务逻辑。
@Component@RequiredArgsConstructorpublic class CourseTools { private final ICourseService courseService; private final ISchoolService schoolService; private final ICourseReservationService reservationService; @Tool(description = \"根据条件查询课程\") public List<Course> queryCourse(@ToolParam(description = \"查询的条件\", required = false) CourseQuery query) { if (query == null) { return courseService.list(); } QueryChainWrapper<Course> wrapper = courseService.query() .eq(query.getType() != null, \"type\", query.getType()) .le(query.getEdu() != null, \"edu\", query.getEdu()); return wrapper.list(); } @Tool(description = \"查询所有校区\") public List<School> querySchool() { return schoolService.list(); } @Tool(description = \"生成预约单,返回预约单号\") public Integer createCourseReservation( @ToolParam(description = \"预约课程\") String course, @ToolParam(description = \"预约校区\") String school, @ToolParam(description = \"学生姓名\") String studentName, @ToolParam(description = \"联系电话\") String contactInfo, @ToolParam(description = \"备注\", required = false) String remark) { CourseReservation reservation = new CourseReservation(); reservation.setCourse(course); reservation.setSchool(school); reservation.setStudentName(studentName); reservation.setContactInfo(contactInfo); reservation.setRemark(remark); reservationService.save(reservation); return reservation.getId(); }}
业务流程设计
客服系统采用严格的业务流程控制:
- 信息收集阶段:获取用户学习兴趣和学历背景
- 课程推荐阶段:基于条件查询匹配课程
- 校区选择阶段:展示可用校区供用户选择
- 预约确认阶段:收集完整信息并生成预约单
4. ChatPDF:RAG检索增强生成的实战应用
RAG技术架构
#mermaid-svg-OhpWiJkChi1qAmeb {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OhpWiJkChi1qAmeb .error-icon{fill:#552222;}#mermaid-svg-OhpWiJkChi1qAmeb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OhpWiJkChi1qAmeb .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-OhpWiJkChi1qAmeb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OhpWiJkChi1qAmeb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OhpWiJkChi1qAmeb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OhpWiJkChi1qAmeb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OhpWiJkChi1qAmeb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OhpWiJkChi1qAmeb .marker.cross{stroke:#333333;}#mermaid-svg-OhpWiJkChi1qAmeb svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OhpWiJkChi1qAmeb .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OhpWiJkChi1qAmeb .cluster-label text{fill:#333;}#mermaid-svg-OhpWiJkChi1qAmeb .cluster-label span{color:#333;}#mermaid-svg-OhpWiJkChi1qAmeb .label text,#mermaid-svg-OhpWiJkChi1qAmeb span{fill:#333;color:#333;}#mermaid-svg-OhpWiJkChi1qAmeb .node rect,#mermaid-svg-OhpWiJkChi1qAmeb .node circle,#mermaid-svg-OhpWiJkChi1qAmeb .node ellipse,#mermaid-svg-OhpWiJkChi1qAmeb .node polygon,#mermaid-svg-OhpWiJkChi1qAmeb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OhpWiJkChi1qAmeb .node .label{text-align:center;}#mermaid-svg-OhpWiJkChi1qAmeb .node.clickable{cursor:pointer;}#mermaid-svg-OhpWiJkChi1qAmeb .arrowheadPath{fill:#333333;}#mermaid-svg-OhpWiJkChi1qAmeb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OhpWiJkChi1qAmeb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OhpWiJkChi1qAmeb .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-OhpWiJkChi1qAmeb .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-OhpWiJkChi1qAmeb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OhpWiJkChi1qAmeb .cluster text{fill:#333;}#mermaid-svg-OhpWiJkChi1qAmeb .cluster span{color:#333;}#mermaid-svg-OhpWiJkChi1qAmeb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OhpWiJkChi1qAmeb :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} PDF文档 文档分割 向量化 Milvus存储 用户问题 向量检索 相关文档 上下文注入 LLM生成答案
核心实现代码
文档处理与向量化:
private void writeToVectorStore(Resource resource) { // 1.创建PDF读取器 PagePdfDocumentReader reader = new PagePdfDocumentReader( resource, PdfDocumentReaderConfig.builder() .withPageExtractedTextFormatter(ExtractedTextFormatter.defaults()) .withPagesPerDocument(1) // 每页作为一个Document .build() ); // 2.读取并拆分文档 List<Document> documents = reader.read(); // 3.添加元数据标识 String fileName = resource.getFilename(); documents.forEach(document -> { document.getMetadata().put(\"file_name\", fileName); }); // 4.存储到向量数据库 vectorStore.add(documents);}
检索增强查询:
@RequestMapping(value = \"/chat\", produces = \"text/html;charset=utf-8\")public Flux<String> chat(String prompt, String chatId) { Resource file = fileRepository.getFile(chatId); if (!file.exists()) { throw new RuntimeException(\"会话文件不存在!\"); } // 构造文档过滤条件 String filterExpression = \"file_name == \'\" + file.getFilename() + \"\'\"; return pdfChatClient.prompt() .user(prompt) .advisors(a -> a.param(CONVERSATION_ID, chatId)) .advisors(a -> a.param(FILTER_EXPRESSION, filterExpression)) .stream() .content();}
Milvus向量数据库配置
spring: ai: vectorstore: milvus: client: host: \"你的地址\" port: 19530 database-name: \"chatAiDemo\" collection-name: \"chatPDF\" embedding-dimension: 1024 index-type: IVF_FLAT metric-type: COSINE initialize-schema: true
前端技术亮点
1. 现代化UI设计
- Vue 3 Composition API + TypeScript
- 响应式设计适配多种屏幕
- 暗黑/明亮主题无缝切换
- 流畅的动画和交互效果
2. WebViewer PDF集成
项目集成了PDFTron WebViewer,提供专业级的PDF预览功能:
3. 流式响应优化
前端采用ReadableStream处理流式响应,确保用户体验的流畅性:
// 统一的流式响应处理while (true) { const { value, done } = await reader.read() if (done) break accumulatedContent += decoder.decode(value) // 实时更新UI await nextTick(() => { currentMessages.value[lastIndex] = { ...assistantMessage, content: accumulatedContent } }) await scrollToBottom()}
性能优化与最佳实践
1. 聊天记忆管理
@Beanpublic ChatMemory chatMemory(ChatMemoryRepository chatMemoryRepository) { return MessageWindowChatMemory.builder() .chatMemoryRepository(chatMemoryRepository) .maxMessages(10) // 限制记忆窗口大小 .build();}
2. 向量检索优化
QuestionAnswerAdvisor.builder(vectorStore) .searchRequest(SearchRequest.builder() .topK(10) // 限制检索数量 .similarityThreshold(0.2) // 设置相似度阈值 .build()) .build()
3. 前端资源管理
- 组件懒加载减少初始包大小
- PDF文件的IndexedDB本地缓存
- 图片压缩和格式优化
部署与运维
1. 环境变量配置
# 阿里云DashScope API密钥export DASHSCOPE_API_KEY=your_dashscope_api_key# MySQL数据库密码export MYSQL_PASSWORD=your_mysql_password# Neo4j数据库密码export NEO4J_PASSWORD=your_neo4j_password
2. Docker容器化部署
FROM openjdk:17-jre-slimCOPY target/chatAiDemo-*.jar app.jarEXPOSE 8080ENTRYPOINT [\"java\", \"-jar\", \"/app.jar\"]
3. 监控与日志
logging: level: org.springframework.ai: DEBUG com.touhouqing.chatAiDemo: DEBUG
项目亮点与创新
1. 技术创新
- 多ChatClient架构:针对不同场景的专门优化
- 游戏化AI应用:创新的情感互动设计
- 完整的RAG实现:从文档处理到检索生成的全链路
- 工具调用深度集成:业务逻辑与AI能力的完美结合
2. 工程实践
- 清晰的代码架构:分层明确,职责单一
- 完善的错误处理:异常情况的优雅处理
- 优秀的用户体验:流式响应、实时交互
- 可扩展的设计:便于新增功能和场景
3. 业务价值
- 多场景覆盖:从娱乐到商务的全方位应用
- 技术栈统一:降低开发和维护成本
- 快速迭代:基于Spring AI的快速开发能力
- 产品化就绪:完整的功能和良好的交互设计
总结与展望
本项目作为Spring AI Alibaba的综合实战案例,展示了现代AI应用开发的最佳实践。通过四个不同场景的实现,我们可以看到:
- Spring AI框架的强大能力:简化了AI应用的开发复杂度
- 阿里云生态的完整性:从模型服务到基础设施的全栈支持
- AI应用的多样化可能:从工具性应用到娱乐性创新的广阔空间
未来发展方向
- 多模态能力扩展:支持音频、视频等更多媒体类型
- 智能体工作流:实现更复杂的AI代理任务
- 微服务架构改造:支持更大规模的并发访问
- AI能力平台化:构建可复用的AI能力中台
通过本项目的学习和实践,开发者可以快速掌握Spring AI Alibaba的核心概念和实战技能,为构建下一代AI应用打下坚实基础。
如果对你有帮助,请花一分钟点个star,谢谢了
项目地址:GitHub仓库链接
本文基于Spring AI Alibaba 1.0.0.2版本编写,部分API可能随版本更新有所变化,请以最新官方文档为准。