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();
相关推荐
爱跳舞的烤冷面2 小时前
自学嵌入式第N天(Linux篇——文件编程)
java·开发语言·前端
怪奇云呼军2 小时前
闪电智能VoiceAgent 如何管理呼入、接听、桥接和挂断状态?
java·前端·网络·数据库·人工智能
Escalating_xu2 小时前
【Linux】进程间通信:从匿名管道、FIFO 到共享内存、消息队列与信号量
java·linux·面试
Patrick在香港2 小时前
Claude API 成本直降90%:Prompt Caching 提示词缓存 Python 实战
python·缓存·prompt
IT机器猫2 小时前
RabbitMQ基础二
java·spring boot·分布式·spring cloud·log4j·rabbitmq·springamqp
卷心菜的学习路2 小时前
基于 Spring Cloud Tencent 元数据路由实现个人开发泳道,告别频繁部署
java·spring cloud
tachibana22 小时前
怎么让大模型同时给意图节点打分
大数据·人工智能·ai·大模型·llm·prompt
她说可以呀2 小时前
Spring AI 常用 Advisor
人工智能·python·spring
xieliyu.3 小时前
UPD协议结构以及开发中注意事项
java·开发语言·笔记·java-ee
张宇Joaquin3 小时前
openEuler编译和更换内核的方法
java·linux·服务器