SpringAi Alibaba快速开始

首先我们需要引入springAI Alibaba。

官方文档:https://java2ai.com/docs/dev/overview/

特性

Spring AI Alibaba

LangChain (Python)

Hugging Face (Python)

语言生态

Java 原生,无缝对接 Spring

Python 为主,需桥接 Java

Python 为主,轻量级

企业级治理

内置 Nacos、Sentinel

需额外集成

多模态支持

通义万相、语音交互

需插件扩展

部分模型支持

动态配置

Nacos 热更新

需重启应用

然后我们需要去获取API-KEY:https://bailian.console.aliyun.com/?tab=model#/api-key

引入maven依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.guslegend</groupId>
  <artifactId>SpringAI-project</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.3</version>
    <relativePath/>
  </parent>

  <properties>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>21</java.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-bom</artifactId>
        <version>1.0.0.2</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud.ai</groupId>
      <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
    </dependency>
  </dependencies>
</project>

配置yml文件

spring:
  application:
    name: spring-ai-project

  ai:
    dashscope:
      api-key: sk-6ef5a7da223c485bb08a9660dda504a6

logging:
  level:
    org.springframework.ai.chat.client.advisor: debug

编写controller

@RestController
@RequestMapping("/ai")
public class ChatController {

    private static final String DEFAULT_PROMPT="你是guslegend团队的智能助手,请根据用户问题回答";

    private final ChatClient dashScopeChatClient;

    public ChatController(ChatClient.Builder chatClientBuilder){
        this.dashScopeChatClient =  chatClientBuilder
                // 设置系统角色
                .defaultSystem(DEFAULT_PROMPT)
                // 设置默认提示语,打印输出
                .defaultAdvisors(new SimpleLoggerAdvisor())
                // 设置默认参数
                .defaultOptions(
                        DashScopeChatOptions.builder()
                                .withTopP(0.7)
                                .build()
                ).build();
    }

    /**
     * ChatClient 简单调用
     */
    @GetMapping("/chat/simple")
    public String chatSimple(@RequestParam(value = "query",defaultValue = "你好,可以简单介绍一下你吗?") String query){
        return dashScopeChatClient.prompt(query).call().content();
    }

    /**
     * ChatClient 流式调用
     */
    @GetMapping("/chat/stream")
    public Flux< String> chatStream(@RequestParam(value = "query",defaultValue = "你好,可以简单介绍一下你吗?") String query, HttpServletResponse  response){
        response.setCharacterEncoding("UTF-8");
        return dashScopeChatClient.prompt(query).stream().content();
    }


}

AI智能医生助手项目背景和基础准备

需求背景:开发一个智能医生,可以回答病人的问题。需要持久优化存储,避免重启后历史消息丢失。支持多用户进行使用,且可以查询历史对话消息,需要支持流失响应。

主要知识点:

  1. 依赖注入: 通过构造函数注入 ChatClient.Builder 和 RedisChatMemoryRepository
  2. 记忆管理: 使用 MessageWindowChatMemory 实现滑动窗口式记忆管理。
  3. 会话隔离: 通过 conversationId 实现多用户会话隔离。
  4. 参数传递: 使用 CONVERSATION_ID 参数关联特定会话。
  5. 系统提示: 通过 defaultSystem()方法设置 AI 行为规范。

添加Redis依赖

       <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>5.2.0</version>
        </dependency>
spring:
  ai:
    memory:
      redis:
        host: 127.0.0.1
        port: 6379
        password: 123456
        timeout: 5000

docker容器化部署redis

@Configuration
public class MemoryConfig {

    @Value("${spring.ai.memory.redis.host}")
    private String redisHost;
    @Value("${spring.ai.memory.redis.port}")
    private int redisPort;
    @Value("${spring.ai.memory.redis.password}")
    private String redisPassword;
    @Value("${spring.ai.memory.redis.timeout}")
    private int redisTimeout;

