前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊Spring AI的Prompt

聊聊Spring AI的Prompt

原创
作者头像
code4it
发布于 2025-04-13 14:06:19
发布于 2025-04-13 14:06:19
6800
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下Spring AI的Prompt

Prompt

org/springframework/ai/chat/prompt/Prompt.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Prompt implements ModelRequest<List<Message>> {

	private final List<Message> messages;

	private ChatOptions chatOptions;

	public Prompt(String contents) {
		this(new UserMessage(contents));
	}

	public Prompt(Message message) {
		this(Collections.singletonList(message));
	}

	public Prompt(List<Message> messages) {
		this(messages, null);
	}

	public Prompt(Message... messages) {
		this(Arrays.asList(messages), null);
	}

	public Prompt(String contents, ChatOptions chatOptions) {
		this(new UserMessage(contents), chatOptions);
	}

	public Prompt(Message message, ChatOptions chatOptions) {
		this(Collections.singletonList(message), chatOptions);
	}

	public Prompt(List<Message> messages, ChatOptions chatOptions) {
		this.messages = messages;
		this.chatOptions = chatOptions;
	}

	public String getContents() {
		StringBuilder sb = new StringBuilder();
		for (Message message : getInstructions()) {
			sb.append(message.getText());
		}
		return sb.toString();
	}

	//......
}	

Prompt实现了ModelRequest方法,其getInstructions返回的类型为List<Message>,其getContents方法遍历getInstructions添加message.getText()

Message

org/springframework/ai/chat/messages/Message.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Message extends Content {

	/**
	 * Get the message type.
	 * @return the message type
	 */
	MessageType getMessageType();

}

MessageType

org/springframework/ai/chat/messages/MessageType.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum MessageType {

	/**
	 * A {@link Message} of type {@literal user}, having the user role and originating
	 * from an end-user or developer.
	 * @see UserMessage
	 */
	USER("user"),

	/**
	 * A {@link Message} of type {@literal assistant} passed in subsequent input
	 * {@link Message Messages} as the {@link Message} generated in response to the user.
	 * @see AssistantMessage
	 */
	ASSISTANT("assistant"),

	/**
	 * A {@link Message} of type {@literal system} passed as input {@link Message
	 * Messages} containing high-level instructions for the conversation, such as behave
	 * like a certain character or provide answers in a specific format.
	 * @see SystemMessage
	 */
	SYSTEM("system"),

	/**
	 * A {@link Message} of type {@literal function} passed as input {@link Message
	 * Messages} with function content in a chat application.
	 * @see ToolResponseMessage
	 */
	TOOL("tool");

	private final String value;

	MessageType(String value) {
		this.value = value;
	}

	public static MessageType fromValue(String value) {
		for (MessageType messageType : MessageType.values()) {
			if (messageType.getValue().equals(value)) {
				return messageType;
			}
		}
		throw new IllegalArgumentException("Invalid MessageType value: " + value);
	}

	public String getValue() {
		return this.value;
	}

}

MessageType定义了USER、SYSTEM、ASSISTANT、TOOL这几种类型

PromptTemplate

PromptTemplateMessageActions

org/springframework/ai/chat/prompt/PromptTemplateMessageActions.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface PromptTemplateMessageActions {

	Message createMessage();

	Message createMessage(List<Media> mediaList);

	Message createMessage(Map<String, Object> model);

}

PromptTemplateMessageActions定义了createMessage方法

PromptTemplateStringActions

org/springframework/ai/chat/prompt/PromptTemplateStringActions.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface PromptTemplateStringActions {

	String render();

	String render(Map<String, Object> model);

}

PromptTemplateStringActions定义了render方法,渲染为String类型

PromptTemplateChatActions

org/springframework/ai/chat/prompt/PromptTemplateChatActions.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface PromptTemplateChatActions {

	List<Message> createMessages();

	List<Message> createMessages(Map<String, Object> model);

}

PromptTemplateChatActions接口定义了createMessages方法,返回List<Message>

PromptTemplateActions

org/springframework/ai/chat/prompt/PromptTemplateActions.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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继承了PromptTemplateStringActions接口,它定义了create方法,用于创建Prompt

