【SpringAI第三章】聊天模型

张开发
2026/4/3 23:31:24 15 分钟阅读
【SpringAI第三章】聊天模型
3.1 概述Spring AI的聊天模型API为开发者提供了一条便捷通道能够将强大的AI驱动的聊天完成功能无缝集成到各类应用中。借助预先训练的语言模型如广为人知的GPT它能够依据用户输入生成自然流畅、类人化的回复。这一API不仅工作机制高效而且设计理念极为先进旨在实现简单易用与高度可移植性让开发者能以极少的代码改动在不同AI模型间自由切换充分契合Spring框架一贯秉持的模块化与可互换性原则。3.2 ChatClient接口ChatClient 是一个接口它定义了一个与聊天服务交互的客户端。这个接口主要用于创建聊天客户端对象设置请求规范以及发起聊天请求。3.2.1 实现简单的对话1. 需求用户输入设置用户消息的内容通过SpringBoot AI封装的方法向 AI 模型发送请求以字符串形式返回 AI 模型的响应。2. 编写Controller方法RestController public class ChatDeepSeekController { ​ private final ChatClient chatClient; ​ public ChatDeepSeekController(ChatClient.Builder chatClientBuilder) { this.chatClient chatClientBuilder.build(); } ​ GetMapping(/chat) public String chat(RequestParam(value msg,defaultValue 给我讲个笑话) String message) { //prompt:提示词 return this.chatClient.prompt() //用户输入的信息 .user(message) //请求大模型 .call() //返回文本 .content(); } }3. 总结ChatClient 接口提供了构建和配置聊天客户端对象的灵活性以及发起和处理聊天请求的能力。用户可以通过 ChatClient.Builder 来定制客户端的行为然后使用 prompt() 和 prompt(Prompt prompt) 方法设置请求规范最后通过 call() 方法发起聊天请求。3.2.2 实现角色预设1. 配置默认角色Configuration public class AIConfig { ​ Bean public ChatClient chatClient(ChatClient.Builder builder) { return builder.defaultSystem(你是一名Java后端工程师你精通Java开发 你的名字叫不想debug。).build(); } }2. 编写controllerRestController RequestMapping(/ai) public class AIController { ​ Autowired private ChatClient chatClient; ​ GetMapping(/chat) public String chat(RequestParam(value msg) String message) { return chatClient.prompt().user(message).call().content(); } }3.2.3 实现流式响应1. call和stream的区别1非流式输出 call等待大模型把回答结果全部生成后输出给用户2流式输出stream逐个字符输出一方面符合大模型生成方式的本质另一方面当模型推理效率不是很高时流式输出比起全部生成后再输出大大提高用户体验。2. 编写ControllerGetMapping(value /chat/stream,producestext/html;charsetUTF-8) public FluxString chatStream(RequestParam(value msg) String message) { return chatClient.prompt().user(message).stream().content(); }3.3 ChatModel接口3.3.1 概述ChatModel接口作为核心定义了与AI模型交互的基本方法。它继承自ModelPrompt, ChatResponse提供了两个重载的call方法public interface ChatModel extends ModelPrompt, ChatResponse { default String call(String message) {...} Override ChatResponse call(Prompt prompt); }在ChatModel接口中带有String参数的call()方法简化了实际的使用避免了更复杂的Prompt和 ChatResponse类的复杂性。但是在实际应用程序中更常见的是使用ChatResponse call()方法该方法采用Prompt实例并返回ChatResponse。我们使用的ChatClient底层是使用ChatModel作为属性的在初始化ChatClient的时候可以指定ChatModel这里我们直接看底层源码//ChatClient部分构造器代码 static ChatClient create(ChatModel chatModel) { return create(chatModel, ObservationRegistry.NOOP); }3.3.2 实现简单的对话RestController public class DeepSeekController { Autowired private ChatModel chatModel; GetMapping public String chat(RequestParam(msg)String msg) { return chatModel.call(msg); } GetMapping(/openai) public String openai(RequestParam(msg)String msg) { ChatResponse call chatModel.call( new Prompt( msg, OpenAiChatOptions.builder() //可以更换成其他大模型如Anthropic3ChatOptions亚马逊 .model(deepseek-chat) .temperature(0.8) .build() ) ); return call.getResult().getOutput().getContent(); } }3.3.3 提示词提示词是引导大模型生成特定输出的输入提示词的设计和措辞会极大地影响模型的响应结果Prompt 提示词是与模型交互的一种输入数据组织方式本质上是一种复合结构的输入在 prompt 我们是可以包含多组不同角色System、User、Aissistant等的信息。如何管理好 Prompt 是简化 AI 应用开发的关键环节。Spring AI 提供了 Prompt Template 提示词模板管理抽象开发者可以预先定义好模板并在运行时替换模板中的关键词。在 Spring AI 与大模型交互的过程中处理提示词首先要创建包含动态内容占位符 {占位符} 的模板然后这些占位符会根据用户请求或应用程序中的其他代码进行替换。在提示词模板中{占位符} 可以用 Map 中的变量动态替换。GetMapping(/prompt) public String prompt(RequestParam(name) String name, RequestParam(voice) String voice){ String userText 给我推荐三种美食 ; UserMessage userMessage new UserMessage(userText); String systemText 你是一个美食咨询助手可以帮助人们查询美食信息。 你的名字是{name}, 你应该用你的名字和{voice}的饮食习惯回复用户的请求。 ; SystemPromptTemplate systemPromptTemplate new SystemPromptTemplate(systemText); //替换占位符 Message systemMessage systemPromptTemplate .createMessage(Map.of(name, name, voice, voice)); Prompt prompt new Prompt(List.of(userMessage, systemMessage)); ListGeneration results chatModel.call(prompt).getResults(); return results.stream().map(x-x.getOutput().getContent()).collect(Collectors.joining()); }

更多文章