    @Bean
    public RedisChatMemoryRepository redisChatMemoryRepository() {
        return RedisChatMemoryRepository.builder()
                .host(redisHost)
                .port(redisPort)
                // 若没有设置密码则注释该项
        .password(redisPassword)
                .timeout(redisTimeout)
                .build();
    }
}

提示词

  • 明确助手角色定位(医学健康咨询),定义回复结构和内容要求
  • 强调免责声明和就医建议,规范语言风格和专业术语使用
 // 系统提示词模板
private static final String SYSTEM_PROMPT = """
        你是一位基于医学知识的AI健康咨询助手,你的职责是:
        1. 礼貌询问用户的健康问题(症状、持续时间、年龄、基础疾病等关键信息)
        2. 基于用户描述提供可能的健康建议(非诊断结果)
        3. 明确提示"本建议仅供参考,不替代专业医师诊断"
        4. 对紧急症状(如胸痛、严重出血等)优先建议立即就医
        
        回复要求:
        - 语言通俗易懂,避免专业术语堆砌
        - 结构清晰:先回应问题,再给出建议,最后提示就医
        - 不承诺治愈效果,不提供具体用药剂量建议
        - 对超出常识的问题,引导用户咨询专业医生
        """;

WindowChatMemory开发

什么是MessageWindowChatMemory:是处理对话记忆的核心组件之一。主要用于存储和管理对话过程中的历史消息(用户输入和AI回复),并通过窗口机制控制记忆的消息数量。确保大模型能基于最近的对话上下文生成连贯的回复,避免历史记录过长导致的性能问题或上下文冗余。

@RequestMapping("/ai/docker")
@RestController
public class AIDoctorController {

    private final ChatClient chatClient;
    private final int MAX_MESSAGES = 100;
    private final MessageWindowChatMemory messageWindowChatMemory;

    // 系统提示词模板
    private static final String SYSTEM_PROMPT = """
        你是一位基于医学知识的AI健康咨询助手,你的职责是:
        1. 礼貌询问用户的健康问题(症状、持续时间、年龄、基础疾病等关键信息)
        2. 基于用户描述提供可能的健康建议(非诊断结果)
        3. 明确提示"本建议仅供参考,不替代专业医师诊断"
        4. 对紧急症状(如胸痛、严重出血等)优先建议立即就医
        
        回复要求:
        - 语言通俗易懂,避免专业术语堆砌
        - 结构清晰:先回应问题,再给出建议,最后提示就医
        - 不承诺治愈效果,不提供具体用药剂量建议
        - 对超出常识的问题,引导用户咨询专业医生
        """;

    /**
     * AIDoctorController构造函数
     * 初始化聊天客户端和消息窗口内存管理器
     *
     * @param builder ChatClient.Builder对象,用于构建聊天客户端
     * @param redisChatMemoryRepository Redis聊天内存仓库,用于持久化聊天记录
     */
    public AIDoctorController(ChatClient.Builder builder, RedisChatMemoryRepository redisChatMemoryRepository) {
        // 构建消息窗口聊天内存管理器,设置最大消息数量和Redis仓库
        this.messageWindowChatMemory = MessageWindowChatMemory.builder()
                .chatMemoryRepository(redisChatMemoryRepository)
                .maxMessages(MAX_MESSAGES)
                .build();

        // 构建聊天客户端,设置默认的消息内存
        this.chatClient = builder
                .defaultSystem(SYSTEM_PROMPT)
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(messageWindowChatMemory)
                                .build()
                )
                .build();
    }
}

请求发送和流失发送

    /**
     * 处理聊天调用请求
     * 接收用户查询和会话ID,返回AI助手的回复内容
     *
     * @param query 用户的查询内容
     * @param conversationId 会话ID
     * @return AI助手的回复内容字符串
     */
    @GetMapping("/call")
    public Flux<String> call(@RequestParam(value = "query") String query,
                             @RequestParam(value = "conversation_id") String conversationId, HttpServletResponse response
    ) {
        response.setCharacterEncoding("UTF-8");
        return chatClient.prompt(query)
                .advisors(
                        a -> a.param(CONVERSATION_ID, conversationId)
                )
                .stream().content();
    }

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