PromptTemplate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PromptTemplate implements PromptTemplateActions, PromptTemplateMessageActions {

	protected String template;

	protected TemplateFormat templateFormat = TemplateFormat.ST;

	private ST st;

	private Map<String, Object> dynamicModel = new HashMap<>();

	//......

	// Render Methods
	@Override
	public String render() {
		validate(this.dynamicModel);
		return this.st.render();
	}

	@Override
	public String render(Map<String, Object> model) {
		validate(model);
		for (Entry<String, Object> entry : model.entrySet()) {
			if (this.st.getAttribute(entry.getKey()) != null) {
				this.st.remove(entry.getKey());
			}
			if (entry.getValue() instanceof Resource) {
				this.st.add(entry.getKey(), renderResource((Resource) entry.getValue()));
			}
			else {
				this.st.add(entry.getKey(), entry.getValue());
			}

		}
		return this.st.render();
	}

	@Override
	public Message createMessage() {
		return new UserMessage(render());
	}

	@Override
	public Message createMessage(List<Media> mediaList) {
		return new UserMessage(render(), mediaList);
	}

	@Override
	public Message createMessage(Map<String, Object> model) {
		return new UserMessage(render(model));
	}

	@Override
	public Prompt create() {
		return new Prompt(render(new HashMap<>()));
	}

	@Override
	public Prompt create(ChatOptions modelOptions) {
		return new Prompt(render(new HashMap<>()), modelOptions);
	}

	@Override
	public Prompt create(Map<String, Object> model) {
		return new Prompt(render(model));
	}

	@Override
	public Prompt create(Map<String, Object> model, ChatOptions modelOptions) {
		return new Prompt(render(model), modelOptions);
	}

	//......		
}	

PromptTemplate实现了PromptTemplateActions、PromptTemplateMessageActions接口,其render使用了org.stringtemplate.v4.ST来渲染。 PromptTemplateStringActions专注于创建和渲染提示字符串,代表了提示生成的最基本形式。 PromptTemplateMessageActions专为通过生成和操作Message对象来创建提示而设计。 PromptTemplateActions旨在返回Prompt对象,该对象可以传递给ChatModel以生成响应。

SystemPromptTemplate

org/springframework/ai/chat/prompt/SystemPromptTemplate.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SystemPromptTemplate extends PromptTemplate {

	public SystemPromptTemplate(String template) {
		super(template);
	}

	public SystemPromptTemplate(Resource resource) {
		super(resource);
	}

	@Override
	public Message createMessage() {
		return new SystemMessage(render());
	}

	@Override
	public Message createMessage(Map<String, Object> model) {
		return new SystemMessage(render(model));
	}

	@Override
	public Prompt create() {
		return new Prompt(new SystemMessage(render()));
	}

	@Override
	public Prompt create(Map<String, Object> model) {
		return new Prompt(new SystemMessage(render(model)));
	}

}

SystemPromptTemplate继承了PromptTemplate,其createMessage返回的是SystemMessage

FunctionPromptTemplate

org/springframework/ai/chat/prompt/FunctionPromptTemplate.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FunctionPromptTemplate extends PromptTemplate {

	private String name;

	public FunctionPromptTemplate(String template) {
		super(template);
	}

}

FunctionPromptTemplate继承了PromptTemplate,它定义了一个name属性

ChatPromptTemplate

