跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava

Spring AI Alibaba 快速入门指南

Spring AI Alibaba 是阿里云基于 Spring AI 扩展的第三方适配方案,专注于集成阿里云 AI 服务。文章对比了其与原生 Spring AI 在官方属性、覆盖范围及依赖关系上的差异。内容涵盖申请阿里云百炼 API Key 的步骤,以及基于 Spring Boot 搭建 Hello World 项目的完整流程,包括 Maven 配置、Controller 编写和 ChatClient 的简单调用、流式输出及记忆功能测试。

不羁发布于 2025/12/12更新于 2026/10/24104 浏览

Spring AI Alibaba 简介

Spring AI Alibaba(SAA)是一款以 Spring AI 为基础,深度集成百炼平台,支持 ChatBot、工作流、多智能体应用开发模式的 AI 框架。

Spring AI 和 Spring AI Alibaba 是生态关联但定位、范围、主导方完全不同的两个技术体系,核心区别在于是否为官方生态、覆盖范围、适配场景。

一、核心定位与主导方

维度Spring AISpring AI Alibaba
官方属性Spring 官方生态项目阿里云基于 Spring AI 扩展的第三方适配方案
核心定位通用 AI 应用开发框架阿里云 AI 服务的 Spring 生态集成方案
主导团队Spring 社区阿里云技术团队
生态归属Spring 官方核心生态阿里云开源生态

二、覆盖范围与适配能力

1. Spring AI:通用抽象 + 多厂商适配

Spring AI 的核心目标是屏蔽不同 AI 厂商的接口差异,提供一套统一的 Java API,让开发者无需修改代码即可切换不同 AI 服务。

  • 适配的 AI 厂商/服务:大模型(OpenAI、Anthropic、Google Gemini 等)、向量存储(Redis、Milvus 等)、其他云厂商 AI 平台。
  • 核心能力:通用 LLM 调用、函数调用、向量检索、AI 流式响应、提示词模板、AI 工作流等。
  • 适用场景:需要跨 AI 厂商适配、追求技术中立性的通用 AI 应用。

2. Spring AI Alibaba:阿里云专属适配

Spring AI Alibaba 并非独立框架,而是基于 Spring AI 的官方接口,为阿里云 AI 产品提供的专属适配器。

  • 适配的 AI 服务:通义千问、通义视觉、通义听悟、阿里云向量数据库等。
  • 核心能力:复用 Spring AI 的统一 API,快速接入阿里云 AI 服务,补充阿里云专属特性(如 AK/SK 鉴权、地域路由)。
  • 适用场景:已使用阿里云生态且需要接入阿里云 AI 产品的 Spring 应用。

三、技术架构与依赖关系

  • 依赖关系:Spring AI Alibaba 必须依赖 Spring AI 的核心包,本质是 Spring AI 的厂商适配模块。
  • 独立性:Spring AI 可独立使用;Spring AI Alibaba 不能独立使用,必须搭配 Spring AI 核心依赖。

四、关键差异总结表

对比维度Spring AISpring AI Alibaba
官方属性Spring 官方项目阿里云第三方适配方案
覆盖范围多厂商 AI 服务 + 开源 AI 组件仅阿里云 AI 服务
核心价值统一 AI 编程接口,技术中立简化阿里云 AI 服务接入
依赖关系可独立使用必须依赖 Spring AI 核心包
适用场景跨厂商 AI 适配、开源 AI 项目阿里云生态用户

对于国内 Java 程序员来说,使用 Spring AI Alibaba 上手比较容易,申请一个阿里云百炼的 Key 就可以进行测试。

申请阿里云百炼 Api Key

访问阿里云百炼平台控制台,使用账号登录后,选择 模型服务 里面的 密钥管理。

创建 API Key,该 Key 将在后续开发中频繁使用。

项目搭建

项目结构

采用 Maven 多模块结构。

父 pom 文件

在父 pom 文件中做项目依赖包的版本管理。

