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. 语言本地化:根据用户语言偏好调整系统消息

相关推荐
嘿嘿-661 小时前
Windows 一键使用 GPT-6 Astra:Codex CLI 配置教程
java·人工智能·windows·gpt·chatgpt·web
桦说编程1 小时前
【AtomicAgent系列1】变异测试——过去做不起,现在 agent 做得起
后端·ai编程·vibecoding
考虑考虑2 小时前
nginx打印请求日志
运维·后端·nginx
策案案案2 小时前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea
IT_陈寒3 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端
CoderLiu3 小时前
程序化工具调用(PTC)与动态工作流引擎:深入大模型工具调用的架构演进与实践
前端·人工智能·后端
fireworks993 小时前
SpringBoot2接入Knife4j
后端
wei_shuo4 小时前
数据迁移工具实战:KDMS自动化评估与量化决策体系解析
后端
辰烨chenye4 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode
Lightpwd4 小时前
Spring Boot 多数据源落地:AbstractRoutingDataSource + 注解切面(附源码)
数据库·后端