大模型之Spring AI实战系列(六):借助PromptTemplate在使用OpenAI时构建动态提示词系统

系列篇章💥

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的探索之旅,开启智能时代的大门!

评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻道AI小兵

🐳 感谢你的巨浪支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值