Spring AI 从入门到实战:核心流程、高级特性与源码解析
2026/5/7 10:14:04 网站建设 项目流程

Spring AI 从入门到实战:核心流程、高级特性与源码解析

一站式掌握 Spring AI 的请求流程、函数调用、多模态、文生图/音,以及 RAG、微调等大模型核心概念

前言

随着大语言模型(LLM)的爆发,Java 开发者迫切需要一个统一、标准化的框架来集成各种 AI 能力。Spring AI应运而生——它借鉴了 Spring 生态的设计哲学,提供了一套抽象层,让你可以无缝切换 OpenAI、Azure OpenAI、Hugging Face、阿里灵积(通义千问)等模型提供商,并轻松实现对话、嵌入、图像生成、语音转换和多模态交互。

本文将带你从零开始,深入理解 Spring AI 的请求流程、核心 API、函数调用原理,并最终落地一个完整的智能应用。


一、大模型核心专业名词解析

在开始编码之前,我们先梳理三个关键概念,这对理解 Spring AI 的高级能力至关重要。

术语通俗解释适用场景
RAG(检索增强生成)模型生成答案前,先从外部知识库(如向量数据库)检索相关信息,作为提示附加上下文,让模型“按资料回答”。企业知识库问答、最新信息问答(避免幻觉)
Fine-tuning(微调)用特定领域的数据继续训练预训练模型,调整其权重,使其更懂该领域的术语和风格。定制客服语气、生成特定格式的合同
Function Calling(函数调用)模型在生成响应时,请求调用你定义的外部函数(API),你执行后把结果回传,模型再结合结果生成最终答案。查天气、发邮件、查询数据库、实时计算

💡Spring AI 对这三者都有良好支持:RAG 通过VectorStore+ 嵌入模型实现;微调需要通过具体模型 API 训练,Spring AI 提供推理端点的统一调用;函数调用则是其一大亮点,下文会重点剖析。


二、Spring AI 请求总流程

下图展示了一次普通聊天请求(同步)在 Spring AI 内部的核心流转步骤:

客户端请求

ChatClient / ChatModel

是否配置了函数?

模型返回函数调用请求

FunctionCallback 执行本地逻辑

将函数结果追加到对话历史

再次请求模型,生成最终回答

直接请求模型 API

解析响应,返回给客户端

简单来说:

  • ChatModel是底层直接与 AI 服务交互的接口。
  • ChatClient是更高层的建造者模式封装,提供了函数注册、提示配置等便利方法。
  • 当启用函数调用时,Spring AI 会自动处理“请求-推断函数-执行函数-再次请求”的循环,开发者只需实现函数逻辑。

三、快速创建 Spring AI 项目

3.1 创建 Spring Boot 工程