org/springframework/ai/chat/prompt/ChatPromptTemplate.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ChatPromptTemplate implements PromptTemplateActions, PromptTemplateChatActions {

	private final List<PromptTemplate> promptTemplates;

	public ChatPromptTemplate(List<PromptTemplate> promptTemplates) {
		this.promptTemplates = promptTemplates;
	}

	@Override
	public String render() {
		StringBuilder sb = new StringBuilder();
		for (PromptTemplate promptTemplate : this.promptTemplates) {
			sb.append(promptTemplate.render());
		}
		return sb.toString();
	}

	@Override
	public String render(Map<String, Object> model) {
		StringBuilder sb = new StringBuilder();
		for (PromptTemplate promptTemplate : this.promptTemplates) {
			sb.append(promptTemplate.render(model));
		}
		return sb.toString();
	}

	@Override
	public List<Message> createMessages() {
		List<Message> messages = new ArrayList<>();
		for (PromptTemplate promptTemplate : this.promptTemplates) {
			messages.add(promptTemplate.createMessage());
		}
		return messages;
	}

	@Override
	public List<Message> createMessages(Map<String, Object> model) {
		List<Message> messages = new ArrayList<>();
		for (PromptTemplate promptTemplate : this.promptTemplates) {
			messages.add(promptTemplate.createMessage(model));
		}
		return messages;
	}

	@Override
	public Prompt create() {
		List<Message> messages = createMessages();
		return new Prompt(messages);
	}

	@Override
	public Prompt create(ChatOptions modelOptions) {
		List<Message> messages = createMessages();
		return new Prompt(messages, modelOptions);
	}

	@Override
	public Prompt create(Map<String, Object> model) {
		List<Message> messages = createMessages(model);
		return new Prompt(messages);
	}

	@Override
	public Prompt create(Map<String, Object> model, ChatOptions modelOptions) {
		List<Message> messages = createMessages(model);
		return new Prompt(messages, modelOptions);
	}

}

ChatPromptTemplate实现了PromptTemplateActions, PromptTemplateChatActions接口,其构造器输入promptTemplates,其render方法遍历promptTemplates,挨个添加promptTemplate.render();其createMessages方法遍历promptTemplates,挨个添加promptTemplate.createMessage()

AssistantPromptTemplate

org/springframework/ai/chat/prompt/AssistantPromptTemplate.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AssistantPromptTemplate extends PromptTemplate {

	public AssistantPromptTemplate(String template) {
		super(template);
	}

	public AssistantPromptTemplate(Resource resource) {
		super(resource);
	}

	@Override
	public Prompt create() {
		return new Prompt(new AssistantMessage(render()));
	}

	@Override
	public Prompt create(Map<String, Object> model) {
		return new Prompt(new AssistantMessage(render(model)));
	}

	@Override
	public Message createMessage() {
		return new AssistantMessage(render());
	}

	@Override
	public Message createMessage(Map<String, Object> model) {
		return new AssistantMessage(render(model));
	}

}

AssistantPromptTemplate继承了PromptTemplate,其createMessage方法返回的是AssistantMessage

示例

PromptTemplate示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();

SystemPromptTemplate示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String userText = """
    Tell me about three famous pirates from the Golden Age of Piracy and why they did.
    Write at least a sentence for each pirate.
    """;

Message userMessage = new UserMessage(userText);

String systemText = """
  You are a helpful AI assistant that helps people find information.
  Your name is {name}
  You should reply to the user's request with your name and also in the style of a {voice}.
  """;

SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));

Prompt prompt = new Prompt(List.of(userMessage, systemMessage));

List<Generation> response = chatModel.call(prompt).getResults();

小结

