SpringAI OpenAI 接口 ChatClient 提示模版

@Tag(name = "学习-ChatClient 提示模版", description = "学习-ChatClient 提示模版")
@RestController
@RequestMapping("/study/api/chat/client/promptTemplate")
@Slf4j
public class ChatClientPromptTemplateController {

    private ChatClient chatClient;

    public ChatClientPromptTemplateController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    private static final String QUEST = "列出5部由{actor}主演的电影。";

    private static final String QUEST2 = "列出{actor}在{year}年主演的电影。";

    /**
     * 使用提示模版简单示例
     * 模板方式 - 可以重复使用同一个模板
     * @param actor
     * @return
     */
    @Operation(summary = "提示模版 simple", description = "学习提示模版。")
    @GetMapping("/simple")
    public String usePromptTemplateSimple(String actor) {
        String result = chatClient.prompt().user(
                u->u.text(QUEST).param("actor",actor)).call().content();
        return result;
    }

    /**
     * 使用提示模版 多个参数示例
     * 模板方式 - 清晰管理多个参数
     * @param actor
     * @return
     */
    @Operation(summary = "提示模版 多参数", description = "学习提示模版。")
    @PostMapping("/moreArgs")
    public String usePromptTemplateMoreArgs(@RequestBody Actor actor) {

        System.out.println(actor);

        String result = chatClient.prompt().user(
                u->u.text(QUEST2).param("actor",actor.getName()).param("year",actor.getYear())).call().content();
        return result;

        /**
         * 等价于
         * String result2 = chatClient.prompt()
         *  .user("列出"+actor.getName()+"在"+actor.getYear()+"年主演的电影。").call().content();
         * 字符串连接方式 - 容易出错,难以阅读
        */
    }

    /**
     * 防止 SQL 注入类似的安全问题
     * 字符串连接 - 危险(可能被注入)
     * String userInput = "John Williams; DELETE FROM users;";
     * 使用模板方式 - 安全(框架会转义)
     * DELETE FROM users 作为参数传递,不会被当作指令
     *
     */

    /**
     * 使用提示模版 复杂条件构建
     * @param
     * @return
     */
    @Operation(summary = "提示模版 复杂条件构建", description = "学习提示模版。")
    @GetMapping("/complex")
    public String usePromptTemplateComplexCondition() {

        PromptTemplate promptTemplate = new PromptTemplate("{province}有多少个市。");
        Prompt prompt = promptTemplate.create(Map.of( "province", "内蒙古"));

        String result = chatClient.prompt(prompt).call().content();
        return result;
    }

    /**
     * 使用提示模版 类型安全
     * 支持不同类型参数
     * @param
     * @return
     */
    @Operation(summary = "提示模版 类型安全", description = "学习提示模版。")
    @GetMapping("/safe")
    public String usePromptTemplateSage() {

        // 模板方式 - 支持不同类型参数
        return chatClient.prompt()
                .user(u -> u
                        .text("中国 温度: {temp}°C, 湿度: {humidity}%, 风速: {wind}km/h 最接近的城市。")
                        .param("temp", 25.5)      // double
                        .param("humidity", 65)    // int
                        .param("wind", 12.3f))    // float
                .call().content();
    }

    // 国际化支持

}

@Data
@AllArgsConstructor
class Actor {
    String name;
    String year;
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