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 能够记住之前的对话内容。
相关推荐
AngelPP19 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年19 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼19 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS19 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区20 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈20 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang21 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx
shengjk11 天前
NanoClaw 深度剖析:一个"AI 原生"架构的个人助手是如何运转的?
人工智能
西门老铁1 天前
🦞OpenClaw 让 MacMini 脱销了,而我拿出了6年陈的安卓机
人工智能