大模型之Spring AI实战系列(五):Spring Boot + 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 构建带角色设定的智能对话系统


前言

在上一篇文章中,我们学习了如何使用 Spring AI 集成 OpenAI 的 Embedding API 实现文本向量化,并探讨了其在语义搜索、RAG 系统等场景中的应用。本文将继续深入 Spring AI 的能力栈,聚焦于系统提示词(System Prompt)的设计与实现

我们将基于 spring-ai-openai-systemPrompt 示例项目,详细介绍如何通过设定 AI 的人格、语气和行为模式,打造一个风格统一、形象鲜明的智能对话系统。该项目不仅展示了如何构建具有“人设”的聊天机器人,还提供了完整的上下文管理机制,为后续开发更复杂的交互式 AI 应用打下坚实基础。

一、开发环境准备

(一)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 中,对 OpenAI 相关参数进行配置:

server:
  port: 8884
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 之间,数值越高,生成的回复越随机。

四、核心代码详解

(一)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应用环境。

(二)带角色设定的聊天控制器

该类使用 OpenAiChatModel 接口来实现带有系统提示的角色化聊天功能。

@RestController
@RequestMapping("/system")
public class SystemPromptController {

    // 提示词,定义了AI的角色和回复风格
    private final String systemPrompt = "...";

    // 历史消息列表
    private List<Message> historyMessage = new ArrayList<>(List.of(new SystemMessage(systemPrompt)));

    // 聊天模型
    private final OpenAiChatModel chatModel;

    @Autowired
    public SystemPromptController(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }

    // 方法实现省略...
}

(三)带角色设定的聊天接口 /prompt

@GetMapping("/prompt")
public AssistantMessage prompt(@RequestParam String prompt) {
    historyMessage.add(new UserMessage(prompt));
    if (historyMessage.size() > maxLen) {
        historyMessage = historyMessage.subList(historyMessage.size() - maxLen - 1, historyMessage.size());
        historyMessage.add(0, new SystemMessage(systemPrompt)); // 保留系统提示
    }
    ChatResponse chatResponse = chatModel.call(new Prompt(historyMessage));
    AssistantMessage assistantMessage = chatResponse.getResult().getOutput();
    historyMessage.add(assistantMessage);
    return assistantMessage;
}
  • 将用户输入作为 UserMessage 添加到历史记录中。
  • 如果历史记录超过最大长度,则截取最近的记录,并确保始终保留 SystemMessage
  • 使用 Prompt 构造器将整个历史记录封装后发送给 OpenAI。
  • 获取 AI 回复后,将其作为 AssistantMessage 加入历史记录。
  • 返回值为 AssistantMessage,包含完整的回复内容。

五、部署与测试

(一)启动应用

可以直接基于IntelliJ IDEA启动并运行Spring Boot应用程序,也可以进入项目根目录,执行 mvn clean package 进行打包,之后采用 java -jar xxx.jar 命令进行部署运行。运行成功后,应用将在 http://localhost:8884 启动。

(二)测试接口

你可以使用 Postman、curl 或浏览器访问以下接口:

  • 发起提问:GET /system/prompt?prompt=今天心情不好怎么办?

观察是否能正确返回符合“幽默段子手”人设的回复,例如:

{"content":"别担心,人生就像一局王者荣耀,有时候顺风,有时候逆风,但只要坚持到最后,总能翻盘!"}

六、系统提示词设计与作用

(一)什么是系统提示词?

系统提示词(System Prompt)是指在每次对话开始时,预先设定的一段文本,用于指导 AI 的行为、语气、知识范围等。它决定了 AI 的“性格”、“态度”和“表达方式”。

例如,在本项目中,我们设定了一位幽默段子手的人设:

private final String systemPrompt = "你现在是一个幽默段子手...即使面对批评,你都要保持幽默感...";

这样,无论用户问什么问题,AI 都会以搞笑段子的形式作答,从而形成一致的风格。

(二)系统提示词的作用

作用描述
人格设定让 AI 具备特定的性格特征,如幽默、严肃、专业等
语气控制控制 AI 的说话风格,如正式、亲切、轻松等
行为引导指导 AI 在面对不同问题时的回应方式,避免跑题或偏离预期
知识边界设定 AI 的回答范围,防止提供错误或不合适的信息

七、多轮对话与上下文维护

为了保证 AI 的回复连贯性,我们在每次请求中都维护了一个历史消息列表 [historyMessage],其中第一个元素始终是 SystemMessage,其余为 UserMessageAssistantMessage
当历史记录超过预设的最大长度(默认 1000 条)时,会进行裁剪,同时确保系统提示词不会丢失。
这种设计可以有效提升 AI 对话的逻辑性和一致性,适用于客服机器人、虚拟助手、情感陪伴等需要长期互动的场景。

八、应用场景与进阶思路

(一)构建个性化 AI 角色

你可以根据业务需求自定义 AI 的人设,比如:

  • 职场导师:提供职业发展建议;
  • 情感陪伴:模拟朋友或恋人;
  • 知识讲解员:用通俗语言解释复杂概念;
  • 客服代表:标准化回复 + 情绪安抚。
    只需修改 [systemPrompt]内容即可快速切换角色。

(二)多角色动态切换

如果你希望同一个聊天界面支持多个角色切换(例如用户可选择“客服”或“搞笑助手”),可以通过参数传递不同的 [systemPrompt],并在服务端动态构造 Prompt

(三)结合 Function Calling 实现插件化功能

Spring AI 支持结合 FunctionCalling 功能,让 AI 根据用户意图调用外部 API 或业务逻辑。例如:

  • 用户说:“帮我查一下天气”,AI 自动调用天气查询插件;
  • 用户说:“讲个笑话”,AI 切换为段子模式;
  • 用户说:“我心情不好”,AI 切换为情感陪伴模式。

(四)引入模板引擎优化提示词生成

对于复杂的提示词构造,可以引入模板引擎(如 Thymeleaf、Freemarker、Handlebars)动态生成 [systemPrompt],使其更具灵活性和扩展性。
例如:

String systemPrompt = templateEngine.process("roleTemplate", context);

结语

通过本文的实践,我们掌握了如何在 Spring AI 中使用 OpenAiChatModelSystemMessage 构建带角色设定的智能对话系统,理解了系统提示词对 AI 行为的重要影响,并探索了其在个性化 AI、多角色切换、插件集成等场景下的应用潜力。在下一篇文章中,我们将继续深入 Spring AI 的能力,介绍如何使用 PromptTemplate 构建动态提示词。


若您对本文介绍的技术内容感兴趣,希望进一步探索和实践,欢迎关注我,通过私信的方式与我联系,获取完整的项目代码,开启您的 Spring AI 开发之旅。


在这里插入图片描述

🎯🔖更多专栏系列文章:AI大模型提示工程完全指南AI大模型探索之路(零基础入门)AI大模型预训练微调进阶AI大模型开源精选实践AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑

😎 作者介绍:资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索(CSDN博客之星|AIGC领域优质创作者)
📖专属社群:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,回复‘入群’ 即刻上车,获取邀请链接。
💘领取三大专属福利:1️⃣免费赠送AI+编程📚500本,2️⃣AI技术教程副业资料1套,3️⃣DeepSeek资料教程1套🔥(限前500人)
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我们,一起携手同行AI的探索之旅,开启智能时代的大门!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻道AI小兵

🐳 感谢你的巨浪支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值