一、简介
Prompt 提示词分为系统提示词和用户提示词,提示词决定这回答的质量。
二、代码
系统提示出 system
- defaultSystem:表示系统默认提示词,针对整个ChatClient
- system:会话提示词,针对每次会话chat
java
ChatClient.builder(deepSeekChatModel)
.defaultSystem("""
# 角色
你是一个教育行业的只能小助手
# 要求
1. 永远讲中文
""")
.build();
java
chatClient.prompt()
.system("针对当前会话的系统提示出")
.user(message)
.stream()
.content()
SystemPromptTemplate:提示词模版,提示词中允许使用占位符参数 {xxx}
java
ChatClient.builder(deepSeekChatModel)
.defaultSystem("""
你是一个优秀的 {role}, 你擅长 {language} 。
""")
.build();
// 在 system 中传参
chatClient.prompt()
.system(p -> p.param("role", "程序员").param("language", "Java"))
.user(message)
.stream()
.content();
用户提示词 user
user用户提示词也支持占位符参数。
java
chatClient.prompt()
.user(p -> p.text("""
你是一个优秀的 {role}, 你擅长 {language} , {question}。
""".param("role", "程序员").param("language", "Java").param("question", message)))
.stream()
.content();
提示词对象 Prompt
java
// 用户消息
UserMessage userMessage = new UserMessage("介绍一下Spring AI");
// 组装Prompt
Prompt prompt = new Prompt(userMessage);
// 调用模型
ChatResponse response = chatModel.call(prompt);
// 获取AI文本结果
String content = response.getResult().getOutput().getText();
System.out.println(content);
java
// 系统设定:规定AI角色
SystemMessage systemMessage = new SystemMessage("你是一名Java工程师,回答尽量简短。");
UserMessage userMessage = new UserMessage("讲下什么是Prompt");
// 多条消息传入Prompt构造器
List<Message> messages = List.of(systemMessage, userMessage);
Prompt prompt = new Prompt(messages);
ChatResponse response = chatModel.call(prompt);
c
List<Message> history = new ArrayList<>();
history.add(new UserMessage("我叫张三"));
history.add(new AssistantMessage("你好张三,很高兴认识你"));
// 新一轮提问
history.add(new UserMessage("我叫什么名字"));
Prompt prompt = new Prompt(history);
ChatResponse resp = chatModel.call(prompt);
提示词模版 PromptTemplate
提示词过多,放在代码中维护不方便,可以将提示词放入到文件中维护,在企业中常放入到配置中心中(如Nacos)。
.st = StringTemplate 的缩写,是 Spring AI 官方约定的提示词模板文件后缀,对应内部 StTemplateRenderer 模板渲染器。路径一般放在:src/main/resources/prompts/xxx.st。模板内占位符语法:{变量名},运行时自动替换变量值。
- .st(推荐:需要变量渲染,SpringAI 模板)
- 用途:带占位符变量的 Prompt 模板,需要 {xxx} 动态填充参数
- SpringAI 会启用StTemplateRenderer解析文件,自动替换{变量}
- 适合:业务系统提示词、需要传参、工程化模板
- 文件内容可以写 markdown 格式文本,后缀依然用.st
- .st 里面字面量大括号{、}需要
转义; - IDE 不会识别 st 后缀,没有语法高亮,可以装 StringTemplate 插件;
- 修改.st文件,devtools 要开启,否则不会热加载,需要重启;
- .md(仅静态文本,不会做变量替换)
java
@Configuration
public class SpringAiConfig {
@Bean
public ChatClient chatClient(DeepSeekChatModel deepSeekChatModel,
@Value("classpath:/prompts/system-messages.st" Resource systemResource) {
return ChatClient.builder(deepSeekChatModel)
.defaultSystem(systemResource)
.build();
}
}
rc/main/resources/prompts/system-prompt.st
md
你是专业的{role},请根据{input}回答问题。
java
// 手动加载 resources/prompts/system-prompt.st
PromptTemplate promptTemplate = PromptTemplate.from("classpath:/prompts/system-prompt.st");
// 填充变量
Prompt prompt = promptTemplate.create(Map.of(
"role", "Java专家",
"input", "RocketMQ重试机制"
));
ChatResponse resp = chatClient.prompt(prompt).call();