013-Spring AI Alibaba Studio 功能完整案例

013-Spring AI Alibaba Studio 功能完整案例

本案例将引导您一步步构建一个 Spring Boot 应用,演示如何利用 Spring AI Alibaba 的 Studio 功能,实现多种 AI 对话交互模式,包括简单对话、流式对话和基于 Advisor 的功能增强。

1. 案例目标

我们将创建一个包含三个核心功能的 Web 应用:

  1. 简单对话 (/studio/simple/chat):通过 ChatClient 实现基本的 AI 对话功能,用户可以输入问题并获得 AI 的回答。
  2. 流式对话 (/studio/stream/chat):实现流式响应,让 AI 的回答逐字显示,提升用户体验。
  3. Advisor 增强对话 (/studio/advisor/chat/{id}):通过 Advisor 模式实现功能增强,如上下文记忆、日志记录等。

2. 技术栈与核心依赖

  • Spring Boot 3.x
  • Spring AI Alibaba (用于对接阿里云 DashScope 通义大模型)
  • Spring AI Alibaba Studio (提供 Studio 功能支持)
  • Maven (项目构建工具)

在 pom.xml 中,你需要引入以下核心依赖:

<dependencies> <!-- Spring Web 用于构建 RESTful API --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring AI Alibaba 核心启动器,集成 DashScope --> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter-dashscope</artifactId> </dependency> <!-- Spring AI Alibaba Studio 功能支持 --> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-studio</artifactId> </dependency> </dependencies>

3. 项目配置

在 src/main/resources/application.yml 文件中,配置你的 DashScope API Key。

server: port: 18080 spring: application: name: spring-ai-alibaba-studio-example ai: dashscope: api-key: ${AI_DASHSCOPE_API_KEY}

重要提示:请将 AI_DASHSCOPE_API_KEY 环境变量设置为你从阿里云获取的有效 API Key。你也可以直接将其写在配置文件中,但这不推荐用于生产环境。

4. 编写 Java 代码

4.1 StudioExampleApplication.java

Spring Boot 主程序类。

package com.alibaba.cloud.ai.example.studio; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class StudioExampleApplication { public static void main(String[] args) { SpringApplication.run(StudioExampleApplication.class, args); } }

4.2 StudioController.java

实现多种 AI 对话交互模式的控制器。

package com.alibaba.cloud.ai.example.studio.controller; import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions; import jakarta.servlet.http.HttpServletResponse; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/studio") public class StudioController { private static final String DEFAULT_PROMPT = "你是一个博学的智能聊天助手,请根据用户提问回答!"; private final ChatClient dashScopeChatClient; // 也可以使用如下的方式注入 ChatClient public StudioController(ChatClient.Builder chatClientBuilder) { this.dashScopeChatClient = chatClientBuilder .defaultSystem(DEFAULT_PROMPT) // TODO // 实现 Chat Memory 的 Advisor // 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。 // .defaultAdvisors( // new MessageChatMemoryAdvisor(new InMemoryChatMemory()) // ) // 实现 Logger 的 Advisor .defaultAdvisors( new SimpleLoggerAdvisor() ) // 设置 ChatClient 中 ChatModel 的 Options 参数 .defaultOptions( DashScopeChatOptions.builder() .withTopP(0.7) .build() ) .build(); } /** * ChatClient 简单调用 */ @GetMapping("/simple/chat") public String simpleChat(@RequestParam(value = "query", defaultValue = "你好,很高兴认识你,能简单介绍一下自己吗?")String query) { return dashScopeChatClient.prompt(query).call().content(); } /** * ChatClient 流式调用 */ @GetMapping("/stream/chat") public Flux<String> streamChat(@RequestParam(value = "query", defaultValue = "你好,很高兴认识你,能简单介绍一下自己吗?")String query, HttpServletResponse response) { response.setCharacterEncoding("UTF-8"); return dashScopeChatClient.prompt(query).stream().content(); } /** * ChatClient 使用自定义的 Advisor 实现功能增强. * eg: * http://127.0.0.1:18080/helloworld/advisor/chat/123?query=你好,我叫牧生,之后的会话中都带上我的名字 * 你好,牧生!很高兴认识你。在接下来的对话中,我会记得带上你的名字。有什么想聊的吗? * http://127.0.0.1:18080/helloworld/advisor/chat/123?query=我叫什么名字? * 你叫牧生呀。有什么事情想要分享或者讨论吗,牧生? */ @GetMapping("/advisor/chat/{id}") public Flux<String> advisorChat( HttpServletResponse response, @PathVariable String id, @RequestParam String query) { response.setCharacterEncoding("UTF-8"); return this.dashScopeChatClient.prompt(query) .advisors( // TODO // a -> a // .param(CHAT_MEMORY_CONVERSATION_ID_KEY, id) // .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100) ).stream().content(); } }

