大家好,我是工藤学编程 🦉 一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉 C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
AI大模型 零基础学AI大模型之从0到1调用大模型API

前情摘要:
1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API


零基础学AI大模型之SpringAI

引言

随着大语言模型(LLM)技术的爆发,AI应用从实验室走向企业生产环境已成为趋势。但对Java开发者而言,长期面临两大痛点:一是不同AI模型(如OpenAI、通义千问、Gemini)接口不统一,集成时需重复适配;二是企业级应用需兼顾模块化、可扩展性与现有Spring生态(Spring Boot、Spring Cloud)的兼容性,传统AI开发框架(如LangChain)难以满足。

SpringAI 的出现恰好填补了这一空白——作为Spring生态下的企业级AI应用开发框架,它将Spring的设计哲学延伸至AI领域,让Java工程师无需深入AI底层技术,即可快速集成大模型能力。同时,LLM的“多模态”技术正成为突破单模态局限的关键,而SpringAI也已原生支持多模态能力,为开发者提供从文本到图像、语音的全场景解决方案。

本文将从SpringAI的核心特性、与主流AI框架的对比、LLM多模态技术解析,到完整的SpringAI项目实战,带您全面掌握Java生态下的AI应用开发。

一、深度解析SpringAI

1.1 什么是SpringAI?

SpringAI是Spring官方推出的企业级AI应用开发框架,核心定位是“连接大模型与企业系统的桥梁”。它并非替代LLM,而是通过标准化接口、工程化工具链,解决AI模型与企业数据、现有API的连接难题,让Java开发者能以“Spring原生方式”开发AI应用。

其官方定义可概括为:

将Spring的可移植性、模块化、依赖注入等核心原则应用于AI领域,支持聊天、嵌入、向量存储、RAG等完整AI开发栈,兼容20+主流大模型,降低企业级AI应用的开发门槛。

官网与源码地址:

1.2 主流AI开发框架对比:为什么选SpringAI?

当前AI应用开发框架众多,不同框架侧重不同场景。对Java开发者或企业级项目而言,SpringAI的优势尤为明显:

框架/平台 核心优势 适用场景 对Java友好度 企业级支持
SpringAI Spring生态无缝集成、标准化API、工程化工具链 Java企业级AI应用、现有Spring项目升级 ★★★★★ ★★★★★
LangChain 灵活的链(Chain)设计、丰富的工具集成 多步骤AI任务(如问答+总结) ★★★☆☆ ★★★☆☆
LangChain4j 适配Java生态、轻量级 简单Java AI应用 ★★★★☆ ★★★☆☆
Dify/Coze 低代码平台、可视化配置 非技术人员快速搭建AI应用 ★★☆☆☆ ★★★★☆
CrewAI 多智能体协作、任务拆分 复杂多角色AI任务(如团队协作) ★★★☆☆ ★★★☆☆

核心差异:SpringAI并非“从零搭建AI能力”,而是聚焦“企业级集成”——它能直接复用Spring Boot的自动配置、Spring Cloud的分布式能力,让已有Spring项目(如电商后台、CRM系统)快速接入AI功能,无需重构技术栈。

1.3 SpringAI的四大核心特性

SpringAI的设计围绕“简化企业级AI开发”展开,核心特性可概括为四点:

1. 提供商无关:统一API兼容20+主流模型

SpringAI通过抽象接口屏蔽了不同AI提供商的差异,开发者只需一套代码,即可切换不同模型。目前已支持:

  • 国外模型:OpenAI(GPT-3.5/4)、Google Gemini、Anthropic Claude、Meta Llama 3
  • 国内模型:阿里云通义千问、百度文心一言、字节跳动火山大模型、华为盘古大模型
  • 场景化模型:图像生成(DALL·E、Stable Diffusion)、语音处理(Whisper)、向量生成(OpenAI Embeddings)

示例:切换“OpenAI”与“通义千问”时,仅需修改配置文件的model参数,无需改动业务代码。

2. 胶水层能力:连接大模型与企业系统

SpringAI承担“中间件”角色,解决大模型与企业数据、现有系统的连接问题:

  • 对接企业数据库:支持从MySQL、Elasticsearch等数据库中提取数据,结合RAG(检索增强生成)生成精准回答;
  • 集成企业API:可调用ERP、CRM等系统的API,让AI能获取实时业务数据(如“查询近30天的订单退款率并总结原因”);
  • 工具链扩展:支持集成第三方工具(如计算器、翻译API、邮件发送工具),拓展AI的能力边界。
3. 工程化工具链:覆盖AI开发全流程