<?xml version="1.0" encoding="UTF-8"?>
<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>org.demo.ai</groupId>
    <artifactId>spring-ai-alibaba</artifactId>
    <version>${revision}</version>
    <packaging>pom</packaging>
    <description>Spring AI Alibaba Examples</description>
    <properties>
        <revision>1.0.0</revision>
        <java.version>17</java.version>
        <spring-ai.version>1.0.0</spring-ai.version>
        <spring-ai-alibaba.version>1.0.0.3</spring-ai-alibaba.version>
        <spring-boot.version>3.5.5</spring-boot.version>
    </properties>
    <modules>
        <module>boot-ai-helloworld</module>
    </modules>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-bom</artifactId>
                <version>${spring-ai-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <repositories>
        <repository>
            <id>aliyunmaven</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>
</project>

子模块 boot-ai-helloworld

子 pom 文件
<?xml version="1.0" encoding="UTF-8"?>
<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>
    <parent>
        <groupId>org.demo.ai</groupId>
        <artifactId>spring-ai-alibaba</artifactId>
        <version>${revision}</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <artifactId>boot-ai-helloworld</artifactId>
    <version>${revision}</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
        </dependency>
    </dependencies>
</project>
配置文件
server:
  port: 18080
spring:
  application:
    name: spring-ai-alibaba-helloworld
  ai:
    dashscope:
      api-key: {替换成阿里云百炼上的 API Key}
启动类
package org.demo.ai.bailian;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BailianAgentApplication {
    public static void main(String[] args) {
        SpringApplication.run(BailianAgentApplication.class, args);
    }
}
Controller 层

使用 ChatClient 类与大模型交互。

package org.demo.ai.bailian.controller;

import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/helloworld")
public class HelloworldController {

    private static final String DEFAULT_PROMPT = "你是一个博学的智能聊天助手,请根据用户提问回答!";
    private final ChatClient dashScopeChatClient;

    public HelloworldController(ChatClient.Builder chatClientBuilder) {
        this.dashScopeChatClient = chatClientBuilder
                .defaultSystem(DEFAULT_PROMPT)
                .defaultAdvisors(MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build())
                .defaultAdvisors(new SimpleLoggerAdvisor())
                .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 实现功能增强
     */
    @GetMapping("/advisor/chat/{conversationId}")
    public Flux<String> advisorChat(HttpServletResponse response,
                                    @PathVariable String conversationId,
                                    @RequestParam String query) {
        response.setCharacterEncoding("UTF-8");
        return this.dashScopeChatClient
                .prompt(query)
                .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
                .stream()
                .content();
    }
}

测试

测试一:访问简单 chat

访问链接:/helloworld/simple/chat

测试二:访问流式输出

访问链接:/helloworld/stream/chat

测试三:带有记忆的输出

  1. 先访问:/helloworld/advisor/chat/123?query=你好,我叫 jack
  2. 再访问:/helloworld/advisor/chat/123?query=我叫什么名字?

通过设置 conversationId 参数,将对话历史记录存储到 ChatMemory 中,后续对话会将之前的历史记录作为上下文。

目录

  1. Spring AI Alibaba 简介
  2. 一、核心定位与主导方
  3. 二、覆盖范围与适配能力
  4. 1. Spring AI:通用抽象 + 多厂商适配
  5. 2. Spring AI Alibaba:阿里云专属适配
  6. 三、技术架构与依赖关系
  7. 四、关键差异总结表
  8. 申请阿里云百炼 Api Key
  9. 项目搭建
  10. 项目结构
  11. 父 pom 文件
  12. 子模块 boot-ai-helloworld
  13. 子 pom 文件
  14. 配置文件
  15. 启动类
  16. Controller 层
  17. 测试
  18. 测试一:访问简单 chat
  19. 测试二:访问流式输出
  20. 测试三:带有记忆的输出

更多推荐文章

查看全部
  • ReAct 与 Plan-and-Execute:AI Agent 推理架构对比与选择
  • SheetJS:全场景适用的 JavaScript 电子表格处理工具
  • Python 环境安装与配置 Gurobi 求解器指南
  • 并查集数据结构详解与实战应用
  • 基于 LangGraph 实现模块化 Skills 型 AI Agent
  • OpenClaw iOS/Android 端部署教程:语音唤醒与随身 AI 助手
  • OpenAI Whisper 语音转文本入门与实战
  • Axure 制作 AI 自动对话机器人原型教程
  • Ubuntu 24.04 下使用 Docker Compose 本地部署 Whisper 语音识别
  • 基于 FPGA 的千兆以太网源代码实现与设计实战
  • 基于 FPGA 的多层感知机设计与逻辑门实现指南
  • 选择排序算法原理与实现
  • Python PyQt6 实战:从零构建简易记事本
  • 基于Vivado的RISC-V五级流水线CPU FPGA实现详解
  • FireRedASR-AED-L 嘈杂环境中文语音识别效果对比与原理分析
  • AI 并非前端 UI 的终结者,而是效率加速器
  • Python 与 PyCharm 虚拟环境搭建及实战指南
  • Spatial Joy 2025 全球 AR&AI 赛事:开发者资源、玩法及避坑攻略
  • 基于 RetinaFace 和 CurricularFace 的教育考勤自动化方案
  • 模拟算法实战:替换问号、提莫攻击、Z 字形变换等 5 题解析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online