5. 运行与测试

  1. 启动应用:运行你的 Spring Boot 主程序。
  2. 使用浏览器或 API 工具(如 Postman, curl)进行测试

测试 1:简单对话

访问以下 URL,测试简单的 AI 对话功能。

http://localhost:18080/studio/simple/chat?query=你好,很高兴认识你,能简单介绍一下自己吗?

预期响应

你好!我是一个基于人工智能的助手,很高兴认识你。我可以回答问题、提供信息、参与讨论,并尽力帮助你解决各种问题。无论是学习、工作还是日常生活中的疑问,我都很乐意为你提供支持。请随时告诉我你需要什么帮助!

测试 2:流式对话

访问以下 URL,测试流式响应功能。

http://localhost:18080/studio/stream/chat?query=请详细介绍一下人工智能的发展历程

预期响应

(流式输出,逐字显示)人工智能的发展历程可以追溯到20世纪中期...(完整回答内容)

测试 3:Advisor 增强对话

访问以下 URL,测试基于 Advisor 的功能增强。

http://localhost:18080/studio/advisor/chat/123?query=你好,我叫小明,之后的会话中都带上我的名字

预期响应

你好,小明!很高兴认识你。在接下来的对话中,我会记得带上你的名字。有什么想聊的吗?

然后继续提问:

http://localhost:18080/studio/advisor/chat/123?query=我叫什么名字?

预期响应

你叫小明呀。有什么事情想要分享或者讨论吗,小明?

6. 实现思路与扩展建议

实现思路

本案例的核心思想是"模块化设计"与"功能增强"。我们将不同的对话交互模式分离开来,并通过 Advisor 模式实现功能增强。这使得:

  • 灵活性高:可以根据需要选择不同的对话模式,满足不同场景的需求。
  • 可扩展性强:通过 Advisor 模式,可以轻松添加新功能,如上下文记忆、日志记录、内容过滤等。
  • 代码复用性高:核心的 ChatClient 可以被不同的对话模式复用,减少重复代码。

扩展建议

  • 实现 Chat Memory Advisor:取消代码中注释的部分,实现真正的上下文记忆功能,让 AI 能够记住之前的对话内容。
  • 添加更多 Advisor:实现内容安全过滤、敏感词检测、回答格式控制等 Advisor,增强对话的安全性和可控性。
  • 集成多模态功能:扩展 Studio 功能,支持图像、音频等多模态输入和输出。
  • 实现对话管理:添加对话列表、对话历史、对话标签等功能,方便用户管理和回顾对话内容。
  • 添加性能监控:集成监控工具,跟踪对话响应时间、成功率等指标,优化系统性能。

7. 关键技术点解析

7.1 ChatClient 的配置与使用

ChatClient 是 Spring AI Alibaba 的核心组件,用于与 AI 模型进行交互。在本案例中,我们通过 Builder 模式配置 ChatClient,包括:

  • 默认系统提示词:通过 defaultSystem() 方法设置 AI 的角色和基本行为。
  • Advisor 配置:通过 defaultAdvisors() 方法添加功能增强组件。
  • 模型参数配置:通过 defaultOptions() 方法设置 AI 模型的参数,如 TopP 等。

7.2 流式响应的实现

流式响应通过 Reactor 的 Flux<String> 实现,可以逐字返回 AI 的回答,提升用户体验。关键点包括:

  • 使用 stream() 方法获取流式响应。
  • 设置 HTTP 响应的字符编码为 UTF-8,确保中文正确显示。
  • 前端可以通过 Server-Sent Events (SSE) 或 WebSocket 接收流式数据。

