SpringAI-Prompts
官网地址:https://docs.spring.io/spring-ai/reference/api/prompt.html
1、描述
Prompts是引导LLM生成特定输出的输入,Prompt的设计和措辞显著影响LLM的响应
2、Prompt类
public class Prompt implements ModelRequest<List<Message>> {
private final List<Message> messages;
@Nullable
private ChatOptions chatOptions;
}
3、Message接口
封装了Prompt的文本内容,元数据属性集合以及消息分类
public interface Content {
String getText();
Map<String, Object> getMetadata();
}
public interface Message extends Content {
MessageType getMessageType();
}
Message接口的相关实现:

消息角色分为:
public enum MessageType {
USER("user"), // 用户角色
ASSISTANT("assistant"), // 系统角色
SYSTEM("system"), // 助手角色
TOOL("tool"); // 工具/函数角色
}
4、PromptTemplate(提示词模板)
主要用来创建结构化Prompt,然后将其发送到LLM。
主要方法:
- String render():将提示词模板渲染成最终字符串格式,无需外部输入,适用于没有占位符或动态内容的模板。
public static void main(String[] args) {
PromptTemplate build = PromptTemplate.builder().template("测试render()").build();
String render = build.render();
System.out.println(render);
}
// 输出:测试render()
- String render(Map<String, Object> model):增强渲染功能以包含动态内容。它使用 Map<String, Object>,其中映射键是提示词模板中的占位符名称,值是要插入的动态内容。
public static void main(String[] args) {
PromptTemplate promptTemplate = PromptTemplate.builder().template("测试render,{placeholder}").build();
String render = promptTemplate.render(Map.of("placeholder", "占位符"));
System.out.println(render);
// 输出:测试render,占位符
}
- Message createMessage():创建不带额外数据的 Message 对象,用于静态或预定义的消息内容,创建的是UserMessage
public static void main(String[] args) {
PromptTemplate promptTemplate = PromptTemplate.builder().template("测试createMessage").build();
Message message = promptTemplate.createMessage();
System.out.println(message);
// 输出:UserMessage{content='测试createMessage', metadata={messageType=USER}, messageType=USER}
}
- Message createMessage(List
mediaList):创建包含静态文本和媒体内容的 Message 对象。
public static void main(String[] args) {
PromptTemplate promptTemplate = PromptTemplate.builder().template("测试createMessage").build();
Resource resource = new FileSystemResource("/Users/cmc/Desktop/Snipaste_2025-12-17_10-52-29.png");
Media media = new Media(MediaType.IMAGE_PNG, resource);
Message message = promptTemplate.createMessage(List.of(media));
System.out.println(message);
}
- Message createMessage(Map<String, Object> model):扩展消息创建以集成动态内容,接受 Map<String, Object>,其中每个条目表示消息模板中的占位符及其对应的动态值。
public static void main(String[] args) {
// 1. 定义一个消息模板 (template)
// 注意:模板中的占位符格式为 `{key}`,例如 `{userName}`
String messageTemplate = """
你好,{userName}!欢迎回来。
根据记录,你所在的城市 {city} 今天的天气是 {weather}。
为你推荐今日活动:{activity}。
""";
PromptTemplate promptTemplate = PromptTemplate.builder().template(messageTemplate).build();
// 2. 准备数据模型 Map
// 键(userName, city等)必须与模板中的占位符名字一致
Map<String, Object> modelData = Map.of(
"userName", "张三", // 替换 {userName}
"city", "北京", // 替换 {city}
"weather", "晴朗,25摄氏度", // 替换 {weather}
"activity", "适合去公园散步" // 替换 {activity}
);
// 3. 核心:使用模板和数据模型创建 UserMessage
Message userMessage = promptTemplate.createMessage(modelData);
System.out.println(userMessage);
// 输出:UserMessage{content='你好,张三!欢迎回来。
// 根据记录,你所在的城市 北京 今天的天气是 晴朗,25摄氏度。
// 为你推荐今日活动:适合去公园散步。
// ', metadata={messageType=USER}, messageType=USER}
}
- Prompt create():生成不带外部数据输入的 Prompt 对象,适用于静态或预定义的提示词。
public static void main(String[] args) {
PromptTemplate promptTemplate = PromptTemplate.builder().template("测试创建prompt").build();
Prompt prompt = promptTemplate.create();
System.out.println(prompt);
}
// 输出:Prompt{messages=[UserMessage{content='测试创建prompt', metadata={messageType=USER}, messageType=USER}], modelOptions=null}
- Prompt create(ChatOptions modelOptions):生成不带外部数据输入且带有聊天请求特定选项的 Prompt 对象。
public static void main(String[] args) {
ChatOptions myOptions = ChatOptions.builder()
.temperature(0.7)
.topP(0.9)
.model("deepseek-r1:14b")
.build();
PromptTemplate promptTemplate = PromptTemplate.builder().template("测试创建prompt").build();
Prompt prompt = promptTemplate.create(myOptions);
System.out.println(prompt);
}
// 输出:Prompt{messages=[UserMessage{content='测试创建prompt', metadata={messageType=USER}, messageType=USER}], modelOptions=org.springframework.ai.chat.prompt.DefaultChatOptions@1b26f7b2}
- Prompt create(Map<String, Object> model):扩展提示词创建功能以包含动态内容,接受 Map<String, Object>,其中每个映射条目是提示词模板中的占位符及其关联的动态值。
public static void main(String[] args) {
// 1. 定义一个消息模板 (template)
// 注意:模板中的占位符格式为 `{key}`,例如 `{userName}`
String messageTemplate = """
你好,{userName}!欢迎回来。
根据记录,你所在的城市 {city} 今天的天气是 {weather}。
为你推荐今日活动:{activity}。
""";
PromptTemplate promptTemplate = PromptTemplate.builder().template(messageTemplate).build();
// 2. 准备数据模型 Map
// 键(userName, city等)必须与模板中的占位符名字一致
Map<String, Object> modelData = Map.of(
"userName", "张三", // 替换 {userName}
"city", "北京", // 替换 {city}
"weather", "晴朗,25摄氏度", // 替换 {weather}
"activity", "适合去公园散步" // 替换 {activity}
);
// 3. 核心:使用模板和数据模型创建 UserMessage
Prompt prompt = promptTemplate.create(modelData);
System.out.println(prompt);
// 输出:Prompt{messages=[UserMessage{content='你好,张三!欢迎回来。
// 根据记录,你所在的城市 北京 今天的天气是 晴朗,25摄氏度。
// 为你推荐今日活动:适合去公园散步。
// ', metadata={messageType=USER}, messageType=USER}], modelOptions=null}
}
- Prompt create(Map<String, Object> model, ChatOptions modelOptions):扩展提示词创建功能以包含动态内容,接受 Map<String, Object>,其中每个映射条目是提示词模板中的占位符及其关联的动态值,以及聊天请求的特定选项。
public static void main(String[] args) {
// 1. 定义一个消息模板 (template)
// 注意:模板中的占位符格式为 `{key}`,例如 `{userName}`
String messageTemplate = """
你好,{userName}!欢迎回来。
根据记录,你所在的城市 {city} 今天的天气是 {weather}。
为你推荐今日活动:{activity}。
""";
PromptTemplate promptTemplate = PromptTemplate.builder().template(messageTemplate).build();
// 2. 准备数据模型 Map
// 键(userName, city等)必须与模板中的占位符名字一致
Map<String, Object> modelData = Map.of(
"userName", "张三", // 替换 {userName}
"city", "北京", // 替换 {city}
"weather", "晴朗,25摄氏度", // 替换 {weather}
"activity", "适合去公园散步" // 替换 {activity}
);
ChatOptions myOptions = ChatOptions.builder()
.temperature(0.7)
.topP(0.9)
.model("deepseek-r1:14b")
.build();
// 3. 核心:使用模板和数据模型创建 UserMessage
Prompt prompt = promptTemplate.create(modelData, myOptions);
System.out.println(prompt);
}
使用自定义模板渲染,例如使用<>
PromptTemplate promptTemplate = PromptTemplate.builder()
.renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build())
.template("""
Tell me the names of 5 movies whose soundtrack was composed by <composer>.
""")
.build();
String prompt = promptTemplate.render(Map.of("composer", "John Williams"));
本文来自博客园,作者:0xCAFEBABE_001,转载请注明原文链接:https://www.cnblogs.com/0xcafebabe001/p/19357554

浙公网安备 33010602011771号