SpringAI提供从“模型调用”到“应用落地”的全流程工具,避免开发者重复造轮子:

  • 模型调用层:封装模型请求/响应逻辑,支持同步调用、流式调用(如实时聊天);
  • 数据处理层:提供文本分割器(TextSplitter)、文档加载器(DocumentLoader),适配PDF、Word、Markdown等格式;
  • 向量存储层:统一向量数据库接口,支持Redis、Milvus、Pinecone等,为RAG提供底层支持;
  • RAG全流程:内置检索器(Retriever)、提示词模板(Prompt Template),可快速搭建文档问答系统。
4. Spring原生体验:降低Java开发者学习成本

对熟悉Spring的开发者而言,SpringAI几乎“零学习成本”:

  • 自动配置:引入Starter依赖后,框架自动配置ChatModelEmbeddingModel等Bean,无需手动初始化;
  • 依赖注入:可通过@Autowired直接注入AI模型实例,与Spring Bean的使用方式一致;
  • 分布式支持:无缝集成Spring Cloud,可实现AI服务的负载均衡、服务发现、熔断降级,满足高并发场景。

1.4 SpringAI的典型适用场景

SpringAI的企业级特性使其在以下场景中尤为适用:

  • 智能客服系统:结合RAG检索企业知识库,自动回答用户关于产品功能、售后政策的问题,支持文本/语音多模态交互;
  • 文档问答系统:上传企业手册、技术文档(如API文档、运维手册),AI可精准定位相关内容并生成自然语言回答;
  • 代码生成助手:为Java开发者生成接口代码、单元测试、SQL语句,支持结合企业代码规范定制生成逻辑;
  • 内容总结与分析:自动总结会议纪要、客户反馈、订单数据,生成结构化报告(如“总结本周客户投诉的Top3问题”);
  • 知识库检索:构建企业私有知识库,支持按关键词、语义检索,解决“文档多找不到”的问题。

二、LLM多模态:从“单一交互”到“类人感知”

在了解SpringAI后,我们不得不提当前LLM的核心发展方向——多模态技术。它让AI从“只能处理文本”进化为“能看懂、听懂、生成多种信息”,更贴近人类的交互方式。

2.1 什么是多模态?

  • 通俗定义:多模态LLM是“全能信息处理器”,能同时处理文本、图像、语音、视频等多种类型的信息,就像人类用眼睛看图、用耳朵听声、用大脑理解语义,并整合这些信息进行交流。
  • 技术定义:多模态模型通过统一的神经网络架构(如Transformer),将不同模态的信息(文本的Token、图像的像素、语音的声波)转换为统一的向量表示,实现跨模态的理解与生成。

2.2 多模态 vs 单模态

早期AI模型多为“单模态”,即只能处理一种信息类型,而多模态则打破了这一局限:

维度 单模态模型(如早期ChatGPT、识图软件) 多模态模型(如GPT-4V、Gemini)
信息处理能力 仅支持文本/图像/语音中的一种 同时支持文本、图像、语音、视频
交互方式 单一输入(如文本输入→文本输出) 多输入多输出(如图文输入→文本/语音输出)
理解深度 无法关联不同类型信息(如图文无关) 能关联多模态信息(如图像内容+文本提问→精准回答)
应用场景 局限(如纯文本聊天、纯图像识别) 广泛(如图文内容生成、语音助手+图像分析)

示例对比
在这里插入图片描述

  • 单模态识图软件:只能识别“图片中有一只小狗”,但无法回答“这只小狗在做什么?用一句话描述并模拟叫声”;
  • 多模态模型:能识别“小狗在追飞盘”,生成文本描述,并模拟“汪汪汪”的叫声。

2.3 多模态的常见类型与应用场景

多模态的核心价值是“拓展AI的感知与表达能力”,常见模态及应用如下:

模态类型 输入场景 输出场景 典型应用案例
文本模态 用户提问、文档内容 回答、总结、代码生成 智能客服文本问答、文档总结
图像模态 照片、截图、手绘草图 图像描述、物体识别、图像生成 图文结合的产品介绍、AI绘图
语音模态 人类语音、环境音 语音转文字、文字转语音、语音识别 语音助手(如“小爱同学”)、会议录音转文字
视频模态 短视频、监控录像 视频内容分析、字幕生成 视频摘要生成、监控异常行为检测

生活中的多模态实例
打开某购物APP的“AI导购”功能,你上传一张“黑色连帽卫衣”的照片(图像输入),说“帮我找类似款式,预算500以内”(语音输入),AI会返回符合条件的商品列表,并语音播报“为您推荐3款连帽卫衣,最低售价399元”(语音输出)——这就是多模态的典型交互。

2.4 SpringAI对多模态的支持

SpringAI已原生集成多模态能力,开发者可通过统一接口调用不同模态的模型,无需单独适配:

多模态模型类型 核心能力 支持的主流模型 开发示例
聊天模型 文本对话、文本生成 OpenAI GPT-4、通义千问 实现“讲个笑话”“总结订单数据”接口
嵌入模型 文本/图像向量化(用于检索) OpenAI Embeddings、通义千问Embeddings 将文档转换为向量,存储到Milvus
图像生成模型 文本→图像、图像→图像编辑 DALL·E 3、Stable Diffusion 输入“生成一只在太空漂浮的猫”,返回图像URL
语音模型 语音转文字(ASR)、文字转语音(TTS) OpenAI Whisper、阿里云语音服务 上传录音文件,转换为文本并总结

关键优势:SpringAI对多模态模型的封装与“文本模型”一致,开发者无需学习新的调用方式。例如,调用图像生成模型与调用聊天模型的代码结构相似,仅需注入对应的ImageModel实例即可。

三、SpringAI实战

理论之后,我们通过实战掌握SpringAI的核心开发流程。本次实战以“集成DeepSeek模型实现文本生成接口”为例,覆盖环境准备、项目搭建、代码开发全流程。

3.1 实战前提:环境准备

SpringAI对依赖版本有明确要求,需提前配置以下环境:

依赖工具 最低版本要求 推荐版本 说明
JDK 17 21 Spring Boot 3.x依赖JDK 17+,JDK 21性能更优
Spring Boot 3.2 3.5.3 需与SpringAI版本兼容(本文用3.5.3)
Maven 3.9 3.9.6 用于依赖管理,避免版本冲突
开发工具 IDEA 2023.1+ IDEA旗舰版2024 支持Spring Boot自动配置提示

注意:避免使用低于上述版本的工具,否则可能出现依赖冲突(如Spring Boot 3.1与SpringAI 1.0.0不兼容)。

3.2 第一步:项目创建与依赖配置

SpringAI从M7版本开始调整了Starter命名规范和模块结构,旧教程的依赖已失效,需使用新版配置:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- 父依赖:Spring Boot 3.5.3 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.3</version>
        <relativePath/>
    </parent>

    <groupId>net.xdclass</groupId>
    <artifactId>spring-ai-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-ai-demo</name>
    <description>SpringAI集成DeepSeek实战</description>

    <properties>
        <java.version>21</java.version>
        <spring-ai.version>1.0.0</spring-ai.version>  <!-- SpringAI稳定版 -->
    </properties>

    <dependencies>
        <!-- Spring Web:用于开发HTTP接口 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- SpringAI OpenAI兼容依赖(支持DeepSeek等兼容OpenAI协议的模型) -->
        <!-- 旧版本(M7前):spring-ai-openai-spring-boot-starter -->
        <!-- 新版本(M7后):命名规范调整为 spring-ai-starter-model-{模型名} -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-openai</artifactId>
        </dependency>

        <!-- 测试依赖(可选) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 依赖管理:统一SpringAI子模块版本 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!-- Spring Boot打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <!-- 阿里云仓库:加速依赖下载(国内用户必备) -->
    <repositories>
        <repository>
            <id>aliyun</id>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>false</enabled></snapshots>
        </repository>
        <repository>
            <id>aliyun-spring</id>
            <name>阿里云Spring仓库</name>
            <url>https://maven.aliyun.com/repository/spring</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>false</enabled></snapshots>
        </repository>
    </repositories>
</plugins>
</pluginRepositories>
</project>
3. 关键版本变化说明(避坑重点)
  • Starter命名规范调整
    旧版本:spring-ai-{模型名}-spring-boot-starter(如spring-ai-openai-spring-boot-starter
    新版本:spring-ai-starter-model-{模型名}(如spring-ai-starter-model-openai
    原因:统一Starter命名,区分“模型 Starter”与“工具 Starter”(如向量存储 Starter)。

  • 模块架构拆分
    旧版本:核心功能集中在spring-ai-core
    新版本:拆分为3个专注模块,职责更清晰:

    • spring-ai-commons:基础组件(Document、TextSplitter);
    • spring-ai-model:AI模型抽象(ChatModel、ImageModel);
    • spring-ai-vector-store:向量数据库抽象(支持Redis、Milvus)。

3.3 第二步:配置文件(application.yml)

src/main/resources下创建application.yml,配置AI模型的API密钥、基础地址、模型参数:

spring:
  application:
    name: spring-ai-demo  # 项目名称
  ai:
    openai:  # 兼容OpenAI协议的模型(如DeepSeek、通义千问)
      api-key: your-api-key  # 替换为你的API密钥(从DeepSeek/OpenAI官网获取)
      base-url: https://api.deepseek.com  # DeepSeek的API基础地址(OpenAI为https://api.openai.com/v1)
      chat:
        options:
          model: deepseek-chat  # 模型名称(DeepSeek的对话模型)
          temperature: 0.8  # 输出随机性(0~1,0为确定性输出,1为最大随机性)
          max-tokens: 2048  # 最大输出 tokens(避免生成过长内容)
配置参数解读:
  • api-key:访问AI模型的密钥,需从对应平台获取(如DeepSeek官网:https://www.deepseek.com/),切勿硬编码到代码中,生产环境建议通过配置中心(如Nacos)管理。
  • base-url:模型的API网关地址,国内模型(如通义千问)需配置国内地址,避免网络延迟。
  • temperature:控制输出的“创意度”,例如:
    • 场景1:生成报告、代码(需精准)→ 设为0.2~0.4;
    • 场景2:生成故事、笑话(需创意)→ 设为0.6~0.9。
  • max-tokens:限制模型输出的最大长度,防止超出API额度或返回冗余内容。

3.4 第三步:开发AI接口(Controller)

创建AiController,通过@Autowired注入OpenAiChatModel,开发文本生成接口:

1. 启动类(SpringAiDemoApplication.java)
package net.xdclass;

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

@SpringBootApplication
public class SpringAiDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringAiDemoApplication.class, args);
    }
}
2. 控制器(AiController.java)
package net.xdclass.controller;

