5-Prompt

1 核心概念和作用

定义:Prompt 是引导 AI 模型生成特定输出的输入,其设计和措辞直接影响模型响应。类比 Spring MVC 中的 “View” 或带占位符的 SQL 语句,支持动态内容替换。

核心组件:

  • Prompt:封装多个 Message 和 ChatOptions,作为与 AI 模型交互的基本输入单元。
  • Message:包含文本内容、元数据和角色(如用户、系统、助手),构成 Prompt 的基本元素。
  • PromptTemplate:模板引擎,支持动态生成 Prompt,替换占位符内容。

演进历程:从简单字符串发展为结构化消息集合,OpenAI 引入按角色分类的消息(如 USER、SYSTEM),提升交互精度。

2 Prompt 核心结构与接口

Prompt 类

1
2
3
4
public class Promp implements ModelRequest<List<Message>> {
private final List<Message> messages;
private ChatOptions chatOptions;
}
  • messages:消息列表,每个消息有明确角色(如用户、系统)。
  • chatOptions:模型请求参数(如温度、最大 token 数)。

Message 接口与实现

1
2
3
4
public interface Message extends Content {
MessageType getMessageType();
}
public enum MessageType { USER, ASSISTANT, SYSTEM, TOOL }

主要实现类:

  • UserMessage:用户输入消息(getMessageType() = USER)。
  • SystemMessage:系统指令消息(getMessageType() = SYSTEM)。
  • AssistantMessage:助手响应消息(getMessageType() = ASSISTANT,可包含工具调用)。
  • ToolResponseMessage:工具返回结果(getMessageType() = TOOL)。

多模态支持: MediaContent 接口支持附加媒体内容(如图像、音频)。

1
2
3
public interface MediaContent extends Content {
List<Media> getMedia();
}

消息角色与作用

  • System:设定 AI 行为和响应风格(如 “你是一个乐于助人的助手”)。
  • User:用户问题或指令(如 “中国的面积有多大”)。
  • Assistant:AI 历史响应,维持对话上下文。
  • Tool:工具调用结果或函数返回值(如计算结果、数据查询)。
1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
void test1(){
//创建用户消息
Message userMsg = new UserMessage("跟我讲讲著名的海盗吧。");
//创建系统消息(带模板变量)
SystemPromptTemplate sysTemplate = new SystemPromptTemplate("你是一个名叫 {name} 的助手,请以 {voice} 的风格回应。");
Message sysMsg = sysTemplate.createMessage(Map.of("name", "海盗机器人", "voice", "海盗"));
// 组装 Prompt
Prompt prompt = new Prompt(List.of(sysMsg, userMsg));
// 调用模型
String content = chatClient.prompt(prompt).call().content();
System.out.println(content);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void pt_system_prompting_1() {
String movieReview = chatClient
.prompt()
.system("将电影评论分为正面、中性或负面。仅返回大写标签。")
.user("""
评论:《她》是一项令人不安的研究,揭示了方向
如果允许人工智能继续发展,人类就会前进,
未经检查。这太令人不安了,我无法观看。
情绪:
""")
.options(ChatOptions.builder()
.temperature(1.0)
.topP(0.8)
.maxTokens(5)
.build())
.call()
.content();
System.out.println(movieReview);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
void pt_zero_shot() {
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}
Sentiment reviewSentiment = chatClient.prompt("""
将电影评论分为正面、中性或负面。
评论:《她》是一项令人不安的研究,揭示了方向
如果允许人工智能继续发展,人类就会前进,
未经检查。我希望有更多像这部杰作一样的电影。
情绪:
""")
.options(ChatOptions.builder()
.temperature(0.1)
.maxTokens(5)
.build())
.call()
.entity(Sentiment.class);
System.out.println("Output: " + reviewSentiment);
}

资源文件加载

创建对应的文件

1
2
3
你是一个有用的人工智能助手,可以帮助人们查找信息。
您的名字是{name}
你应该用你的名字和{voice}的风格回复用户的请求。

从类路径加载模板文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Value("classpath:/prompt/system-message.st")
private Resource systemResource;

@Test
void test6() {
String userText = """
请给我讲讲海盗黄金时代的三位著名海盗,以及他们为什么这么做。为每个海盗至少写一句话。
""";
Message userMessage = new UserMessage(userText);

String systemText = new SystemPromptTemplate(systemResource).render(Map.of("name", "Koki", "voice", "幽默"));
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
Message systemMessage = systemPromptTemplate.createMessage();
Prompt prompt = new Prompt(Arrays.asList(userMessage, systemMessage));
List<Generation> results = chatModel.call(prompt).getResults();
results.forEach(System.out::println);
}

与其他组件的集成

与 ChatClient 结合:通过 ChatClient 的流式 API 构建 Prompt:

1
2
3
4
String response = chatClient.prompt()
.system("You are a translator")
.user("Translate 'hello' to French")
.call().content();

与 Advisors 结合:通过顾问动态修改 Prompt(如添加对话历史):

1
2
3
4
5
ChatClient client = ChatClient.builder(model)
.defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
.build();
// 顾问会自动将历史消息添加到 Prompt 中
String response = client.prompt().user("What did we talk about earlier?").call().content();

5-Prompt
http://www.zivjie.cn/2025/11/22/spring框架/springAI/SpringAi框架/5-Prompt/
作者
Francis
发布于
2025年11月22日
许可协议