推荐使用 Spring Initializr(https://start.spring.io)选择:

  • 项目:Maven / Gradle
  • Spring Boot:3.2.x 或更高
  • Java:17+

添加依赖(以 OpenAI 为例):

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>0.8.1</version></dependency>

3.2 配置文件application.yml

spring:ai:openai:api-key:${OPENAI_API_KEY}chat:options:model:gpt-4o-minitemperature:0.7

四、智能对话实现(基础版)

直接注入ChatModel即可:

@RestControllerpublicclassChatController{privatefinalChatModelchatModel;publicChatController(ChatModelchatModel){this.chatModel=chatModel;}@GetMapping("/chat")publicStringchat(@RequestParamStringmessage){returnchatModel.call(message);}}

对于单次无状态的对话,call(String)是最简单的用法。


五、角色预设(系统消息)

使用ChatClient可以优雅地设置 system message:

@GetMapping("/role-chat")publicStringroleChat(@RequestParamStringuserInput){returnChatClient.create(chatModel).system("你是一个只谈论美食的助手,对于任何非美食问题,一律回答:'我只懂美食哦,换个话题吧'").user(userInput).call().content();}

六、流式响应

对于大模型,流式输出能极大提升用户体验。Spring AI 支持响应式流(Reactor):

@GetMapping(value="/stream",produces=MediaType.TEXT_EVENT_STREAM_VALUE)publicFlux<String>stream(@RequestParamStringmessage){returnchatModel.stream(message).map(AssistantMessage::getText);// 每个 chunk 的文本}

前端通过EventSource或 fetch API 即可接收实时数据。


七、通过 OpenAI 访问(配置细节)

除了默认的配置项,你还可以动态覆盖模型参数:

ChatOptionsoptions=OpenAiChatOptions.builder().withModel("gpt-4").withTemperature(0.9).build();Promptprompt=newPrompt("Hello",options);ChatResponseresponse=chatModel.call(prompt);

如果需要切换多个模型提供方(如同时使用 OpenAI 和 Azure),只需引入对应的 starter 并配置不同的@Qualifier


八、ChatClient vs ChatModel 区别

特性ChatModelChatClient
抽象层次低层,直接映射 AI 提供商的 API高层建造器模式,对ChatModel的封装
函数调用支持需手动处理函数调用循环自动管理函数调用流程(声明式)
角色预设手动构造Prompt对象链式调用.system(),代码更简洁
推荐场景需要完全控制请求/响应结构的场景大多数业务对话、快速原型、函数调用

通常建议默认使用ChatClient,它能让代码更清晰,并且自动处理很多细节。


九、文生图

Spring AI 提供了统一的ImageModel接口,目前支持 OpenAI DALL-E、StabilityAI 等。

@AutowiredprivateImageModelimageModel;@GetMapping("/image")publicStringgenerateImage(@RequestParamStringprompt){ImageResponseresponse=imageModel.call(newImagePrompt(prompt));returnresponse.getResult().getOutput().getUrl();}

十、文生语音 & 语音翻译

Spring AI 目前对音频的支持还在演进中,但可以通过底层 API 或结合 Spring AI 的AudioTranscriptionModel来实现。示例(使用 OpenAI TTS 和 Whisper):

// 文生语音byte[]speech=openAiAudioSpeechModel.call("Hello world");// 语音翻译(语音转文字)Stringtext=openAiAudioTranscriptionModel.call(audioFile);

对于非英文语音翻译(如中文→英文),可以先识别中文,再用翻译模型或提示工程将文本翻译成目标语言。


十一、多模态(视觉)

多模态指模型能同时处理文本和图像。OpenAI 的gpt-4-vision-preview支持图像输入。Spring AI 中可将图像转为 Base64 或 URL 放入消息中。

List<Media>mediaList=List.of(newMedia(MimeTypeUtils.IMAGE_PNG,"https://example.com/cat.png"));UserMessageuserMessage=newUserMessage("图中是什么动物?",mediaList);ChatResponseresponse=chatModel.call(newPrompt(userMessage));

十二、Function 接口与 Function Calling 实现

12.1 定义 Function

Spring AI 要求你实现Function<T, R>接口,并配合@Description注解(便于模型理解函数用途)。

@Component@Description("获取某个城市的当前天气")publicclassMockWeatherFunctionimplementsFunction<MockWeatherFunction.Request,MockWeatherFunction.Response>{publicrecordRequest(Stringcity){}publicrecordResponse(doubletemp,Stringcondition){}@OverridepublicResponseapply(Requestrequest){// 模拟查询天气returnnewResponse(22.5,"sunny");}}

12.2 注册到 ChatClient

@GetMapping("/weather-chat")publicStringchatWithWeather(@RequestParamStringuserInput){returnChatClient.builder(chatModel).build().prompt().user(userInput).functions("mockWeatherFunction")// 对应 Bean 名称.call().content();}

Spring AI 会自动将函数定义注入到模型 API 的tools参数中,并处理整个调用循环。


十三、Function Calling 原理与源码浅析

13.1 核心流程时序图

MyFunctionOpenAI APIOpenAiChatModelChatClientClientMyFunctionOpenAI APIOpenAiChatModelChatClientClientprompt().functions("xxx")call(prompt with tool definitions)POST /v1/chat/completions (tools)response: tool_callsapply(request)resultsecond request (tool result)final natural answercontent

13.2 源码解读(关键类)

  • FunctionCallbackWrapper:包装用户定义的 Function,提供名称、描述、输入输出类型的 Schema。
  • DefaultFunctionCallbackResolver:从 Spring Context 中查找@Description注解的 Bean,自动生成 Tool 定义。
  • AbstractToolCallSupport(在OpenAiChatModel父类中):负责检测响应中是否有tool_calls,若有则循环调用本地函数,并构造新请求再次发送。

核心代码片段(简化):

// 检测 tool callsif(response.hasToolCalls()){List<FunctionCallResult>results=invokeLocalFunctions(response.getToolCalls());// 将函数结果附加到 messages 中List<Message>newMessages=appendFunctionResultsToMessages(originalMessages,results);// 递归调用模型(最终轮次)returnthis.call(newPrompt(newMessages));}

正是这种精巧的设计,让开发者无需关注多轮交互,只需实现业务函数即可。


十四、Spring AI Alibaba AI 快速上手

阿里云百炼平台(灵积)提供了通义千问、通义万相等模型。Spring AI Alibaba 是其官方 adapter。

14.1 添加依赖

<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M2</version></dependency>

14.2 配置

spring:ai:dashscope:api-key:${DASHSCOPE_API_KEY}chat:options:model:qwen-max

14.3 使用

API 与 OpenAI 完全一致——只需替换依赖和配置,代码无需修改。这展现了 Spring AI 抽象层的强大。

@AutowiredprivateChatModelchatModel;// 实际注入的是 DashScopeChatModel// 后续用法与之前完全相同

总结

通过本文,你应当掌握了:

  • 核心术语(RAG、微调、函数调用)
  • Spring AI 的请求流转过程
  • 快速搭建一个具备流式响应、函数调用、多模态能力的智能应用
  • ChatModelChatClient的区别及选型建议
  • 文生图、语音等扩展 API
  • Function Calling 的实现原理与源码关键点
  • 如何切换到阿里灵积模型

Spring AI 仍在快速迭代中,但它已经展现出了成为 Java 生态中 AI 标准框架的潜力。建议读者在实际项目中大胆尝试,并关注社区最新进展。

📌 本文所有代码示例基于 Spring AI 0.8.1,Spring Boot 3.2。不同版本 API 可能微调,请以官方文档为准。


附录:推荐学习资源

  • Spring AI 官方文档
  • Spring AI Alibaba GitHub
  • OpenAI Function Calling 官方说明

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询