Spring AI的Message定义了MessageType属性,它有USER、SYSTEM、ASSISTANT、TOOL这几种类型;PromptTemplate的createMessage方法返回的是UserMessage,SystemPromptTemplate的createMessage方法返回的是SystemMessage,AssistantPromptTemplate的createMessage方法返回的是AssistantMessage。SystemPromptTemplate及AssistantPromptTemplate都继承了PromptTemplate,其render方法使用了org.stringtemplate.v4.ST来渲染;ChatPromptTemplate则是聚合了一系列的promptTemplates。

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
three.js简单实现一个3D三角函数学习理解
1.Three.js简介 Three.js是一个基于JavaScript编写的开源3D图形库,利用WebGL技术在网页上渲染3D图形。它提供了许多高级功能,如几何体、纹理、光照、阴影等,以便开发者能够快速地创建复杂且逼真的3D场景。同时,Three.js还具有很好的跨平台和跨浏览器兼容性,让用户无需安装任何插件就可以在现代浏览器上观看3D内容。
曾高飞
2025/05/19
1050
从0到1搭建web三维智慧城市基础要素,three.js+mapbox智慧城市!
首先明确最终web三维智慧城市的形态,在最近的项目中,我们接触到了一个县级城市的web三维城市可视化。
geobuilding
2022/07/07
3.8K0
从0到1搭建web三维智慧城市基础要素,three.js+mapbox智慧城市!
告别2022,奔赴2023 three.js三维城市可视化漫游表达
效果预览 https://www.bilibili.com/video/BV1d84y1W7dN/ 城市模型下载地址 https://pan.baidu.com/s/1d1sV74ufeK2rEBZ
geobuilding
2023/01/05
1.3K0
告别2022,奔赴2023 three.js三维城市可视化漫游表达
【愚公系列】2023年08月 Three.js专题-相机
相机是一种用来记录图像或视频的设备。现代相机通常由镜头、图像传感器、取景器、快门和图像处理器等部件组成。相机可以拍摄各种类型的照片,包括家庭照片、肖像照片、风景照片、动物照片和艺术照片等。现在,许多相机还具有额外的功能,例如视频录制、自动对焦和无线连接等。随着技术的发展,相机变得更加便携和高质量,已成为记录和分享生活的重要工具。
愚公搬代码
2025/05/28
820
【愚公系列】2023年08月 Three.js专题-相机
三维城市生产工具geobuilding下载
2022年上半年,我们的某项目是一个小县城的三维城市可视化,但是建筑物数据是几乎是空白,问了几家公司费用都不低,于是开发了geobuilding这款工具。现在广泛应用于公司内部地理网格绘制,城市建筑数据生产。
geobuilding
2022/08/28
1.1K0
三维城市生产工具geobuilding下载
使用ThingJS在线开发完成3D地图自定义效果
好看的3D地图搭建出来,一定是要能为开发者所用与业务系统开发中才能真正地体现价值。基因于此,CityBuilder建立了与ThingJS的通道——直转ThingJS代码,支持将配置完成的3D地图一键转为代码,不仅减少开发者的工作量,还能作为非GISer开发者的地图教学工具,使一般开发者也能码出专业、炫酷的3D地图。
要不要吃火锅
2019/10/31
3.6K0
使用ThingJS在线开发完成3D地图自定义效果
基于WebGL无插件虚拟场景漫游关键技术(完整版)ThingJS
如果要构建一个具有交互性和拓展性的沉浸式漫游场景,常用到3DSMAX、three.js等软件技术,学习门槛较高;ThingJS可视化组件更加轻量化,B/S架构下的3D可视化应用构建更轻松,为不少企业客户降低了项目开发成本。
森友鹿锘
2020/12/16
6.5K0
基于WebGL无插件虚拟场景漫游关键技术(完整版)ThingJS
硬核看房利器——Web 全景的实现
疫情期间,打破社交距离限制的交互模式被推向前台,为不少行业的传统交易提供了想象的空间。
winty
2020/09/14
2.2K0
Geobuilding 是做什么用的?有那些使用场景?
2022年上半年,源自一个n线城市的三维城市可视化项目。但是建筑物数据是几乎是空白,问了几家公司费用数万,于是设计了geobuilding这款工具,解决了建筑物数据缺失的问题,保障了项目进度和交付任务。
geobuilding
2023/09/19
1.3K0
Geobuilding 是做什么用的?有那些使用场景?
三维场景中常用的路径动画
在三维场景中,除了用逼近真实的模型代表现实中的设备、标识物外,通常还会使用一些动画来表示模型在现实中一些行为和作用。常见的动画比如路径动画、旋转动画、发光动画、流动动画等。本文将为大家介绍几种常用的路径动画。首先,最简单的自然是直线路径动画。
用户3158888
2021/02/22
8180
从零开始学习3D可视化之摄像机
数字孪生可视化场景中的摄像机,与大家拍照时使用相机的功能相似,数字孪生可视化场景中用摄像机来确定观察 3D 场景的视角。摄像机包含两个重要的位置参数:镜头位置 position 和被拍摄物体的位置 target (又叫目标点)。
thingjs
2021/07/09
4960
三维可视化开发这事儿前端人员能搞定吗?
    url: 'https://www.thingjs.com/static/models/storehouse'    // 三维可视化场景地址
