Spring AI 系列3: Promt提示词

article/2025/8/21 20:37:56

一、Promt提示词

Promt提示是引导 AI 模型生成特定输出的输入, 提示的设计和措辞会显著影响模型的响应。

在 Spring AI 中与 AI 模型交互的最低层级,处理提示有点类似于在 Spring MVC 中管理”视图”。 这涉及创建带有动态内容占位符的大段文本。 这些占位符随后会根据用户请求或应用程序中的其他代码进行替换。 另一个类比是包含某些表达式占位符的 SQL 语句。

随着 Spring AI 的发展,它将引入更高级别的与 AI 模型交互的抽象。 本节描述的基础类在其角色和功能上可以类比为 JDBC。 例如,ChatModel 类类似于 JDK 中的核心 JDBC 库。 ChatClient 类类似于 JdbcClient,它构建在 ChatModel 之上,并通过 Advisor 提供更高级的构造,能够考虑与模型的历史交互、用额外的上下文文档增强提示,并引入代理行为。

提示的结构在 AI 领域内随着时间的推移而演变。 最初,提示只是简单的字符串。 随着时间的推移,它们发展为包含特定输入占位符,如”USER:“,AI 模型能够识别。 OpenAI 通过在处理前将多条消息字符串分类为不同角色,为提示引入了更多结构。

prompt()这个无参数方法让您开始使用流畅 API,允许您构建用户、系统和其他提示部分。prompt(Prompt prompt)这个方法接受 Prompt 参数,让您传入使用 Prompt 的非流畅 API 创建的 Prompt 实例。prompt(String content)这是一个类似于前一个重载的便捷方法。它接受用户的文本内容。

二、Prompt  API 概述

2.1 、Prompt

通常会使用 ChatModel 的 call() 方法,该方法接受一个 Prompt 实例并返回一个 ChatResponse

Prompt 类作为有序 Message 对象序列和请求 ChatOptions 的容器。 每个 Message 在提示中都具有独特的角色,内容和意图各不相同。 这些角色可以包含多种元素,从用户提问到 AI 生成的响应,再到相关的背景信息。 这种安排使与 AI 模型的交互变得复杂且详细,因为提示由多个消息构建,每个消息在对话中扮演特定角色。

下面是 Prompt 类的简化版本,省略了构造函数和工具方法:

public class Prompt implements ModelRequest<List<Message>> {private final List<Message> messages;private ChatOptions chatOptions;
}

2.2、Message

Message 接口封装了提示的文本内容、元数据属性集合和称为 MessageType 的分类。

public interface Content {String getContent();Map<String, Object> getMetadata();
}public interface Message extends Content {MessageType getMessageType();
}

多模态消息类型还实现了 MediaContent 接口,提供 Media 内容对象列表。

public interface MediaContent extends Content {Collection<Media> getMedia();}

Message 接口有多种实现,对应于 AI 模型可以处理的不同类别的消息。 模型根据对话角色区分消息类别。

2.3 、 MessageType 消息角色

这些角色由 MessageType 有效映射。每条消息都被分配了一个特定角色。 这些角色对消息进行分类,为 AI 模型澄清每个提示片段的上下文和目的。 这种结构化方法增强了与 AI 的交流的细致性和有效性,因为提示的每一部分在交互中都扮演着独特且明确定义的角色。

系统角色

指导 AI 的行为和响应风格,设置参数或规则,规定 AI 如何解释和回复输入。类似于在开始对话前为 AI 提供指令。

用户角色

代表用户的输入——他们对 AI 的问题、命令或陈述。这个角色是基础,因为它构成了 AI 响应的依据。

助手角色

AI 对用户输入的响应。不仅仅是答案或反应,对于维持对话的流畅性至关重要。 通过跟踪 AI 先前的响应(其”助手角色”消息),系统确保交互的连贯性和上下文相关性。 助手消息还可能包含函数工具调用请求信息。 这就像 AI 的一个特殊功能,在需要时用于执行特定功能,如计算、获取数据或其他超出对话的任务。

工具/函数角色

工具/函数角色专注于响应工具调用助手消息时返回额外信息。

角色在 Spring AI 中以枚举方式表示

public enum MessageType {USER("user"),ASSISTANT("assistant"),SYSTEM("system"),TOOL("tool");...
}

2.4、PromptTemplate

Spring AI 中提示模板的关键组件是 PromptTemplate 类,旨在便于创建结构化提示,然后将其发送给 AI 模型进行处理。

public class PromptTemplate implements PromptTemplateActions, PromptTemplateMessageActions {// 其他方法后续讨论
}

该类使用 TemplateRenderer API 渲染模板。默认情况下,Spring AI 使用基于 Terence Parr 开发的开源 StringTemplate 引擎的 StTemplateRenderer 实现。模板变量由 {} 语法标识,但您也可以配置分隔符以使用其他语法。

