Spring AI大模型应用(其六):OpenAI环境里用PromptTemplate打造灵动提示系统

系列篇章🌟

序号 文章
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构建动态提示词系统

目录

  • 系列篇章🌟
  • 前言
  • 一、开发环境搭建
    • (一)Java版本要求
    • (二)Maven构建工具
    • (三)OpenAI API密钥获取
  • 二、POM依赖引入
    • (一)Spring AI与OpenAI集成依赖
    • (二)SpringAI依赖版本管理
  • 三、配置文件解读
    • (一)application.yml配置
    • (二)theme.st模板文件
    • (三)code.st模板文件
  • 四、核心代码剖析
    • (一)Application启动类
    • (二)提示词控制器
    • (三)用字符串模板生成诗歌 /generateFiveWordPoem1
    • (四)用文件模板生成诗歌 /generateFiveWordPoem2
    • (五)根据描述生成代码 /code
  • 五、部署与测试
    • (一)应用启动
    • (二)接口测试
  • 六、PromptTemplate原理与优势
    • (一)何为PromptTemplate?
    • (二)核心功能特点
    • (三)应用场景
  • 七、进阶实践与优化建议
    • (一)模板文件集中管理
    • (二)支持模板热加载
    • (三)结合模板引擎(如 Freemarker、Thymeleaf)
    • (四)异常处理与默认值设置
  • 结语

前言

在前述文章里,我们已掌握运用 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视界 】公众号或扫描下方👇二维码,回复‘入群 ’ 即刻上车,获取邀请链接。
💘**

相关文章

暂无评论

暂无评论...