要不要吃火锅
2019/12/11
5730
三维可视化开发这事儿前端人员能搞定吗?
北京到上海,Three.js 旅行轨迹的可视化
最近从北京搬到了上海,开始了一段新的生活,算是人生中一个比较大的事件,于是特地用 Three.js 做了下可视化。
神说要有光zxg
2021/12/17
1.8K0
北京到上海,Three.js 旅行轨迹的可视化
Unity3D使用Cinemachine配合Timeline实现运镜效果
Unity3D中的插件Cinemachine高级虚拟摄像系统,配合Timeline时间轴一起使用,可以实现像电影级别的分镜等效果,这篇我们就继续用上个模拟收费通过的项目,在这个基础上使用Cinemachine配合Timeline实现一个运镜的效果。
Vaccae
2020/09/01
3.6K0
Unity3D使用Cinemachine配合Timeline实现运镜效果
你的登录界面不够花里胡哨,3D 版本的来了
今天分享一篇用three.js 做的登录网站,里面还用到了粒子特效,一个字就是酷炫😎 前言: 该篇文章用到的主要技术:vue3、three.js 我们先看看成品效果: 登录gif 图 座机小图预览: login2.gif 废话不多说,直接进入正题 Three.js的基础知识 想象一下,在一个虚拟的3D世界中都需要什么?「首先,要有一个立体的空间,其次是有光源,最重要的是要有一双眼睛」。下面我们就看看在three.js中如何创建一个3D世界吧! 创建一个场景 设置光源 创建相机,设置相机位置和相
程序员小猿
2021/11/23
1.1K0
threejs三维模型添加文字标签,及添加文字的方式介绍
上次在文章ThreeJS中三维世界坐标转换成二维屏幕坐标介绍了三维二维坐标的转换方法,今天结合一个用例具体说下用法。
程序你好
2021/07/23
23.3K0
threejs三维模型添加文字标签,及添加文字的方式介绍
我是如何用 Three.js 在三维世界建房子的(详细教程)
这两天用 Three.js 画了一个 3D 的房子,放了一个床进去,可以用鼠标和键盘控制移动,有种 3D 游戏的即视感。
神说要有光zxg
2021/12/10
5.4K0
我是如何用 Three.js 在三维世界建房子的(详细教程)
3D成像方法 汇总(原理解析)— 双目视觉、激光三角、结构光、ToF、光场、全息
这里要介绍的是真正的3D成像,得到物体三维的图形,是立体的图像。而不是利用人眼视觉差异的特点,错误感知到的假三维信息。
3D视觉工坊
2021/05/18
4.8K0
3D成像方法 汇总(原理解析)— 双目视觉、激光三角、结构光、ToF、光场、全息
第4章 三维空间的观察
在第一课里,我向您承诺过会对相机进行一些介绍,那么今天就是我履行诺言的时刻了。嘿,这一刻,有点激动,想到相机,大学时,一直想买一个单反,但是要1万多。工作后,当一个月的工资就能买一个单反时,内心充满了骄傲和自豪。所以,各位大大们,技术还是有用的,至少技术可以用来挣钱。
webvrmodel模型网
2023/01/11
9242
第4章 三维空间的观察
基于WebGL的3D可视化告警系统关键技术解析 ThingJS
WebGL是一种在网页浏览器中渲染3D图形的 JavaScript API,无需加装插件,只需编写网页代码即可实现3D图形的展示。WebGL技术相较于传统的Web3D技术有两大优点:第一,通过JavaScript脚本语言实现网络交互式三维动画制作,无需依赖任何浏览器插件;第二,WebGL基于底层的 OpenGL接口实现,具有底层图形硬件(GPU)加速功能。
森友鹿锘
2020/12/04
2.3K0
基于WebGL的3D可视化告警系统关键技术解析 ThingJS
推荐阅读
相关推荐
three.js简单实现一个3D三角函数学习理解
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • Prompt
    • Message
    • MessageType
  • PromptTemplate
    • PromptTemplateMessageActions
    • PromptTemplateStringActions
    • PromptTemplateChatActions
    • PromptTemplateActions
    • PromptTemplate
    • SystemPromptTemplate
    • FunctionPromptTemplate
    • ChatPromptTemplate
    • AssistantPromptTemplate
  • 示例
    • PromptTemplate示例
    • SystemPromptTemplate示例
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档