【Spring AI快速上手 (一)】ChatModel与ChatCilent构建对话
一、前言
二、ChatModel与ChatCilent构建对话
ChatModel 实现
pom.xml
application.properties
阿里百炼平台
Deepseek
Ollama
ChatCilent 实现
application.properties
简单对话示例
系统提示词预设角色
格式化输出内容
一、前言
Spring AI详解:【Spring AI详解】开启Java生态的智能应用开发新时代(附不同功能的Spring AI实战项目)-CSDN博客
二、ChatModel与ChatCilent构建对话
ChatModel 实现
pom.xml
在 Maven 项目中,我们需要添加相关依赖来接入不同的 AI 模型服务:
DeepSeek 模型依赖:提供了与 DeepSeek AI 模型的集成支持
阿里云百炼模型依赖:包含与阿里云 DashScope 平台的集成组件
Ollama 模型依赖:支持本地运行的大模型服务
Web 相关依赖:构建 Web 应用的基础支持
测试相关依赖:提供单元测试和集成测试
<properties><!-- 定义Java版本为17,确保项目使用Java 17编译和运行 --><java.version>17</java.version>
</properties><!-- 依赖管理配置(BOM模式) -->
<dependencyManagement><dependencies><!-- 1. Spring AI Alibaba BOM --><!-- 功能:管理阿里云AI生态组件的版本(如Dashscope、百炼平台集成等) --><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><!-- 2. Spring AI BOM --><!-- 功能:管理Spring AI核心模块版本(ChatClient、RAG、工具调用等) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency><!-- 3. Spring Boot BOM --><!-- 功能:管理Spring Boot及其starter组件的版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.2.5</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><!-- ========== AI模型相关依赖 ========== --><!-- DeepSeek模型Starter --><!-- 提供与DeepSeek AI模型的集成支持 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-deepseek</artifactId></dependency><!-- 阿里云百炼模型Starter --><!-- 提供与阿里云百炼(DashScope)平台的集成支持 --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId></dependency><!-- 阿里云DashScope SDK核心库 --><!-- 版本号明确指定为2.20.6,提供与DashScope API的直接交互能力 --><dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.20.6</version></dependency><!-- Ollama模型Starter --><!-- 提供与Ollama本地大模型运行的集成支持 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency><!-- ========== Web相关依赖 ========== --><!-- Spring Boot Web Starter --><!-- 提供构建Web应用的基础支持,包括嵌入式Tomcat、Spring MVC等 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- ========== 测试相关依赖 ========== --><!-- Spring Boot Test Starter --><!-- 提供单元测试和集成测试支持,包括JUnit、Mockito、Spring Test等 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> <!-- 仅在测试时有效,不会打包到生产环境 --></dependency>
</dependencies>
application.properties
配置文件用于设置各 AI 服务的连接参数:
spring.ai.deepseek.api-key:DeepSeek 的 API 密钥
spring.ai.dashscope.api-key:阿里云百炼的 API 密钥
spring.ai.ollama.chat.model:Ollama 使用的模型
spring.application.name=quick-start#deepseek
spring.ai.deepseek.api-key= ${DEEP_SEEK_KEY}
spring.ai.deepseek.chat.options.model= deepseek-reasoner# ali百炼
spring.ai.dashscope.api-key=${ALI_AI_KEY}
#spring.ai.dashscope.chat.options.model=# ollama
# spring.ai.ollama.base-url=
spring.ai.ollama.chat.model= qwen3:4b
阿里百炼平台
// 导入阿里云AI相关类
import com.alibaba.cloud.ai.dashscope.api.DashScopeSpeechSynthesisApi;
import com.alibaba.cloud.ai.dashscope.audio.*;
import com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisPrompt;
import com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisResponse;
import com.alibaba.cloud.ai.dashscope.chat.*;
import com.alibaba.cloud.ai.dashscope.common.DashScopeApiConstants;
import com.alibaba.cloud.ai.dashscope.image.*;
import com.alibaba.dashscope.aigc.videosynthesis.*;
import com.alibaba.dashscope.exception.*;
import com.alibaba.dashscope.utils.JsonUtils;// 导入Spring AI相关类
import org.springframework.ai.audio.transcription.*;
import org.springframework.ai.chat.messages.*;
import org.springframework.ai.chat.model.*;
import org.springframework.ai.chat.prompt.*;
import org.springframework.ai.content.*;
import org.springframework.ai.image.*;// 其他导入
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.*;
import org.springframework.util.*;import java.io.*;
import java.net.*;
import java.nio.*;
import java.util.*;@SpringBootTest
public class TestALI {// ========== 1. 基础聊天功能测试 ==========@Testpublic void testQwen(@Autowired DashScopeChatModel dashScopeChatModel) {// 调用通义千问基础聊天模型String content = dashScopeChatModel.call("你好你是谁");System.out.println(content);}// ========== 2. 文生图功能测试 ==========@Testpublic void text2Img(@Autowired DashScopeImageModel imageModel) {// 配置图像生成选项DashScopeImageOptions imageOptions = DashScopeImageOptions.builder().withModel("wanx2.1-t2i-turbo") // 使用万相2.1极速版模型.build();// 生成图像ImageResponse imageResponse = imageModel.call(new ImagePrompt("一只白色小狗", imageOptions));// 获取结果String imageUrl = imageResponse.getResult().getOutput().getUrl();System.out.println(imageUrl); // 打印图片URL// 可选获取Base64编码// imageResponse.getResult().getOutput().getB64Json();}// ========== 3. 文本转语音测试 ==========@Testpublic void testText2Audio(@Autowired DashScopeSpeechSynthesisModel speechSynthesisModel)throws IOException {// 配置语音合成选项DashScopeSpeechSynthesisOptions options = DashScopeSpeechSynthesisOptions.builder().voice("longyingtian") // 使用"龙应天"音色.model("cosyvoice-v2") // 使用cosyvoice-v2模型.build();// 合成语音SpeechSynthesisResponse response = speechSynthesisModel.call(new SpeechSynthesisPrompt("你好,欢迎学习编程", options));// 保存为MP3文件File file = new File(System.getProperty("user.dir") + "/output.mp3");try (FileOutputStream fos = new FileOutputStream(file)) {ByteBuffer byteBuffer = response.getResult().getOutput().getAudio();fos.write(byteBuffer.array());}}// ========== 4. 语音转文本测试 ==========private static final String AUDIO_RESOURCES_URL ="https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav";@Testpublic void testAudio2Text(@Autowired DashScopeAudioTranscriptionModel transcriptionModel)throws MalformedURLException {// 配置语音识别选项DashScopeAudioTranscriptionOptions transcriptionOptions =DashScopeAudioTranscriptionOptions.builder().build();// 创建识别请求AudioTranscriptionPrompt prompt = new AudioTranscriptionPrompt(new UrlResource(AUDIO_RESOURCES_URL),transcriptionOptions);// 执行语音识别AudioTranscriptionResponse response = transcriptionModel.call(prompt);System.out.println(response.getResult().getOutput());}// ========== 5. 多模态图片理解测试 ==========@Testpublic void testMultimodal(@Autowired DashScopeChatModel dashScopeChatModel)throws MalformedURLException {// 加载图片资源var imageFile = new ClassPathResource("/files/xushu.png");Media media = new Media(MimeTypeUtils.IMAGE_JPEG, imageFile);// 配置多模态选项DashScopeChatOptions options = DashScopeChatOptions.builder().withMultiModel(true).withModel("qwen-vl-max-latest") // 使用VL多模态模型.build();// 创建多模态请求Prompt prompt = Prompt.builder().chatOptions(options).messages(UserMessage.builder().media(media).text("识别图片").build()).build();// 执行多模态理解ChatResponse response = dashScopeChatModel.call(prompt);System.out.println(response.getResult().getOutput().getText());}// ========== 6. 多模态语音理解测试 ==========@Testpublic void testMultimodalSpeechToText(@Autowired DashScopeChatModel dashScopeChatModel)throws MalformedURLException {// 加载音频资源(自行导入实现)var audioFile = new ClassPathResource("/files/hello.MP3");Media media = new Media(MimeTypeUtils.parseMimeType("audio/mpeg"), audioFile);// 配置多模态选项DashScopeChatOptions options = DashScopeChatOptions.builder().withMultiModel(true).withModel("qwen-omni-turbo") // 使用全能模型.build();// 创建多模态请求(指定消息格式为VIDEO)Prompt prompt = Prompt.builder().chatOptions(options).messages(UserMessage.builder().media(media).metadata(Map.of(DashScopeApiConstants.MESSAGE_FORMAT,MessageFormat.VIDEO)).text("识别语音文件").build()).build();// 执行多模态理解ChatResponse response = dashScopeChatModel.call(prompt);System.out.println(response.getResult().getOutput().getText());}// ========== 7. 文本转视频测试(dashscope-sdk-java依赖) ==========@Testpublic void text2Video() throws ApiException, NoApiKeyException, InputRequiredException {// 创建视频合成实例VideoSynthesis vs = new VideoSynthesis();// 配置视频合成参数VideoSynthesisParam param = VideoSynthesisParam.builder().model("wanx2.1-t2v-turbo") // 使用万相2.1视频模型.prompt("一只小猫在月光下奔跑").size("1280*720") // 视频分辨率.apiKey(System.getenv("ALI_AI_KEY")).build();System.out.println("please wait...");// 执行视频合成VideoSynthesisResult result = vs.call(param);System.out.println(result.getOutput().getVideoUrl());}
}
Deepseek
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.deepseek.DeepSeekAssistantMessage;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.deepseek.DeepSeekChatOptions;
import org.springframework.ai.deepseek.api.DeepSeekApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import reactor.core.publisher.Flux;import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;@SpringBootTest
public class TestDeepseek {/*** 测试基础对话功能* 使用DeepSeekChatModel的简单调用方式* @param deepSeekChatModel 自动注入的DeepSeek聊天模型*/@Testpublic void testDeepseek(@Autowired DeepSeekChatModel deepSeekChatModel) {// 直接调用模型获取响应String content = deepSeekChatModel.call("你好你是谁");System.out.println(content); // 打印模型响应}/*** 测试流式对话功能* 使用Flux实现流式响应* @param deepSeekChatModel 自动注入的DeepSeek聊天模型*/@Testpublic void testDeepseekStream(@Autowired DeepSeekChatModel deepSeekChatModel) {// 获取流式响应Flux<String> stream = deepSeekChatModel.stream("你好你是谁");// 将流转换为可迭代对象并逐个打印stream.toIterable().forEach(System.out::println);}/*** 测试推理模型(deepseek-reasoner)的思维链输出* 获取模型推理过程中的中间思考过程* @param deepSeekChatModel 自动注入的DeepSeek聊天模型*/@Testpublic void testDeepseekReasoning(@Autowired DeepSeekChatModel deepSeekChatModel) {// 创建Prompt对象Prompt prompt = new Prompt("你好你是谁");// 获取完整响应ChatResponse response = deepSeekChatModel.call(prompt);// 转换为DeepSeek专用消息类型以获取推理内容DeepSeekAssistantMessage assistantMessage = (DeepSeekAssistantMessage)response.getResult().getOutput();// 打印思维链(Chain of Thought)内容System.out.println(assistantMessage.getReasoningContent());System.out.println("-----------------------------------------");// 打印最终响应文本System.out.println(assistantMessage.getText());}/*** 测试流式推理功能* 结合流式响应和思维链输出* @param deepSeekChatModel 自动注入的DeepSeek聊天模型*/@Testpublic void testDeepseekStreamReasoning(@Autowired DeepSeekChatModel deepSeekChatModel) {// 获取流式响应Flux<ChatResponse> stream = deepSeekChatModel.stream(new Prompt("你好你是谁"));// 第一部分:打印思维链内容stream.toIterable().forEach(chatResponse -> {DeepSeekAssistantMessage assistantMessage = (DeepSeekAssistantMessage)chatResponse.getResult().getOutput();System.out.println(assistantMessage.getReasoningContent());});System.out.println("-----------------------------------------");// 第二部分:打印最终响应文本stream.toIterable().forEach(chatResponse -> {DeepSeekAssistantMessage assistantMessage = (DeepSeekAssistantMessage)chatResponse.getResult().getOutput();System.out.println(assistantMessage.getText());});}/*** 测试聊天选项配置* 演示如何通过DeepSeekChatOptions控制模型行为* @param chatModel 自动注入的DeepSeek聊天模型*/@Testpublic void testChatOptions(@Autowired DeepSeekChatModel chatModel) {// 构建模型选项DeepSeekChatOptions options = DeepSeekChatOptions.builder().model("deepseek-chat") // 指定模型//.maxTokens(5) // 可设置最大token数.stop(Arrays.asList(",")) // 设置停止序列.temperature(2.0) // 设置温度参数(0-2).build();// 创建带选项的PromptPrompt prompt = new Prompt("请写一句诗描述清晨。", options);// 获取模型响应ChatResponse res = chatModel.call(prompt);// 打印结果System.out.println(res.getResult().getOutput().getText());}
}
Ollama
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.content.Media;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.model.ollama.autoconfigure.OllamaChatProperties;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.MimeTypeUtils;
import reactor.core.publisher.Flux;@SpringBootTest
public class TestOllama {@Testpublic void testOllama(@Autowired OllamaChatModel ollamaChatModel) {///no_think (关闭思考模式)System.out.println(ollamaChatModel.call("你好你是谁?/no_think"));}@Testpublic void testDeepseekStream(@Autowired OllamaChatModel ollamaChatModel) {Flux<String> stream = ollamaChatModel.stream("你好你是谁");stream.toIterable().forEach(System.out::println);}/*** 多模态 图像识别, 采用的gemma3* @param ollamaChatModel*/@Testpublic void testMultimodality(@Autowired OllamaChatModel ollamaChatModel) {var imageResource = new ClassPathResource("files/xushu.png");OllamaOptions ollamaOptions = OllamaOptions.builder().model("gemma3").build();Media media = new Media(MimeTypeUtils.IMAGE_PNG, imageResource);ChatResponse response = ollamaChatModel.call(new Prompt(UserMessage.builder().media(media).text("识别图片").build(),ollamaOptions));System.out.println(response.getResult().getOutput().getText());}
}
ChatCilent 实现
application.properties
spring.application.name=client-dome# ali百炼
spring.ai.dashscope.api-key=${ALI_AI_KEY}
#spring.ai.dashscope.chat.options.model=
简单对话示例
@SpringBootTest
public class TestChatClient {/*** 测试同步聊天客户端* 演示基本的请求-响应式交互* * @param chatClientBuilder 自动注入的ChatClient构建器*/@Testpublic void testChatClient(@Autowired ChatClient.Builder chatClientBuilder) {// 1. 使用构建器创建ChatClient实例ChatClient chatClient = chatClientBuilder.build();// 2. 构建并执行聊天请求String content = chatClient.prompt().user("你好") // 设置用户输入消息.call() // 同步调用AI模型.content(); // 获取响应内容// 3. 打印完整响应System.out.println(content);}/*** 测试流式聊天客户端* 演示流式响应处理,适合长文本或实时交互场景* * @param chatClientBuilder 自动注入的ChatClient构建器*/@Testpublic void testStreamChatClient(@Autowired ChatClient.Builder chatClientBuilder) {// 1. 使用构建器创建ChatClient实例ChatClient chatClient = chatClientBuilder.build();// 2. 构建并执行流式聊天请求Flux<String> content = chatClient.prompt().user("你好") // 设置用户输入消息.stream() // 使用流式调用.content(); // 获取响应流// 3. 处理流式响应content.toIterable() // 将响应流转换为可迭代对象.forEach(s -> System.out.println(s)); // 逐块打印响应}
}
系统提示词预设角色
为 ChatClient 设置默认的系统提示词,定义 AI 角色和行为规范。
在系统提示词中使用参数化模板,动态插入用户信息。
将系统提示词嵌入用户消息中发送,实现更灵活的提示词控制。
从资源文件加载系统提示词模板,便于管理和维护复杂的提示词。
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;@SpringBootTest
public class TestPrompt {/*** 测试系统提示词 - 预设角色* 演示如何为ChatClient设置默认的系统提示词* * @param chatClientBuilder 自动注入的ChatClient构建器*/@Testpublic void testSystemPrompt(@Autowired ChatClient.Builder chatClientBuilder) {// 1. 使用构建器创建ChatClient实例并设置默认系统提示词ChatClient chatClient = chatClientBuilder.defaultSystem("""# 角色说明你是一名专业法律顾问AI……## 回复格式1. 问题分析2. 相关依据3. 梳理和建议**特别注意:**- 不承担律师责任。- 不生成涉敏、虚假内容。""").build();// 2. 构建并执行聊天请求String content = chatClient.prompt().user("你好") // 设置用户输入消息.call() // 同步调用AI模型.content(); // 获取响应内容// 3. 打印完整响应System.out.println(content);}/*** 测试提示词模板 - 带参数的默认系统提示词* 演示如何在系统提示词中使用参数化模板* * @param chatClientBuilder 自动注入的ChatClient构建器*/@Testpublic void testSystemPromptTemplate(@Autowired ChatClient.Builder chatClientBuilder) {// 1. 创建ChatClient并设置带参数的默认系统提示词ChatClient chatClient = chatClientBuilder.defaultSystem("""# 角色说明你是一名专业法律顾问AI……## 回复格式1. 问题分析2. 相关依据3. 梳理和建议**特别注意:**- 不承担律师责任。- 不生成涉敏、虚假内容。当前服务的用户:姓名:{name},年龄:{age},性别:{sex}""").build();// 2. 构建请求并传入参数值String content = chatClient.prompt().system(p -> p.param("name", "小小").param("age", "18").param("sex", "男")) // 为系统提示词传参.user("你好") // 用户消息.call().content();System.out.println(content);}/*** 测试伪系统提示词 - 将系统提示词嵌入用户消息* 演示如何将系统提示词作为用户消息的一部分发送* * @param chatClientBuilder 自动注入的ChatClient构建器*/@Testpublic void testSystemPromptTemplate2(@Autowired ChatClient.Builder chatClientBuilder) {// 1. 创建基础ChatClient(不设置默认系统提示词)ChatClient chatClient = chatClientBuilder.build();// 2. 构建请求,在用户消息中嵌入完整的提示词模板String content = chatClient.prompt().system(p -> p.param("name", "小小").param("age", "18").param("sex", "男")) // 系统参数.user(u -> u.text(""" # 角色说明你是一名专业法律顾问AI……## 回复格式1. 问题分析2. 相关依据3. 梳理和建议**特别注意:**- 不承担律师责任。- 不生成涉敏、虚假内容。回答用户的法律咨询问题{question} """).param("question", "被裁的补偿金")) // 用户消息模板+参数.call().content();System.out.println(content);}/*** 测试外部提示词文件 - 从资源文件加载系统提示词* 演示如何从外部文件加载提示词模板* * @param chatClientBuilder 自动注入的ChatClient构建器* @param systemResource 从classpath加载的提示词文件资源*/@Testpublic void testSystemPromptTemplate(@Autowired ChatClient.Builder chatClientBuilder,@Value("classpath:/files/prompt.st") Resource systemResource) {// 1. 创建ChatClient并从文件加载默认系统提示词ChatClient chatClient = chatClientBuilder.defaultSystem(systemResource) // 从文件加载提示词.build();// 2. 构建请求并传入参数String content = chatClient.prompt().system(p -> p.param("name", "小小").param("age", "18").param("sex", "男")) // 系统参数.user("你好") // 用户消息.call().content();System.out.println(content);}
}
格式化输出内容
让 AI 模型返回简单的布尔值结果,用于判断用户意图等场景。
从非结构化文本中提取结构化数据,如地址信息等。
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Map;@SpringBootTest
public class TestStructuredOut {// 声明ChatClient用于与AI模型交互ChatClient chatClient;/*** 初始化方法,在每个测试方法前执行* @param chatModel 自动注入的DashScopeChatModel实例*/@BeforeEachpublic void init(@Autowired DashScopeChatModel chatModel) {// 使用建造者模式创建ChatClient实例chatClient = ChatClient.builder(chatModel).build();}/*** 测试布尔值结构化输出* 演示如何让AI模型返回简单的布尔值结果*/@Testpublic void testBoolOut() {// 使用ChatClient构建请求,指定系统提示词和用户输入Boolean isComplain = chatClient.prompt().system("""请判断用户信息是否表达了投诉意图?只能用 true 或 false 回答,不要输出多余内容""") // 严格限制输出格式.user("你好!") // 用户输入文本.call() // 执行调用.entity(Boolean.class); // 将响应转换为Boolean类型// 根据返回的布尔值进行分支处理if (Boolean.TRUE.equals(isComplain)) {System.out.println("用户是投诉,转接人工客服!");} else {System.out.println("用户不是投诉,自动流转客服机器人。");// 可以继续调用客服ChatClient进行后续对话}}/*** 定义地址记录类* 用于接收结构化输出的地址信息*/public record Address(String name, // 收件人姓名String phone, // 联系电话String province, // 省String city, // 市String district, // 区/县String detail // 详细地址) {}/*** 测试实体类结构化输出* 演示如何从非结构化文本中提取结构化数据*/@Testpublic void testEntityOut() {// 使用ChatClient构建请求,从文本中提取地址信息Address address = chatClient.prompt().system("""请从下面这条文本中提取收货信息,""") // 系统指令.user("收货人:张三,电话13588888888,地址:浙江省杭州市西湖区文一西路100号8幢202室") // 包含地址信息的文本.call() // 执行调用.entity(Address.class); // 将响应转换为Address类型System.out.println(address); // 打印提取的结构化地址信息}/*** 定义演员电影记录类* 用于接收结构化输出的电影信息*/public record ActorsFilms(String actor,String film1,String film2,String film3,String film4,String film5) {}/*** 测试底层实体类结构化输出* 演示使用BeanOutputConverter进行更精细的控制* @param chatModel 自动注入的DashScopeChatModel实例*/@Testpublic void testLowEntityOut(@Autowired DashScopeChatModel chatModel) {// 创建BeanOutputConverter实例,指定目标类型为ActorsFilmsBeanOutputConverter<ActorsFilms> beanOutputConverter =new BeanOutputConverter<>(ActorsFilms.class); // 使用BeanOutputConverter进行结构化输出// 获取格式指令,这将指导AI模型如何格式化输出String format = beanOutputConverter.getFormat(); // 获取JSON Schema格式指令String actor = "周星驰";// 构建提示词模板,包含占位符String template = """提供5部{actor}导演的电影.{format}"""; // 提示词模板包含格式占位符// 创建PromptTemplate实例并替换变量PromptTemplate promptTemplate = PromptTemplate.builder().template(template).variables(Map.of("actor", actor, "format", format)).build(); // 构建提示词模板// 调用模型获取响应ChatResponse response = chatModel.call(promptTemplate.create());// 使用转换器将模型输出转换为目标类型ActorsFilms actorsFilms = beanOutputConverter.convert(response.getResult().getOutput().getText()); // 转换模型输出为Java对象System.out.println(actorsFilms); // 打印结构化电影信息}
}
下一篇:【Spring AI快速上手 (二)】Advisor实现对话上下文管理-CSDN博客
实战示例:【Spring AI实战】实现仿DeepSeek页面对话机器人_spring ai flux<string>返回-CSDN博客【Spring AI实战】实现仿DeepSeek页面对话机器人(支持多模态上传)_多模态大模型怎么传图片springai-CSDN博客
本文全面介绍了 Spring AI 框架的各种功能和应用场景,通过实际代码示例演示了如何接入不同的大模型服务并实现多样化的 AI 能力。开发者可以根据实际需求选择合适的模型和服务,快速构建智能应用。Spring AI 的标准化接口设计大大降低了 AI 集成的复杂度,为 Java 生态的智能应用开发开启了新时代。
有任何问题或建议欢迎评论区留言讨论!