1. 为什么我们需要提示词模板?
在开发AI应用时,我们经常会遇到这样的场景:需要向AI模型提出大量相似但又不完全相同的问题。比如在技术问答系统中,用户可能会询问不同编程语言的特点:
java复制// 不使用模板的写法
@GetMapping("/chat/java")
public String chatJava() {
return chatClient.prompt().user("介绍下Java").call().content();
}
@GetMapping("/chat/python")
public String chatPython() {
return chatClient.prompt().user("介绍下Python").call().content();
}
这种写法存在三个明显问题:
- 代码重复:每个相似的问题都需要单独编写一个方法
- 维护困难:如果需要修改提示词格式,必须逐个修改所有方法
- 灵活性差:无法动态调整问题内容
1.1 模板化思维的价值
提示词模板的核心思想是将可变部分参数化。就像我们在JDBC中使用PreparedStatement防止SQL注入一样,PromptTemplate通过占位符实现提示词的动态生成:
java复制// 定义模板
PromptTemplate template = new PromptTemplate("介绍下{topic}");
// 动态填充
Prompt prompt = template.create(Map.of("topic", "Java"));
这种方式带来三个显著优势:
- 复用性:一套模板可用于多个场景
- 可维护性:只需修改模板即可影响所有使用场景
- 灵活性:运行时动态决定提示词内容
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Spring AI中的模板体系
Spring AI提供了完整的模板解决方案,主要包含以下核心组件:
2.1 PromptTemplate基础使用
最基本的提示词模板类,支持直接在代码中定义模板:
java复制// 创建模板(使用{}作为占位符)
PromptTemplate template = new PromptTemplate(
"你好,我叫{name},是一名{job}工程师"
);
// 填充参数
Map<String, Object> params = new HashMap<>();
params.put("name", "张三");
params.put("job", "Java");
// 生成最终Prompt
Prompt prompt = template.create(params);
注意:占位符命名应遵循Java变量命名规范,使用驼峰或下划线格式
2.2 SystemPromptTemplate专用模板
系统消息(System Message)用于设定AI的角色和行为模式。SystemPromptTemplate是专门用于系统消息的模板类:
java复制SystemPromptTemplate sysTemplate = new SystemPromptTemplate(
"你是一位{domain}专家,请用{style}风格回答"
);
Message sysMessage = sysTemplate.createMessage(
Map.of("domain", "Java", "style", "幽默")
);
与普通模板的区别在于:
- 生成的是Message对象而非Prompt
- 通常用于设定AI角色而非具体问题
2.3 外部模板文件
当模板较复杂或需要团队协同时,推荐使用外部模板文件:
- 在resources目录下创建模板文件:
code复制src/main/r
