欢迎来到《Spring AI 零基础到实战》的第 4 节在上一节中我们通过 System 参数成功给大模型赋予了各种有趣的灵魂与人设。但在真实的 Java 企业级开发中用户的输入是千变万化的我们总不能每次都用String的号去死磕长篇大论的提示词吧在传统的开发中字符串拼接代码又臭又长极易漏掉空格或标点。String.format()满屏的%s变量一旦变多传参简直是灾难。强耦合几百字的业务提示词和 Java 逻辑混写在一起前端改个文案都需要后端重新发版为了解决这个史诗级痛点Spring AI 引入了杀手锏——PromptTemplate(提示词模板)**。它的核心思想和我们熟悉的 Freemarker、MyBatis 动态 SQL 一模一样**将“静态文本”与“动态变量”彻底解耦今天我们就来彻底打通大模型输入端的任督二脉甚至教你如何让 AI “长出眼睛”来看懂图片本节章节目标底层解构深入理解Prompt与Message的核心架构看透 Spring AI 的参数封装哲学。模板魔法掌握PromptTemplate使用 JavaMap优雅地进行占位符替换。资源解耦将超长提示词外置为.st文件实现业务代码与 AI 文案的彻底分离。多模态识图打破纯文本边界使用Media接口实现上传图片并让 AI 进行视觉分析。核心原理Prompt 渲染引擎在动手敲代码前我们可以通过下方的图直观地感受一下一段包含占位符的文本是如何与 Java 的 Map 变量结合最终变成大模型能听懂的终极指令的Prompt 到底是个啥在前面两节中我们一直用ChatClient.user(...)进行无脑调用。扒开 Spring AI 的源码我们会发现大模型通信的最基本单元是一个叫做Prompt的对象。//见org.springframework.ai.chat.client.DefaultChatClientUtilsstatic ChatClientRequest toChatClientRequest(DefaultChatClient.DefaultChatClientRequestSpec inputRequest) { // ..... return ChatClientRequest.builder().prompt(Prompt.builder().messages(processedMessages).chatOptions(processedChatOptions).build()).context(new ConcurrentHashMap(inputRequest.getAdvisorParams())).build(); }Prompt就像是一个包裹里面装了两样最核心的东西ListMessage消息列表。包含了我们在上一节讲的SystemMessage人设、UserMessage提问等。ChatOptions模型请求参数。比如Temperature、MaxTokens。注PromptTemplate的作用就是帮我们优雅地动态生成这个Prompt中的Message对象。PromptTemplate 实战演练让我们来看看在 Spring AI 中如何优雅地进行变量绑定。场景一直接对话在日常开发中我们通常直接利用ChatClient提供的 Fluent API 来无缝集成模板渲染。默认情况下占位符使用{变量名}。如下我们通过两种方式来进行展示/** * 使用常规方法指定 * param subject * param message * return */GetMapping(/api/teacher)public String teacher(RequestParam String subject, RequestParam String message) { // 1. 定义包含 {占位符} 的纯文本模板 String systemTemplate 现在你是一名{subject}老师。; returnthis.chatClient.prompt() // 2. 注入 System 模板并通过 .param() 绑定 Map 变量 .system(sp - sp.text(systemTemplate) .param(subject, subject)) // 3. User 消息同理也可以用模板 .user(message) .call() .content();}/** * 使用Prompt直接定义 * param subject * param message * return */GetMapping(/api/teacher2)public String teacher2(RequestParam String subject, RequestParam String message) { // 1、构建用户信息 UserMessage userMessage UserMessage.builder().text(message).build(); // 2、使用模版创建系统信息 String systemTemplate 现在你是一名{subject}老师。; SystemPromptTemplate systemPromptTemplate SystemPromptTemplate.builder() .template(systemTemplate) .variables(Map.of(subject, subject)) .build(); Message systemMessage systemPromptTemplate.createMessage(); // 3、构建messageList Prompt prompt Prompt.builder() .messages(Arrays.asList(userMessage, systemMessage)) .build(); return chatClient .prompt(prompt) .call() .content();}请求http://localhost:8080/api/teacher?subject数学message你是谁或http://localhost:8080/api/teacher2?subject数学message你是谁你将会得到AI的回复如下我是你的数学老师专门帮你解决数学问题、讲解概念、辅导作业或者一起探讨有趣的数学话题。如果你有题目不会做、公式不理解或者想挑战一些数学难题随时告诉我我们一起搞定 场景二自定义占位符符号有时候我们的提示词里本身就包含大量的{}比如要求 AI 输出 JSON 格式这时候如果占位符还是{}Spring AI 的解析器就会彻底懵圈。 别慌我们可以自定义分隔符/** * 自定义占位符 * param subject * return */GetMapping(/api/placeholder)public String writePoem(RequestParam String subject) { PromptTemplate promptTemplate PromptTemplate.builder() .renderer(StTemplateRenderer.builder().startDelimiterToken().endDelimiterToken().build()) .template( 你是一个subject老师 ) .build(); Message message promptTemplate.createMessage(Map.of(subject, 美术)); return message.getText();}场景三将提示词外置为.st文件 (推荐)当提示词达到几百字甚至上千字时比如构建 RAG 知识库或复杂 Agent必须将文本从 Java 代码中抽离。Spring AI 原生支持读取.st(StringTemplate) 资源文件。1. 在src/main/resources/prompts/目录下新建expert.st你是一个专业的 {role}。你的核心任务是{task}。绝对遵守以下约束1. 不要捏造事实。2. 必须以 {format} 的格式输出。2. 在 Java 中通过Value优雅注入并使用Value(classpath:prompts/expert.st) private Resource expertPromptResource; GetMapping(/api/expert) public String useResourceTemplate() { returnthis.chatClient.prompt() // 直接传入 Resource 对象 .system(sp - sp.text(expertPromptResource) .param(role, Java 性能调优专家) .param(task, 分析长 GC 暂停的原因) .param(format, Markdown 列表)) .user(我的系统经常出现 5 秒以上的 STW请问怎么排查) .call() .content(); }至此你的 Java 代码中再也没有冗长的脏文本架构彻底清爽多模态识图 (Vision) 实战大模型不仅能处理文本现代大模型如 GPT-4o, 通义千问-VL早就具备了**多模态Multi-modal**能力。在 Spring AI 中让 AI 识别图片简直易如反掌。核心在于Media对象。我们可以将图片与UserMessage组合在一起发送给大模型。假设你在src/main/resources/下有一张图片叫tupian.jpg/** * 图片识别使用的是gpt-4o也可以使用本地的ollama 部署的qwen3.5 * return */ GetMapping(/api/image-vision) public String testImageVision() { // 1. 从 classpath 读取本地图片资源 Resource imageResource new ClassPathResource(tupian.jpg); // 2. 构建多模态 UserMessage UserMessage userMessage UserMessage.builder() .text(查看这张图的内容) .media(Media.builder() .mimeType(MimeTypeUtils.IMAGE_JPEG) // 指定媒体类型 .data(imageResource) // 塞入图片数据 .build()) .build(); // 3. 封装进 Prompt 并发送给大模型 Prompt prompt new Prompt(userMessage); return chatClient .prompt(prompt) .call() .content(); }注意请确保你配置的底层大模型支持视觉能力如gpt-4o或qwen-vl或 本地ollama部署的开源模型有了这个能力你可以轻松开发出“发票识别报销系统”、“花草识别小程序”等炫酷应用写好 System Prompt 的 CRISPE 原则Prompt 模板再好用里面填的内容如果是垃圾AI 产出的也是垃圾Garbage In, Garbage Out。在企业级开发中请务必遵循以下CRISPE 原则或核心 4 要素来编写你的.st模板Role (角色设定)你是谁例如你是一个严谨的法务顾问。Task (任务目标)你要做什么例如审查以下合同文本中的霸王条款。Constraints (约束条件)防幻觉的核心例如如果遇到不确定的法律条款必须回答“建议咨询专业律师”严禁自行捏造法条。Format (输出格式)期望结果长什么样例如请输出 JSON 格式包含 {条款内容, 风险等级}。总结本节课我们彻底告别了丑陋的字符串拼接。通过学习 Spring AI 的PromptTemplate和.st资源文件机制我们实现了提示词文案与业务逻辑的完美解耦。同时我们还突破了文本的界限利用Media接口赋予了 AI“看图说话”的视觉能力。这一切都为我们后续构建企业级复杂的 RAG检索增强生成知识库打下了极其坚实的基础。但是问题又来了在当前的演示中AI 无论多聪明返回给我们的始终是一大长串String字符串。在前后端分离的现代化开发中前端需要的是规规矩矩的JSON对象比如{ name: 张三, age: 18 }难道我们要用正则表达式去从 AI 的回答里苦哈哈地抠取数据吗下节预告千万不要用正则去解析 AI 的回答在第 5 节《让 AI 懂规矩Spring AI 结构化输出 (DTO) 映射与 Flux 流式打字机极速响应》中你将见证 Spring AI 最惊艳的功能之一。我们将学习如何让 AI 直接返回一个完美的Java DTO / List对象彻底打通 AI 与传统业务系统如存入数据库的最后一公里以及通过流式输出缓解等待焦虑。这里给大家精心整理了一份全面的AI大模型学习资源包括AI大模型全套学习路线图从入门到实战、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等资料免费分享扫码免费领取全部内容1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 2026行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。7. 资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容
Java 程序员的 AI 转型第四课:告别硬编码!Spring AI 提示词模板 (Prompt) 注入与多模态识图全攻略
欢迎来到《Spring AI 零基础到实战》的第 4 节在上一节中我们通过 System 参数成功给大模型赋予了各种有趣的灵魂与人设。但在真实的 Java 企业级开发中用户的输入是千变万化的我们总不能每次都用String的号去死磕长篇大论的提示词吧在传统的开发中字符串拼接代码又臭又长极易漏掉空格或标点。String.format()满屏的%s变量一旦变多传参简直是灾难。强耦合几百字的业务提示词和 Java 逻辑混写在一起前端改个文案都需要后端重新发版为了解决这个史诗级痛点Spring AI 引入了杀手锏——PromptTemplate(提示词模板)**。它的核心思想和我们熟悉的 Freemarker、MyBatis 动态 SQL 一模一样**将“静态文本”与“动态变量”彻底解耦今天我们就来彻底打通大模型输入端的任督二脉甚至教你如何让 AI “长出眼睛”来看懂图片本节章节目标底层解构深入理解Prompt与Message的核心架构看透 Spring AI 的参数封装哲学。模板魔法掌握PromptTemplate使用 JavaMap优雅地进行占位符替换。资源解耦将超长提示词外置为.st文件实现业务代码与 AI 文案的彻底分离。多模态识图打破纯文本边界使用Media接口实现上传图片并让 AI 进行视觉分析。核心原理Prompt 渲染引擎在动手敲代码前我们可以通过下方的图直观地感受一下一段包含占位符的文本是如何与 Java 的 Map 变量结合最终变成大模型能听懂的终极指令的Prompt 到底是个啥在前面两节中我们一直用ChatClient.user(...)进行无脑调用。扒开 Spring AI 的源码我们会发现大模型通信的最基本单元是一个叫做Prompt的对象。//见org.springframework.ai.chat.client.DefaultChatClientUtilsstatic ChatClientRequest toChatClientRequest(DefaultChatClient.DefaultChatClientRequestSpec inputRequest) { // ..... return ChatClientRequest.builder().prompt(Prompt.builder().messages(processedMessages).chatOptions(processedChatOptions).build()).context(new ConcurrentHashMap(inputRequest.getAdvisorParams())).build(); }Prompt就像是一个包裹里面装了两样最核心的东西ListMessage消息列表。包含了我们在上一节讲的SystemMessage人设、UserMessage提问等。ChatOptions模型请求参数。比如Temperature、MaxTokens。注PromptTemplate的作用就是帮我们优雅地动态生成这个Prompt中的Message对象。PromptTemplate 实战演练让我们来看看在 Spring AI 中如何优雅地进行变量绑定。场景一直接对话在日常开发中我们通常直接利用ChatClient提供的 Fluent API 来无缝集成模板渲染。默认情况下占位符使用{变量名}。如下我们通过两种方式来进行展示/** * 使用常规方法指定 * param subject * param message * return */GetMapping(/api/teacher)public String teacher(RequestParam String subject, RequestParam String message) { // 1. 定义包含 {占位符} 的纯文本模板 String systemTemplate 现在你是一名{subject}老师。; returnthis.chatClient.prompt() // 2. 注入 System 模板并通过 .param() 绑定 Map 变量 .system(sp - sp.text(systemTemplate) .param(subject, subject)) // 3. User 消息同理也可以用模板 .user(message) .call() .content();}/** * 使用Prompt直接定义 * param subject * param message * return */GetMapping(/api/teacher2)public String teacher2(RequestParam String subject, RequestParam String message) { // 1、构建用户信息 UserMessage userMessage UserMessage.builder().text(message).build(); // 2、使用模版创建系统信息 String systemTemplate 现在你是一名{subject}老师。; SystemPromptTemplate systemPromptTemplate SystemPromptTemplate.builder() .template(systemTemplate) .variables(Map.of(subject, subject)) .build(); Message systemMessage systemPromptTemplate.createMessage(); // 3、构建messageList Prompt prompt Prompt.builder() .messages(Arrays.asList(userMessage, systemMessage)) .build(); return chatClient .prompt(prompt) .call() .content();}请求http://localhost:8080/api/teacher?subject数学message你是谁或http://localhost:8080/api/teacher2?subject数学message你是谁你将会得到AI的回复如下我是你的数学老师专门帮你解决数学问题、讲解概念、辅导作业或者一起探讨有趣的数学话题。如果你有题目不会做、公式不理解或者想挑战一些数学难题随时告诉我我们一起搞定 场景二自定义占位符符号有时候我们的提示词里本身就包含大量的{}比如要求 AI 输出 JSON 格式这时候如果占位符还是{}Spring AI 的解析器就会彻底懵圈。 别慌我们可以自定义分隔符/** * 自定义占位符 * param subject * return */GetMapping(/api/placeholder)public String writePoem(RequestParam String subject) { PromptTemplate promptTemplate PromptTemplate.builder() .renderer(StTemplateRenderer.builder().startDelimiterToken().endDelimiterToken().build()) .template( 你是一个subject老师 ) .build(); Message message promptTemplate.createMessage(Map.of(subject, 美术)); return message.getText();}场景三将提示词外置为.st文件 (推荐)当提示词达到几百字甚至上千字时比如构建 RAG 知识库或复杂 Agent必须将文本从 Java 代码中抽离。Spring AI 原生支持读取.st(StringTemplate) 资源文件。1. 在src/main/resources/prompts/目录下新建expert.st你是一个专业的 {role}。你的核心任务是{task}。绝对遵守以下约束1. 不要捏造事实。2. 必须以 {format} 的格式输出。2. 在 Java 中通过Value优雅注入并使用Value(classpath:prompts/expert.st) private Resource expertPromptResource; GetMapping(/api/expert) public String useResourceTemplate() { returnthis.chatClient.prompt() // 直接传入 Resource 对象 .system(sp - sp.text(expertPromptResource) .param(role, Java 性能调优专家) .param(task, 分析长 GC 暂停的原因) .param(format, Markdown 列表)) .user(我的系统经常出现 5 秒以上的 STW请问怎么排查) .call() .content(); }至此你的 Java 代码中再也没有冗长的脏文本架构彻底清爽多模态识图 (Vision) 实战大模型不仅能处理文本现代大模型如 GPT-4o, 通义千问-VL早就具备了**多模态Multi-modal**能力。在 Spring AI 中让 AI 识别图片简直易如反掌。核心在于Media对象。我们可以将图片与UserMessage组合在一起发送给大模型。假设你在src/main/resources/下有一张图片叫tupian.jpg/** * 图片识别使用的是gpt-4o也可以使用本地的ollama 部署的qwen3.5 * return */ GetMapping(/api/image-vision) public String testImageVision() { // 1. 从 classpath 读取本地图片资源 Resource imageResource new ClassPathResource(tupian.jpg); // 2. 构建多模态 UserMessage UserMessage userMessage UserMessage.builder() .text(查看这张图的内容) .media(Media.builder() .mimeType(MimeTypeUtils.IMAGE_JPEG) // 指定媒体类型 .data(imageResource) // 塞入图片数据 .build()) .build(); // 3. 封装进 Prompt 并发送给大模型 Prompt prompt new Prompt(userMessage); return chatClient .prompt(prompt) .call() .content(); }注意请确保你配置的底层大模型支持视觉能力如gpt-4o或qwen-vl或 本地ollama部署的开源模型有了这个能力你可以轻松开发出“发票识别报销系统”、“花草识别小程序”等炫酷应用写好 System Prompt 的 CRISPE 原则Prompt 模板再好用里面填的内容如果是垃圾AI 产出的也是垃圾Garbage In, Garbage Out。在企业级开发中请务必遵循以下CRISPE 原则或核心 4 要素来编写你的.st模板Role (角色设定)你是谁例如你是一个严谨的法务顾问。Task (任务目标)你要做什么例如审查以下合同文本中的霸王条款。Constraints (约束条件)防幻觉的核心例如如果遇到不确定的法律条款必须回答“建议咨询专业律师”严禁自行捏造法条。Format (输出格式)期望结果长什么样例如请输出 JSON 格式包含 {条款内容, 风险等级}。总结本节课我们彻底告别了丑陋的字符串拼接。通过学习 Spring AI 的PromptTemplate和.st资源文件机制我们实现了提示词文案与业务逻辑的完美解耦。同时我们还突破了文本的界限利用Media接口赋予了 AI“看图说话”的视觉能力。这一切都为我们后续构建企业级复杂的 RAG检索增强生成知识库打下了极其坚实的基础。但是问题又来了在当前的演示中AI 无论多聪明返回给我们的始终是一大长串String字符串。在前后端分离的现代化开发中前端需要的是规规矩矩的JSON对象比如{ name: 张三, age: 18 }难道我们要用正则表达式去从 AI 的回答里苦哈哈地抠取数据吗下节预告千万不要用正则去解析 AI 的回答在第 5 节《让 AI 懂规矩Spring AI 结构化输出 (DTO) 映射与 Flux 流式打字机极速响应》中你将见证 Spring AI 最惊艳的功能之一。我们将学习如何让 AI 直接返回一个完美的Java DTO / List对象彻底打通 AI 与传统业务系统如存入数据库的最后一公里以及通过流式输出缓解等待焦虑。这里给大家精心整理了一份全面的AI大模型学习资源包括AI大模型全套学习路线图从入门到实战、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等资料免费分享扫码免费领取全部内容1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 2026行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。7. 资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容