SpringAI-Prompts

官网地址:https://docs.spring.io/spring-ai/reference/api/prompt.html

1、描述

Prompts是引导LLM生成特定输出的输入,Prompt的设计和措辞显著影响LLM的响应

2、Prompt类

public class Prompt implements ModelRequest<List<Message>> {
    private final List<Message> messages;
    @Nullable
    private ChatOptions chatOptions;
}

3、Message接口

封装了Prompt的文本内容,元数据属性集合以及消息分类

public interface Content {
    String getText();

    Map<String, Object> getMetadata();
}

public interface Message extends Content {
    MessageType getMessageType();
}

Message接口的相关实现:
image

消息角色分为:

public enum MessageType {
    USER("user"),                    // 用户角色
    ASSISTANT("assistant"),    // 系统角色
    SYSTEM("system"),          // 助手角色
    TOOL("tool");                  // 工具/函数角色
}

4、PromptTemplate(提示词模板)

主要用来创建结构化Prompt,然后将其发送到LLM。
主要方法:

  • String render():将提示词模板渲染成最终字符串格式,无需外部输入,适用于没有占位符或动态内容的模板。
   public static void main(String[] args) {
        PromptTemplate build = PromptTemplate.builder().template("测试render()").build();
        String render = build.render();
        System.out.println(render);
    }
// 输出:测试render()
  • String render(Map<String, Object> model):增强渲染功能以包含动态内容。它使用 Map<String, Object>,其中映射键是提示词模板中的占位符名称,值是要插入的动态内容。
    public static void main(String[] args) {
        PromptTemplate promptTemplate = PromptTemplate.builder().template("测试render,{placeholder}").build();
        String render = promptTemplate.render(Map.of("placeholder", "占位符"));
        System.out.println(render);
// 输出:测试render,占位符
    }
  • Message createMessage():创建不带额外数据的 Message 对象,用于静态或预定义的消息内容,创建的是UserMessage
   public static void main(String[] args) {
        PromptTemplate promptTemplate = PromptTemplate.builder().template("测试createMessage").build();
        Message message = promptTemplate.createMessage();
        System.out.println(message);
// 输出:UserMessage{content='测试createMessage', metadata={messageType=USER}, messageType=USER}
    }
  • Message createMessage(List mediaList):创建包含静态文本和媒体内容的 Message 对象。
public static void main(String[] args) {
        PromptTemplate promptTemplate = PromptTemplate.builder().template("测试createMessage").build();
        Resource resource = new FileSystemResource("/Users/cmc/Desktop/Snipaste_2025-12-17_10-52-29.png");
        Media media = new Media(MediaType.IMAGE_PNG, resource);
        Message message = promptTemplate.createMessage(List.of(media));
        System.out.println(message);
    }
  • Message createMessage(Map<String, Object> model):扩展消息创建以集成动态内容,接受 Map<String, Object>,其中每个条目表示消息模板中的占位符及其对应的动态值。
public static void main(String[] args) {
            // 1. 定义一个消息模板 (template)
            // 注意:模板中的占位符格式为 `{key}`,例如 `{userName}`
            String messageTemplate = """
            你好,{userName}!欢迎回来。
            根据记录,你所在的城市 {city} 今天的天气是 {weather}。
            为你推荐今日活动:{activity}。
            """;
            PromptTemplate promptTemplate = PromptTemplate.builder().template(messageTemplate).build();
            // 2. 准备数据模型 Map
            // 键(userName, city等)必须与模板中的占位符名字一致
            Map<String, Object> modelData = Map.of(
                    "userName", "张三",             // 替换 {userName}
                    "city", "北京",                // 替换 {city}
                    "weather", "晴朗,25摄氏度",    // 替换 {weather}
                    "activity", "适合去公园散步"   // 替换 {activity}
            );
            // 3. 核心:使用模板和数据模型创建 UserMessage
            Message userMessage = promptTemplate.createMessage(modelData);
            System.out.println(userMessage);
// 输出:UserMessage{content='你好,张三!欢迎回来。
// 根据记录,你所在的城市 北京 今天的天气是 晴朗,25摄氏度。
// 为你推荐今日活动:适合去公园散步。
// ', metadata={messageType=USER}, messageType=USER}
    }
  • Prompt create():生成不带外部数据输入的 Prompt 对象,适用于静态或预定义的提示词。
    public static void main(String[] args) {
        PromptTemplate promptTemplate = PromptTemplate.builder().template("测试创建prompt").build();
        Prompt prompt = promptTemplate.create();
        System.out.println(prompt);
    }