public interface TemplateRenderer extends BiFunction<String, Map<String, Object>, String> {@OverrideString apply(String template, Map<String, Object> variables);}

Spring AI 使用 TemplateRenderer 接口处理变量到模板字符串的实际替换。 默认实现使用 StringTemplate。 如果需要自定义逻辑,您可以提供自己的 TemplateRenderer 实现。 对于不需要模板渲染的场景(例如模板字符串已完整),可以使用提供的 NoOpTemplateRenderer

PromptTemplate promptTemplate = PromptTemplate.builder().renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()).template("""告诉我 5 部由 <composer> 作曲的电影名称。""").build();String prompt = promptTemplate.render(Map.of("composer", "John Williams"));

该类实现的接口支持提示创建的不同方面:

  • PromptTemplateStringActions 专注于创建和渲染提示字符串,代表最基本的提示生成形式。

  • PromptTemplateMessageActions 针对通过生成和操作 Message 对象进行提示创建。

  • PromptTemplateActions 旨在返回 Prompt 对象,可传递给 ChatModel 以生成响应。

虽然这些接口在许多项目中可能不会被广泛使用,但它们展示了提示创建的不同方法。

实现的接口如下:

public interface PromptTemplateStringActions {String render();String render(Map<String, Object> model);}

PromptTemplateStringActions 方法

public interface PromptTemplateMessageActions {Message createMessage();Message createMessage(List<Media> mediaList);Message createMessage(Map<String, Object> model);}

PromptTemplateMessageActions 方法

public interface PromptTemplateActions extends PromptTemplateStringActions {Prompt create();Prompt create(ChatOptions modelOptions);Prompt create(Map<String, Object> model);Prompt create(Map<String, Object> model, ChatOptions modelOptions);}

PromptTemplateActions 方法

Prompt create():生成不带外部数据输入的 Prompt 对象,适用于静态或预定义的提示。
Prompt create(ChatOptions modelOptions):生成不带外部数据输入且带有特定聊天请求选项的 Prompt 对象。
Prompt create(Map<String, Object> model):扩展提示创建能力以包含动态内容,接受 Map<String, Object>,每个 map 条目是提示模板中的占位符及其关联的动态值。
Prompt create(Map<String, Object> model, ChatOptions modelOptions):扩展提示创建能力以包含动态内容,接受 Map<String, Object>,每个 map 条目是提示模板中的占位符及其关联的动态值,并带有特定的聊天请求选项。

2.5、示例用法

PromptTemplate promptTemplate = new PromptTemplate("Tell me a {adjective} joke about {topic}");Prompt prompt = promptTemplate.create(Map.of("adjective", adjective, "topic", topic));return chatModel.call(prompt).getResult();

三、构建提示(Prompt)的三种模式

提示是引导模型输出的关键,ChatClient支持三种构建方式,满足不同复杂度需求:

3.1、逐层构建(复杂场景)

显式添加系统消息、用户消息,支持动态参数替换:

String response = chatClient.prompt()  .system(s -> s.text("以{style}风格回答").param("style", "古风"))  // 系统消息含占位符  .user("解释什么是人工智能")  // 用户消息  .option(OpenAiChatOptions.builder().temperature(0.8).build())  // 模型参数(如OpenAI特有参数)  .call()  .content();  

优势:细粒度控制消息结构,支持多轮对话历史拼接。

3.2、预构建Prompt对象(批量处理)

适用于提示模板化场景,提前组装消息列表:

// 定义提示模板  
Prompt promptTemplate = Prompt.builder()  .systemMessage("你是一个幽默的助手")  .userMessage("讲一个{topic}相关的笑话")  .build();  // 运行时填充参数  
Prompt dynamicPrompt = promptTemplate.replaceParams(Map.of("topic", "程序员"));  
ChatResponse response = chatClient.prompt(dynamicPrompt).call().chatResponse();  

最佳实践:将常用提示模板存入数据库或配置中心,实现动态加载。

3.3、快捷方式(极简场景)

单行代码完成用户消息提交,适用于简单问答:

String answer = chatClient.prompt("如何煮咖啡").call().content();  

注意:此模式默认无系统消息,模型行为依赖其基础训练数据。


四、ChatClient响应处理:从文本到结构化数据

4.1、 获取完整元数据(性能监控和Token消耗计算)

通过chatResponse()获取包含令牌消耗、生成结果列表的完整响应:

ChatResponse response = chatClient.prompt()  .user("计算1+1等于多少")  .call()  .chatResponse();  System.out.println("总令牌数:" + response.getMetadata().getUsage().getTotalTokens());  
System.out.println("生成结果:" + response.getResults().get(0).getOutput());  

