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();
相关推荐
松仔log43 分钟前
Kotlin中级——callbackFlow
java·前端·kotlin
知守观1 小时前
同一个团队两套分包:DDD 四层落地后,domain 层最大的类还是 5885 行
java·后端·领域驱动设计
文丑颜不良啊2 小时前
LeetCode2541~2560题目解析
java·leetcode
瑞雪兆丰年兮2 小时前
JavaWeb-day11-SpringBootWeb案例(文件上传)
java·运维·服务器·javaweb·oss
Highcharts.js2 小时前
Highcharts智能数据分析平台Orbit 多语言配置技术文档
java·前端·javascript·highcharts·orbit·智能数据分析·设置文档
Rain的Java大神之路2 小时前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试
SimonKing2 小时前
零配置也能白嫖前沿大模型!dsh-our-free-model插件真香警告
java·后端·程序员
nice_lcj5202 小时前
【从零理解 Spring AI · 15】让检索更准:先宽召回,再精排序
java·后端·rag·spring ai·ai应用开发·检索优化·重排序
杨凯凡4 小时前
Spring Boot 链路追踪实战:Micrometer、TraceId 与异步线程上下文传播
java·spring boot·后端
计算机毕设定制辅导-无忧学长4 小时前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台