如何使用Spring AI提示词模板PromptTemplate
目录
如何使用Spring AI提示词模板PromptTemplate
1、提示词Prompt介绍
2、Spring Boot集成Spring AI框架
3、提示词模板PromptTemplate用法
4、开发代码使用PromptTemplate
5、启动Springboot工程并验证
本文章节介绍Prompt提示词和PromptTemplate提示词模板,在Spring AI框架里,Prompt类的设计旨在简化与LLM之间的交互过程,同时提供了足够的灵活性来满足不同类型的对话需求。通过合理利用Prompt及其内部的消息结构,开发者可以有效地引导LLM生成高质量的回答,提升用户体验。
欢迎关注我的公众号
1、提示词Prompt介绍
Prompt 是引导 AI 模型生成特定输出的输入格式,Prompt 的设计和措辞会显著影响模型的响应。
Prompt 最开始只是简单的字符串,随着时间的推移,prompt 逐渐开始包含特定的占位符,例如 AI 模型可以识别的 “USER:”、“SYSTEM:” 等。阿里云通义模型可通过将多个消息字符串分类为不同的角色,然后再由 AI 模型处理,为 prompt 引入了更多结构。每条消息都分配有特定的角色,这些角色对消息进行分类,明确 AI 模型提示的每个部分的上下文和目的。这种结构化方法增强了与 AI 沟通的细微差别和有效性,因为 prompt 的每个部分在交互中都扮演着独特且明确的角色。
Prompt 中的主要角色(Role)包括:
-
系统角色(System Role):指导 AI 的行为和响应方式,设置 AI 如何解释和回复输入的参数或规则。这类似于在发起对话之前向 AI 提供说明。
-
用户角色(User Role):代表用户的输入 - 他们向 AI 提出的问题、命令或陈述。这个角色至关重要,因为它构成了 AI 响应的基础。
-
助手角色(Assistant Role):AI 对用户输入的响应。这不仅仅是一个答案或反应,它对于保持对话的流畅性至关重要。通过跟踪 AI 之前的响应(其“助手角色”消息),系统可确保连贯且上下文相关的交互。助手消息也可能包含功能工具调用请求信息。它就像 AI 中的一个特殊功能,在需要执行特定功能(例如计算、获取数据或不仅仅是说话)时使用。
-
工具/功能角色(Tool/Function Role):工具/功能角色专注于响应工具调用助手消息返回附加信息。
2、Spring Boot集成Spring AI框架
如何基于Springboot集成Spring AI框架,并调用阿里云AI服务,请参考文章Spring AI Alibaba入门示例,这里不再重复说明。
3、提示词模板PromptTemplate用法
在Spring AI框架中,Prompt类用于构建和管理与大型语言模型(LLM)交互时所需的提示词(prompt)。通过创建一个Prompt对象,并向其中添加用户消息(userMessage)和系统消息(systemMessage),你可以定义与LLM对话的上下文和规则。具体来说,Prompt prompt = new Prompt(List.of(userMessage, systemMessage));这种提示词模板的用法有如下好处:
1)多轮对话支持
List.of(userMessage, systemMessage)构建了一个包含多个消息项的不可变列表。每个消息项代表对话中的一个回合,可以是用户输入或系统响应。
通过这种方式,开发者可以在一次请求中传递多条历史对话记录给LLM,帮助其更好地理解当前对话的背景信息,从而生成更连贯、更准确的回答。
2)角色区分
在多轮对话中,明确区分哪些是用户发出的消息(userMessage),哪些是由系统(如AI助手)产生的消息(systemMessage),有助于LLM正确地模拟对话角色,提供更加自然的交互体验。
这种做法对于实现复杂的对话逻辑特别有用,比如客服机器人、虚拟助手等应用场景。
3)上下文设定
systemMessage可以用来设置对话的整体语境或规则,例如指定回答风格、领域知识范围等。这对于确保LLM生成的内容符合特定要求非常重要。
例如,如果希望LLM以专业且礼貌的方式回应,则可以在systemMessage中加入相应的指示。
4)动态调整
使用List.of()构造函数使得每次构建Prompt对象时都可以灵活地传入不同的消息组合,便于根据实际需求动态调整对话内容。
开发者可以根据用户的实时反馈或其他条件变化,适时更新对话上下文,使LLM能够适应不断变化的对话场景。
4、开发代码使用PromptTemplate
在springboot项目中,创建一个普通 Controller Bean类,并使用PromptTemplate提示词模板技术跟AI大模型进行对话 。
package com.wcy.ai.controller;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* @desc 提示词模板
* @date: 2025/3/11
* @version: 1.0
*/
@RestController
@RequestMapping("/ai")
public class PromptTemplateController {
private final ChatClient chatClient;
public PromptTemplateController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/prompt")
public AssistantMessage prompt(@RequestParam(value = "topic", defaultValue = "西游记") String topic) {
PromptTemplate promptTemplate = new PromptTemplate("请给我讲一个关于{topic}主题的故事");
Prompt prompt = promptTemplate.create(Map.of( "topic", topic));
AssistantMessage message = chatClient.prompt(prompt)
.call().chatResponse().getResult().getOutput();
System.out.println(message);
return message;
}
@GetMapping("/prompt2")
public AssistantMessage prompt2(
@RequestParam(value = "topic", defaultValue = "西游记") String topic,
@RequestParam(value = "voice", defaultValue = "幽默") String voice) {
String userText = "请给我讲一个关于{topic}主题的故事";
PromptTemplate promptTemplate = new PromptTemplate(userText);
Message userMessage = promptTemplate.createMessage(Map.of("topic", topic));
String systemText = "你是一名擅长说书的先生,请你用 {voice} 的语言风格回复用户的请求。";
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
Message systemMessage = systemPromptTemplate.createMessage(Map.of("voice", voice));
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
AssistantMessage message = chatClient.prompt(prompt)
.call().chatResponse().getResult().getOutput();
System.out.println(message);
return message;
}
}
5、启动Springboot工程并验证
工程启动成功后,可以向大模型提问了。
简单的提示词验证,在浏览器地址栏输入:
http://localhost:8080/ai/prompt?topic=西游记
AI大模型回复:
{
"media": [],
"messageType": "ASSISTANT",
"metadata": {
"finishReason": "STOP",
"id": "89ed8ed8-f020-9dcc-a891-e914e0a38d90",
"messageType": "ASSISTANT",
"reasoningContent": "",
"role": "ASSISTANT"
},
"text": "从前,在一个遥远的村庄里,住着一位名叫小明的年轻人。他从小就对《西游记》的故事充满向往,特别是唐僧师徒四人历经九九八十一难取得真经的经历让他深感钦佩。他常常幻想自己也能踏上一场冒险之旅。
一天晚上,小明在家中看书时,突然一道金光闪过,一个神秘的老者出现在他的面前。老者自称是观世音菩萨座下的护法使者,特地来考验小明的勇气与智慧。他说:“你若能通过三重试炼,便可获得一次改变命运的机会。”
第一重试炼是“辨别真假”。在一片竹林中,小明遇到了两个一模一样的和尚,他们都说自己是真正的唐僧,并要求小明将手中的水葫芦交给自己。小明冷静思考后,发现其中一个和尚说话时总是在逃避问题,而另一个则坦然回答。最终,他选择了正确的唐僧。
第二重试炼是“克服恐惧”。小明被带到了一座黑暗的山洞,里面传来阵阵可怕的吼声。他鼓起勇气走进去,才发现那只是幻觉。原来,这正是为了测试他是否能够战胜内心的恐惧。
第三重试炼是“牺牲与坚持”。小明来到一条湍急的河边,必须用一块脆弱的小木板渡河,但每次尝试都会让木板裂开一点。就在他几乎放弃的时候,他意识到只要不急躁、一步步稳扎稳打,就能成功。最后,他终于安全抵达彼岸。
完成三重试炼后,老者露出了欣慰的笑容,告诉他:“你已经具备了成为英雄的品质。记住,真正的力量来自内心,而不是外物。”说完,老者消失不见,而小明也从梦中醒来。虽然一切似乎只是一场梦,但他的心境却发生了变化——更加坚定了追求梦想的决心。
从此以后,无论遇到什么困难,小明都会想起那晚的经历,用唐僧师徒的精神激励自己不断前行。",
"toolCalls": []
}
多个角色消息构成的提示词验证,在浏览器地址栏输入:
http://localhost:8080/ai/prompt2?topic=西游记&voice=幽默
AI大模型回复:
{
"media": [],
"messageType": "ASSISTANT",
"metadata": {
"finishReason": "STOP",
"id": "e01bc3da-2b35-9e8d-bedb-cb9cfc5b774c",
"messageType": "ASSISTANT",
"reasoningContent": "",
"role": "ASSISTANT"
},
"text": "各位看官,咱们今天就来说一段《西游记》里的趣事。话说唐僧师徒四人取经路上,遇到一座火焰山,那山热得连蚂蚁都得打着伞走。这孙悟空啊,本来想借芭蕉扇灭灭火,结果碰上了铁扇公主,这可闹出了不少笑话。
铁扇公主手里拿着一把大扇子,瞧着孙悟空就像看一只小猴子似的,说:“你这个猴头,找打呢!”悟空也不甘示弱,变出个大棒子,指着她说:“你这泼妇,快把扇子交出来!”俩人就这么你一言我一语地吵起来,那场面简直堪比菜市场。
后来呀,悟空用计谋骗来了假扇子,气得铁扇公主直跺脚,大喊:“好你个孙猴子,又耍诈!”最终还是靠智慧和勇气,师徒几人才顺利通过火焰山。这一路啊,笑料百出,但也充满了挑战与成长,正所谓“不经历风雨,怎能见彩虹”,哈哈哈!",
"toolCalls": []
}