关键元数据:

  • totalTokens:请求+响应的总令牌数(影响调用成本)。

  • completionTokens:响应生成的令牌数。

  • promptTokens:提示内容的令牌数。

4.2、 自动映射Java对象(结构化输出)

通过entity()方法将模型输出转为自定义实体,需确保输出格式符合JSON规范:

// 定义目标实体  
record Recipe(String dish, List<String> ingredients) {}  // 生成食谱并映射  
Recipe salad = chatClient.prompt()  .user("生成一份蔬菜沙拉食谱,以JSON格式输出")  .call()  .entity(Recipe.class);  // 自动解析JSON为对象  System.out.println("菜名:" + salad.dish());  
System.out.println("食材:" + salad.ingredients());  

进阶技巧:结合StructuredOutputConverter自定义解析逻辑,处理非标准格式。


http://www.hkcw.cn/article/FpAdVebibB.shtml

相关文章

用 Python 模拟雪花飘落效果

用 Python 模拟雪花飘落效果 雪花轻轻飘落&#xff0c;给冬日带来一份浪漫与宁静。本文将带你用一份简单的 Python 脚本&#xff0c;手把手实现「雪花飘落效果」动画。文章深入浅出&#xff0c;零基础也能快速上手&#xff0c;完整代码仅需一个脚本文件即可运行。 目录 前言…

Linux `cp` 命令深度解析与高阶应用指南

Linux `cp` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似命令对比二、选项系统详解1. 基础选项矩阵2. 高阶选项说明三、高阶应用场景1. 企业数据备份2. 容器环境部署3. 系统安全审计四、特殊文件处理1. 符号链接处理2. 稀疏文件优化五、性能优化策略1. 大…

中国寻亲网宣布将关闭服务器 25年终落幕

近日,中国寻亲网发布公告称将于2025年7月15日起停止运行并关闭服务器。公告于2025年4月1日发布,内容提到根据公司股东大会决议,公司将停止全部业务并进行注销。自2025年5月1日起,中国寻亲网将不再发布新的寻亲信息,仅提供原有信息的更改服务,直至最终关闭。对于无法继续为…

Spring代理工厂类ProxyFactory作用以及实现原理

代理工厂类ProxyFactory AdvisedSupport&#xff08;代理配置信息类&#xff09;ProxyFactory&#xff08;代理工厂类&#xff09;小结测试 源码见&#xff1a;mini-spring 在 AOP&#xff08;面向切面编程&#xff09;中&#xff0c;Spring 支持两种常见的代理机制&#xff1a…

旺店通ERP集成金蝶ERP(金蝶EAS、KIS、K3、云星空、云星辰、云星瀚)

对接说明 旺店通ERP完成所有供应链业务单向同步到金蝶ERP进行成本核算和生成财务凭证&#xff1a; 旺店通ERP货品数据同步至金蝶ERP物料档案旺店通ERP供应商数据同步至金蝶ERP供应商档案旺店通ERP店铺数据同步至金蝶ERP客户档案旺店通ERP仓库数据同步至金蝶ERP仓库档案旺店通…

美国年轻人遭遇“求职寒冬” 就业市场冻结

5月23日,美国加利福尼亚州奥兰治,查普曼大学毕业生参加了毕业典礼。从5月到6月,美国大学迎来了毕业季。来自政府、研究机构和招聘平台的数据揭示了一个令年轻人不安的事实:求职者,尤其是职场新人,面临异常激烈的就业市场。CNBC报道指出,应届毕业生发现劳动力市场比几个月…

俄罗斯一副市长遭人肉炸弹袭击死亡 俄乌冲突背景下的悲剧

俄罗斯一副市长遭人肉炸弹袭击死亡 俄乌冲突背景下的悲剧!5月28日,俄罗斯斯塔夫罗波尔市副市长古尔齐耶夫遭遇爆炸袭击身亡。事发时,一名熟人走近古尔齐耶夫,随后该熟人携带的包发生爆炸。爆炸导致34岁的古尔齐耶夫和29岁的熟人身亡,这名男子在事发地附近租了一套公寓。古…

ArkUI(方舟UI框架)介绍

ArkUI&#xff08;方舟UI框架&#xff09;介绍 构建快速入门 使用ArkWeb构建页面

对话云蝠智能魏佳星:大模型呼叫如何重塑智能营销未来?

在数字化浪潮席卷全球的当下&#xff0c;智能营销已然成为企业角逐市场的关键 “武器”。而云蝠智能&#xff0c;作为行业内的 “弄潮儿”&#xff0c;正凭借创新技术引领着这一领域的变革。近日&#xff0c;我们有幸与云蝠智能创始人魏佳星展开深度对话&#xff0c;一同探寻云…

