系列篇章💥
No. | 文章 |
---|---|
1 | 大模型之Spring AI实战系列(一):基础认知篇 - 开启智能应用开发之旅 |
2 | 大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略 |
3 | 大模型之Spring AI实战系列(三):Spring Boot + OpenAI 实现聊天应用上下文记忆功能 |
4 | 大模型之Spring AI实战系列(四):Spring Boot + OpenAI 使用OpenAI Embedding实现文本向量化 |
5 | 大模型之Spring AI实战系列(五):Spring Boot + OpenAI 构建带角色设定的智能对话系统 |
6 | 大模型之Spring AI实战系列(六):Spring Boot + OpenAI 利用PromptTemplate构建动态提示词系统 |
前言
在前面的文章中,我们已经学习了如何使用 Spring AI 构建基础聊天服务、流式对话、上下文记忆、角色设定等功能。本文将聚焦于一个非常实用但常被忽视的能力——动态提示词模板(Prompt Template)。
我们将基于 spring-ai-openai-promptTemplate
示例项目,详细介绍如何通过 PromptTemplate
实现灵活的提示词管理,支持从字符串模板和文件模板生成内容,并演示其在诗歌创作、代码生成等场景中的应用。
一、开发环境准备
(一)Java 版本要求
本项目采用Java 17进行编译和运行,请务必确保你的开发环境已成功安装JDK 17。你可以在命令行中输入以下命令进行检查:
java -version
输出应类似如下内容:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
OpenJDK 64-Bit Server VM (build 17.0.8+7, mixed mode, sharing)
(二)Maven 构建工具
确保你已安装 Maven 并配置好环境变量:
mvn -v
输出应类似如下内容:
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: D:\Program Files (x86)\apache-maven-3.8.8
Java version: 17.0.12, vendor: Oracle Corporation, runtime: D:\Program Files\jdk-17.0.12
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
(三)OpenAI API 密钥
你需要注册 OpenAI 官网 获取 API Key(国内可以直接使用中转地址),并设置为环境变量:
export OPENAI_API_KEY="your_openai_api_key"
export OPENAI_API_URL="https://api.openai.com/v1"
注意:出于安全考虑,不建议将密钥硬编码在代码中,推荐使用环境变量或配置中心进行管理。
二、POM依赖引入
(一)Spring AI与OpenAI集成依赖包
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
此依赖包用于实现Spring AI与OpenAI的集成,为后续与OpenAI API进行交互提供了必要的支持。
(二)SpringAI相关依赖包版本管理
版本管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
部分通过引入spring-ai-bom,实现了对SpringAI相关依赖包版本的统一管理。这样,在项目中使用Spring AI相关依赖时,无需在每个依赖声明中单独指定版本号,只需遵循spring-ai-bom中定义的版本即可,极大地简化了依赖管理工作,同时确保了项目中依赖版本的一致性和稳定性。
三、配置文件详解
(一)application.yml配置文件
在配置文件 application.yml 中,对 OpenAI 相关参数进行配置:
server:
port: 8885
spring:
ai:
openai:
base-url: ${OPENAI_API_URL}
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-3.5-turbo
temperature: 0.7
- base-url 和 api-key:从环境变量注入,增强配置的安全性,避免密钥在代码中硬编码带来的风险。
- model:指定默认使用的模型版本为 gpt-3.5-turbo。
- temperature:控制输出的随机性,取值范围通常在 0 到 1 之间,数值越高,生成的回复越随机。
(二)theme.st模版文件
请以{theme}为主题,写一首五言律诗。
(三)code.st模版文件
/**
* @language {language}
* @method {methodName}
* @describe {description}
*
*/
四、核心代码详解
(一)Application启动类
这是 Spring Boot 的启动类,非常简洁:
@SpringBootApplication
public class SpringAiApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiApplication.class, args);
}
}
Spring Boot会自动扫描并加载所有的Controller、Service等Bean,为项目的启动和运行奠定基础。它通过@SpringBootApplication注解开启了Spring Boot的自动配置功能,使得项目能够快速搭建起一个完整的Spring应用环境。
(二)提示词控制器
该类使用 PromptTemplate
接口来构建动态提示词,并结合 OpenAiChatModel
生成内容。
@RestController
@RequestMapping("/prompt")
public class PromptTemplateController {
private final OpenAiChatModel chatModel;
@Value("classpath:theme.st")
private Resource templateResource;
@Value("classpath:code.st")
private Resource codeTemplate;
@Autowired
public PromptTemplateController(OpenAiChatModel chatModel) {
this.chatModel = chatModel;
}
// 方法实现省略...
}
(三)使用字符串模板生成诗歌 /generateFiveWordPoem1
@GetMapping("/generateFiveWordPoem1")
public AssistantMessage generateFiveWordPoem1(@RequestParam String theme) {
final String template = "请以{theme}为主题,写一首五言律诗。";
PromptTemplate promptTemplate = new PromptTemplate(template);
Prompt prompt = promptTemplate.create(Map.of("theme", theme));
ChatResponse chatResponse = chatModel.call(prompt);
return chatResponse.getResult().getOutput();
}
- 直接在代码中定义模板字符串;
- 使用
Map
替换{theme}
占位符; - 调用 OpenAI 模型生成诗歌。
(四)使用文件模板生成诗歌 /generateFiveWordPoem2
@GetMapping("/generateFiveWordPoem2")
public AssistantMessage generateFiveWordPoem2(@RequestParam String theme) {
PromptTemplate promptTemplate = new PromptTemplate(templateResource);
Prompt prompt = promptTemplate.create(Map.of("theme", theme));
ChatResponse chatResponse = chatModel.call(prompt);
return chatResponse.getResult().getOutput();
}
- 从 [theme.st]文件读取模板;
- 支持更复杂的模板结构;
- 易于维护和复用。
(五)根据描述生成代码 /code
@GetMapping("/code")
public String generateCode(@RequestParam String description, @RequestParam String language, @RequestParam String methodName) {
PromptTemplate promptTemplate = new PromptTemplate(codeTemplate);
Prompt prompt = promptTemplate.create(
Map.of("description", description, "language", language, "methodName", methodName)
);
ChatResponse chatResponse = chatModel.call(prompt);
return chatResponse.getResult().getOutput().getText();
}
- 从 [code.st]文件读取模板;
- 支持多参数替换(描述、语言、方法名);
- 可用于生成各种编程语言的函数/方法模板。
五、部署与测试
(一)启动应用
可以直接基于IntelliJ IDEA启动并运行Spring Boot应用程序,也可以进入项目根目录,执行 mvn clean package 进行打包,之后采用 java -jar xxx.jar 命令进行部署运行。运行成功后,应用将在 http://localhost:8885 启动。
(二)测试接口
你可以使用 Postman、curl 或浏览器访问以下接口:
-
生成五言诗(字符串模板):
GET /prompt/generateFiveWordPoem1?theme=春天
-
生成五言诗(文件模板):
GET /prompt/generateFiveWordPoem2?theme=秋天
-
生成代码:
GET /prompt/code?description=计算两个数之和&language=Java&methodName=add
六、PromptTemplate 原理与优势
(一)什么是 PromptTemplate?
PromptTemplate
是 Spring AI 提供的一个工具类,它允许开发者通过占位符(如 {theme}
、{language}
)定义模板,并在运行时动态填充参数,生成最终的提示词(Prompt)。
(二)核心功能特性
功能 | 描述 |
---|---|
占位符替换 | 支持使用 {key} 形式的占位符,并通过 Map<String, Object> 替换 |
模板来源多样 | 支持从字符串、资源文件、数据库等多种方式加载模板 |
可扩展性强 | 可与 Spring 的资源抽象层(Resource)无缝集成 |
便于测试与调试 | 模板独立于业务逻辑,易于修改和验证 |
(三)使用场景
场景 | 描述 |
---|---|
内容生成 | 诗歌、故事、新闻摘要、邮件模板等 |
代码生成 | 函数、类、接口文档等 |
问答系统 | 将用户问题格式化后传给 LLM |
多语言支持 | 不同语言版本的提示词统一管理 |
七、进阶实践与优化建议
(一)模板文件集中管理
将所有 [.st]模板文件放在 resources/templates/
目录下,按用途分类存放,例如:
resources/
└── templates/
├── poem/
│ └── five_word_poem.st
└── code/
└── function_template.st
这样可以提升项目的可维护性。
(二)支持模板热加载
对于需要频繁更新模板的企业级应用,可以结合 Spring Boot DevTools 或自定义监听器,实现模板文件的热加载,无需重启服务即可生效。
(三)结合模板引擎(如 Freemarker、Thymeleaf)
如果你的模板结构复杂、嵌套层次深,可以引入模板引擎来增强表达能力。例如:
String rendered = templateEngine.process("templateName", context);
Prompt prompt = new Prompt(rendered);
(四)异常处理与默认值
在模板渲染过程中,建议加入异常处理机制,避免因参数缺失导致空指针错误。同时可以为关键参数设置默认值:
Map<String, Object> params = new HashMap<>();
params.putIfAbsent("language", "Java");
结语
通过本文的实践,我们掌握了如何在 Spring AI 中使用 PromptTemplate
构建动态提示词系统,理解了模板驱动的内容生成方式在诗歌创作、代码生成等场景下的强大能力,并探索了其在企业级 AI 应用中的拓展方向。在下一篇文章中,我们将继续深入解析 Spring AI 的其他能力
若您对本文介绍的技术内容感兴趣,希望进一步探索和实践,欢迎关注我,通过私信的方式与我联系,获取完整的项目代码,
开启您的 Spring AI 开发之旅。
🎯🔖更多专栏系列文章:AI大模型提示工程完全指南、AI大模型探索之路(零基础入门)、AI大模型预训练微调进阶、AI大模型开源精选实践、AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑
😎 作者介绍:资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索(CSDN博客之星|AIGC领域优质创作者)
📖专属社群:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,回复‘入群’ 即刻上车,获取邀请链接。
💘领取三大专属福利:1️⃣免费赠送AI+编程📚500本,2️⃣AI技术教程副业资料1套,3️⃣DeepSeek资料教程1套🔥(限前500人)
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我们,一起携手同行AI的探索之旅,开启智能时代的大门!