// 输出:Prompt{messages=[UserMessage{content='测试创建prompt', metadata={messageType=USER}, messageType=USER}], modelOptions=null}
  • Prompt create(ChatOptions modelOptions):生成不带外部数据输入且带有聊天请求特定选项的 Prompt 对象。
    public static void main(String[] args) {
        ChatOptions myOptions = ChatOptions.builder()
                .temperature(0.7)
                .topP(0.9)       
                .model("deepseek-r1:14b")
                .build();
        PromptTemplate promptTemplate = PromptTemplate.builder().template("测试创建prompt").build();
        Prompt prompt = promptTemplate.create(myOptions);
        System.out.println(prompt);
    }
// 输出:Prompt{messages=[UserMessage{content='测试创建prompt', metadata={messageType=USER}, messageType=USER}],  modelOptions=org.springframework.ai.chat.prompt.DefaultChatOptions@1b26f7b2}

  • Prompt create(Map<String, Object> model):扩展提示词创建功能以包含动态内容,接受 Map<String, Object>,其中每个映射条目是提示词模板中的占位符及其关联的动态值。
 public static void main(String[] args) {
        // 1. 定义一个消息模板 (template)
        // 注意:模板中的占位符格式为 `{key}`,例如 `{userName}`
        String messageTemplate = """
                你好,{userName}!欢迎回来。
                根据记录,你所在的城市 {city} 今天的天气是 {weather}。
                为你推荐今日活动:{activity}。
                """;
        PromptTemplate promptTemplate = PromptTemplate.builder().template(messageTemplate).build();
        // 2. 准备数据模型 Map
        // 键(userName, city等)必须与模板中的占位符名字一致
        Map<String, Object> modelData = Map.of(
                "userName", "张三",             // 替换 {userName}
                "city", "北京",                // 替换 {city}
                "weather", "晴朗,25摄氏度",    // 替换 {weather}
                "activity", "适合去公园散步"   // 替换 {activity}
        );
        // 3. 核心:使用模板和数据模型创建 UserMessage
        Prompt prompt = promptTemplate.create(modelData);
        System.out.println(prompt);
// 输出:Prompt{messages=[UserMessage{content='你好,张三!欢迎回来。
// 根据记录,你所在的城市 北京 今天的天气是 晴朗,25摄氏度。
// 为你推荐今日活动:适合去公园散步。
// ', metadata={messageType=USER}, messageType=USER}], modelOptions=null}
    }
  • Prompt create(Map<String, Object> model, ChatOptions modelOptions):扩展提示词创建功能以包含动态内容,接受 Map<String, Object>,其中每个映射条目是提示词模板中的占位符及其关联的动态值,以及聊天请求的特定选项。
    public static void main(String[] args) {
        // 1. 定义一个消息模板 (template)
        // 注意:模板中的占位符格式为 `{key}`,例如 `{userName}`
        String messageTemplate = """
                你好,{userName}!欢迎回来。
                根据记录,你所在的城市 {city} 今天的天气是 {weather}。
                为你推荐今日活动:{activity}。
                """;
        PromptTemplate promptTemplate = PromptTemplate.builder().template(messageTemplate).build();
        // 2. 准备数据模型 Map
        // 键(userName, city等)必须与模板中的占位符名字一致
        Map<String, Object> modelData = Map.of(
                "userName", "张三",             // 替换 {userName}
                "city", "北京",                // 替换 {city}
                "weather", "晴朗,25摄氏度",    // 替换 {weather}
                "activity", "适合去公园散步"   // 替换 {activity}
        );

        ChatOptions myOptions = ChatOptions.builder()
                .temperature(0.7)
                .topP(0.9)
                .model("deepseek-r1:14b")
                .build();
        // 3. 核心:使用模板和数据模型创建 UserMessage
        Prompt prompt = promptTemplate.create(modelData, myOptions);
        System.out.println(prompt);
    }

使用自定义模板渲染,例如使用<>

PromptTemplate promptTemplate = PromptTemplate.builder()
    .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build())
    .template("""
            Tell me the names of 5 movies whose soundtrack was composed by <composer>.
            """)
    .build();

String prompt = promptTemplate.render(Map.of("composer", "John Williams"));
posted @ 2025-12-17 11:21  0xCAFEBABE_001  阅读(2)  评论(0)    收藏  举报