7.3 Advisor 模式的应用

Advisor 模式是 Spring AI Alibaba 的重要特性,允许在不修改核心逻辑的情况下增强功能。本案例中展示了:

  • SimpleLoggerAdvisor:提供日志记录功能,记录对话内容。
  • Chat Memory Advisor(注释状态):提供上下文记忆功能,使 AI 能够记住之前的对话内容。

Read more

【粉丝福利社】扣子(Coze) Skills+OpenClaw 实战:零基础玩转AI智能体

【粉丝福利社】扣子(Coze) Skills+OpenClaw 实战:零基础玩转AI智能体

💎【行业认证·权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:ZEEKLOG博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者 🏆【荣誉殿堂】 🎖 连续三年蝉联"华为云十佳博主"(2022-2024) 🎖 双冠加冕ZEEKLOG"年度博客之星TOP2"(2022&2023) 🎖 十余个技术社区年度杰出贡献奖得主 📚【知识宝库】 覆盖全栈技术矩阵: ◾ 编程语言:.NET/Java/Python/Go/Node… ◾ 移动生态:HarmonyOS/iOS/Android/小程序 ◾ 前沿领域:

深度解析 MySQL 与 MCP 集成:从环境构建到 AI 驱动的数据交互全流程

深度解析 MySQL 与 MCP 集成:从环境构建到 AI 驱动的数据交互全流程

前言 在当前大语言模型(LLM)应用开发的浪潮中,MCP(Model Context Protocol)协议正在成为连接 AI 模型与本地数据设施的关键桥梁。本文将以 MySQL 数据库为例,详细拆解如何通过 MCP 协议让 AI 模型直接操作关系型数据库,涵盖从服务器发现、数据库架构设计、数据初始化、MCP 配置文件编写到复杂自然语言查询与写入的全过程。 第一部分:MCP 服务器的发现与配置获取 在进行任何数据交互之前,首要任务是确立连接协议与服务源。通过蓝耘 MCP 广场,开发者可以快速检索并获取所需的 MCP 服务器配置。 在搜索栏输入 mysql 关键字,系统会立即检索出相关的 MCP 服务器资源。如下图所示,搜索结果中清晰展示了 MySQL 对应的 MCP 服务卡片。 点击选中该 MCP 服务器后,

字节开源 DeerFlow 2.0——登顶 GitHub Trending 1,让 AI 可做任何事情

字节开源 DeerFlow 2.0——登顶 GitHub Trending 1,让 AI 可做任何事情

打开 deerflow 的官网,瞬间被首页的这段文字震撼到了,do anything with deerflow。让 agent 做任何事情,这让我同时想到了 openclaw 刚上线时场景。 字节跳动将 DeerFlow 彻底重写,发布 2.0 版本,并在发布当天登上 GitHub Trending 第一名。这不是一次功能迭代,而是一次从"深度研究框架"到"Super Agent 运行时基础设施"的彻底蜕变。 背景:从 v1 到 v2,发生了什么? DeerFlow(Deep Exploration and Efficient Research Flow)

OpenClaw 生态主流 AI 模型真实性能 PinchBench深度解读(基于2026年3月12日测评数据)

OpenClaw 生态主流 AI 模型真实性能深度解读(2026年3月) 基于 PinchBench 最新测评数据(2026-03-12),全面解析 39 款主流 AI 模型在 OpenClaw 生态中的真实表现 📊 测评概述 本次测评涵盖 23 项真实场景任务,包括: * 📅 日历管理 * 💻 代码编写 * 📖 文档理解 * 🧠 上下文记忆 * 🔍 信息检索 * ✍️ 内容创作 * 📊 数据分析 测评维度包括: * 成功率:任务完成的准确性 * 速度:响应时间 * 成本:API 调用费用 * 价值:性价比综合评估 🏆 总体排名 Top 10 排名模型综合成功率亮点🥇moonshotai/kimi-k2.583.5%全能王者,各项均衡🥈anthropic/claude-opus-4.