3条警犬退役训导员湿了眼眶 无言战友光荣卸甲

“立正!敬礼!”猎狐、涛涛、巴依从今天开始光荣退役。感谢它们用忠诚和无畏为昭通公安做出的突出贡献。近日,在云南省昭通市公安局警犬基地训练场上,民警辅警庄严敬礼,向三位特殊的战友——警犬“猎狐”“涛涛”“巴依”致以最高礼遇。这场催人泪下的退役仪式为它们的职业…

聊聊 Metasploit 免杀

各位小伙伴们&#xff0c;晚上好&#xff01; 咱们今天打开宵夜“安全食材箱”&#xff0c;聊聊渗透测试绕过杀毒&#xff08;免杀&#xff09;的那些门道。你可以把免杀理解为——深夜做宵夜时&#xff0c;家里有人睡觉&#xff0c;但你非得去厨房整点美食&#xff0c;还不能…

4 串电池保护芯片创芯微CM1341-DAT使用介绍

特性 专用于 4 串锂/铁/钠电池的保护芯片&#xff0c;内置有高精度电压检测电路和电流检测电路。通过检测各节电池的电压、充放电电流及温度等信息&#xff0c;实现电池过充电、过放电、均衡、断线、低压禁充、放电过电流、短路、充电过电流和过温保护等功能&#xff0c;放电过…

SAP销售订单批导创建

一、功能描述 用户导出极简的导入模板,并填写相关业务数据,后导入SAP,系统读取文件,并进行前端展示,通过程序进行测试执行,无误后保存生成的销售订单 二、FS简介 FS包含前端界面,功能设计与字段写入逻辑 前端界面 功能设计 写入字段 三、代码片段 获取ALV中的鼠…

【AI预测】5月30日尼克斯大战前瞻:东部黑马能否再下一城?

&#x1f3c0; 随着赛季进入白热化阶段&#xff0c;5月30日尼克斯的这场比赛注定焦点十足。作为东部近年来少有的“黑马型”球队&#xff0c;尼克斯用硬朗的防守和团队配合让人重新认识了这支老牌劲旅。 这篇文章&#xff0c;我们将从数据模型球员表现战术执行力三个维度&…

李翔担任北京女篮主教练 挖掘内部潜力

北京首钢篮球俱乐部于5月29日宣布,原北京首钢男篮助理教练李翔将担任北京首钢女篮主教练。在2024-2025赛季中国女子篮球联赛(WCBA)中,北京首钢女篮止步季后赛首轮,球队正积极备战全运会和新赛季的比赛。北京首钢篮球俱乐部常务副总经理张云松指出,任命李翔为女篮主教练旨…

永坤黄金出现大规模兑付异常 投资者损失惨重

5月15日,林明像往常一样打开永坤黄金的线上平台,点击“黄金提现”按钮。按照以往三年的操作,资金会在交易发生日后第三个工作日到账。然而到了5月20日,他的银行账户仍未收到款项。与此同时,投资者婷婷也被业务员告知她在线下购买的永坤黄金可能无法提取。2025年初,她在永…

《Pytorch深度学习实践》ch1-线性模型

------B站《刘二大人》 1.Machine Learning 训练集&#xff0c;测试集&#xff1b;开发集&#xff1a;将训练集拆分为&#xff08;训练集&#xff0c;开发集&#xff09;&#xff0c;用来测试泛化的能力&#xff0c;模型的评估&#xff1b;监督学习&#xff1a;利用一组已知类…

2025年数字经济与绿色金融国际会议:智能金融与可持续发展的创新之路

会议简介 第二届数字经济与绿色金融国际会议即将召开。本次盛会将聚集全球范围内的经济学家、金融科技专家、政策制定者及企业领袖&#xff0c;共同探讨数字经济发展趋势下绿色金融体系构建的关键议题。会议围绕如何利用大数据、区块链、云计算等前沿信息技术推动传统金融业转型…

区间DP概述(JAVA)

区间DP 概述例题例题一 更小的数例题二 能量项链 概述 区间DP和线性DP其实从代码角度来说就是遍历处理的顺序不一样 合并&#xff1a;即将两个或多个部分进行整合&#xff0c;也可以反过来&#xff1b; 特征&#xff1a;能将问题分解为能两两合并的形式&#xff1b; 求解&am…

申请美签学生:愤怒茫然, 所有准备瞬间归零

申请美签学生:愤怒茫然。当地时间5月28日,美国国务院发布一份声明称,将和美国国土安全部共同合作,着手撤销中国留学生的签证,包括在关键领域学习的学生。知悉后,直新闻记者林舒琪随即联系到了正在申请赴美留学、实习的中国学生,打了一通电话。愤怒、失望、沮丧这是我听到…