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 = 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();String response = client.prompt().user("What did we talk about earlier?" ).call().content();