import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/ai")  // 接口根路径
public class AiController {

    // 注入OpenAI兼容的聊天模型(SpringAI自动配置)
    @Autowired
    private OpenAiChatModel chatModel;

    /**
     * 文本生成接口
     * @param message 用户输入的提示词(默认:你是谁)
     * @return 模型生成的结果
     */
    @GetMapping("/generate")
    public Map<String, String> generateText(
            @RequestParam(value = "message", defaultValue = "你是谁") String message) {
        // 调用模型生成结果(底层调用ChatModel的call方法)
        String result = chatModel.call(message);
        // 返回JSON格式结果
        return Map.of("prompt", message, "generation", result);
    }
}

3.5 第四步:测试接口与验证结果

1. 启动项目

运行SpringAiDemoApplicationmain方法,控制台输出以下日志表示启动成功:
在这里插入图片描述

2. 测试接口(两种方式)

打开浏览器,输入地址:
http://localhost:8080/ai/generate?message=你是谁

3. 预期返回结果

在这里插入图片描述

3.6 深入理解:ChatModel接口源码

OpenAiChatModel实现了SpringAI的ChatModel接口,该接口是所有聊天模型的抽象入口。我们通过源码解读其核心能力:

/**
 * 聊天模型的顶层接口,定义了与AI模型交互的核心方法
 */
public interface ChatModel extends Model<Prompt, ChatResponse>, StreamingChatModel {

    /**
     * 1. 单个文本消息调用(最常用)
     * @param message 用户输入的文本
     * @return 模型生成的文本
     */
    default String call(String message) {
        // 封装用户消息为Prompt对象(包含角色:USER)
        Prompt prompt = new Prompt(new UserMessage(message));
        // 调用模型并获取结果
        Generation generation = this.call(prompt).getResult();
        // 返回结果文本(为空时返回空字符串)
        return generation != null ? generation.getOutput().getText() : "";
    }

    /**
     * 2. 多消息对话调用(支持上下文)
     * @param messages 消息列表(如:系统消息+用户消息+助手消息)
     * @return 模型生成的文本
     */
    default String call(Message... messages) {
        Prompt prompt = new Prompt(Arrays.asList(messages));
        Generation generation = this.call(prompt).getResult();
        return generation != null ? generation.getOutput().getText() : "";
    }

    /**
     * 3. 基础调用方法(返回完整ChatResponse,包含元数据)
     * @param prompt 包含消息、提示词模板的对象
     * @return ChatResponse(包含生成结果、模型信息、token使用量)
     */
    ChatResponse call(Prompt prompt);

    /**
     * 4. 流式调用(实时返回结果,适合聊天场景)
     * @param prompt 包含消息的Prompt对象
     * @return Flux<ChatResponse>(响应式流,逐段返回结果)
     */
    default Flux<ChatResponse> stream(Prompt prompt) {
        throw new UnsupportedOperationException("streaming is not supported");
    }
}
核心方法用途:
  • call(String message):快速调用,适用于简单文本生成(如本次实战);
  • call(Message… messages):支持多轮对话,可传入SystemMessage(系统提示)、AssistantMessage(助手历史回复),实现上下文记忆(如“先介绍单例模式,再写懒汉式代码”);
  • stream(Prompt prompt):流式调用,逐段返回结果(如ChatGPT的实时打字效果),需结合Spring WebFlux使用。

觉得有用请点赞收藏!
如果有相关问题,欢迎评论区留言讨论~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