Spring AI 2.0:Prompt

一、简介

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();
相关推荐
九皇叔叔10 分钟前
【09】SpringBoot4 MyBatisPlus 增删改查(CRUD)
java·mybatis·mybatisplus
白杨尚青39 分钟前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
anew___1 小时前
《从零手写操作系统 (11):文件系统初探——initrd与VFS抽象层》
java·javascript·算法
天天向上2911 小时前
Spring AI 实战:14 个踩坑记录,其中一个让我的测试全绿但产品是坏的
java·开源
测试运维日常笔记1 小时前
大模型应用专项测试指南:从 Prompt、RAG 到 Agent 的完整链路
前端·prompt
正在走向自律1 小时前
从只写接口到独立交付前后端,飞算JavaAI能给Java后端工程师多少溢价?
java·springboot·ai编程·全栈开发·java求职·飞算javaai·金九银十
后端LV1 小时前
一个注解不用写,给你的 Spring Boot 接口加上限流、日志、指标和钉钉告警
spring
a努力。2 小时前
LangChain Agent消息链路全解析
java·前端·javascript
SL_staff2 小时前
物模型是设备的数字身份证:属性、事件、服务如何决定IoT系统扩展性
java·物联网·全栈
资深技术分享员2 小时前
Geejing WebBuilder 日志、在线用户、系统监控,出问题时的三个第一现场
java·运维·数据库