Spring AI ChatClient -Prompt 模板

模板化 Prompt 的重要性

ChatClient内置 Prompt 模板功能,支持运行时替换变量,避免硬编码 Prompt 文本。这种设计体现了模板方法模式(Template Method Pattern),通过定义算法骨架,将具体实现延迟到子类或运行时。

Prompt 的组成结构

Prompt是发送给AI模型的输入,由以下部分组成:

  • 用户消息 (User Messages)**:来自最终用户的直接输入。

  • 系统消息 (System Messages)**:系统生成的指导性消息,用于引导AI行为。

  • Prompt选项:模型配置参数,如模型名称、温度等控制参数。


方式一、基础模板使用(默认分隔符 {})

java 复制代码
import org.springframework.ai.chat.client.ChatClient;

/*
author: atg
*/ 
@Component
public class PromptTemplateDemo1 {

    private final ChatClient chatClient;

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

    public String templateBasicDemo(String composer) {
        // 使用{composer}作为变量占位符
        return chatClient.prompt()
                .user(u -> u
                        .text("推荐5部由{composer}作曲的电影原声带")
                        .param("composer", composer)) // 替换变量
                .call()
                .content();
    }
}

模板参数的安全性

在使用模板参数时,需要注意:

  1. 参数验证:验证输入参数的有效性,防止注入攻击

  2. 转义处理:对特殊字符进行适当的转义

  3. 长度限制:限制参数长度,避免过长的输入

  4. 类型检查:确保参数类型符合预期


方式二、自定义模板分隔符(避免 JSON 冲突)

当 Prompt 包含 JSON 时,可自定义分隔符避免语法冲突:

java 复制代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.template.StTemplateRenderer;
import org.springframework.stereotype.Component;

@Component
class CustomTemplateDemo {

    private final ChatClient chatClient;

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

       public String customDelimiterDemo(String genre) {
        // 方法1:使用 PromptTemplate 单独处理
        PromptTemplate promptTemplate = new PromptTemplate(
                "推荐3部{genre}类型的经典电影,返回格式:{{\"title\":\"\",\"year\":\"\"}}",
                Map.of("genre", genre)
        );
        // 自定义模板分隔符为<<和>>
        return chatClient.prompt()
                .user((Resource) promptTemplate)// 配置自定义分隔符
                .call()
                .content();
    }
}

分隔符选择的考虑因素

选择自定义分隔符时,需要考虑:

  1. 冲突避免:分隔符不应在 Prompt 内容中出现

  2. 可读性:分隔符应该容易识别和理解

  3. 兼容性:确保分隔符不会引起解析问题

  4. 转义支持:支持分隔符的转义,以处理特殊情况


方式3、系统消息模板

系统消息模板允许为不同的应用场景定制 AI 行为:

java 复制代码
import org.springframework.ai.chat.client.ChatClient;

@Component
public class SystemTemplateDemo {
    private final ChatClient chatClient;

    public SystemTemplateDemo(ChatClient.Builder chatClientBuilder) {
        // 系统消息使用模板变量
        this.chatClient = chatClientBuilder
                .defaultSystem("你是一个{role}专家,专注于{domain}领域")
                .build();
    }
    
    public String domainSpecificQuery(String role, String domain, String question) {
        return chatClient.prompt()
                .system(s -> s
                    .param("role", role)
                    .param("domain", domain))
                .user(question)
                .call()
                .content();
    }
}

动态系统消息的应用场景

动态系统消息适用于:

  1. 多租户系统:为不同租户定制不同的 AI 行为

  2. 领域专家:根据问题领域切换专业角色

  3. 语言本地化:根据用户语言偏好调整系统消息

相关推荐
专注于大数据技术栈2 小时前
java学习--第三代日期时间
java·学习
Yang-Never2 小时前
Android 内存泄漏 -> LiveData如何解决ViewMode和Activity/Fragment之间的内存泄漏
android·java·开发语言·kotlin·android studio
ZLZQ_Yuan2 小时前
线程池使用
java
不爱吃糖的程序媛2 小时前
鸿蒙PC端Java应用开发实战:从环境适配到系统信息采集
java·华为·harmonyos
鹿角片ljp2 小时前
深入理解Java集合框架:核心接口与实现解析
java·开发语言·windows
小贝IT~2 小时前
基于SpringBoot的网页时装购物系统-049
java·spring boot·后端
独自破碎E2 小时前
什么是循环依赖
java·mysql·mybatis
heartbeat..2 小时前
Java NIO 详解(Channel+Buffer+Selector)
java·开发语言·文件·nio