Spring AI ChatClient五种Prompt使用方式详解(全网最通俗易懂)

摘要:Spring AI 中 ChatClient 是调用大模型的核心工具,而 Prompt 提示词是控制大模型输出效果的关键。很多新手分不清 全局系统提示词、单次对话提示词、动态模板Prompt、伪系统Prompt、外部文件Prompt 五种用法。本文基于实战测试代码,手把手拆解五种Prompt写法、区别、适用场景,看完彻底搞懂Spring AI Prompt编程。

标签:Spring AI、ChatClient、Prompt、AI大模型、Java实战

一、前言

在 Spring AI 开发中,ChatClient 封装了大模型的调用逻辑,无需手动拼接HTTP请求、无需适配不同模型的API。而 Prompt(提示词)是我们和大模型沟通的桥梁,合理使用不同的Prompt写法,可以实现:固定AI角色、动态修改提示词、解耦硬编码、统一角色配置等功能。

本文基于 SpringBoot + SpringAI 单元测试代码,详解五种主流Prompt使用方式,全部可直接运行,适合入门学习与项目落地。

二、五种Prompt实战用法详解

2.1 方式一:全局默认系统提示词(defaultSystem)

核心特点
  • 构建 全局唯一 的ChatClient实例

  • 系统提示词固定,所有对话都生效

  • 适合:固定AI角色、全局统一人设的场景

实战代码
@Test
    public void testPrompt() {
        //直接给ChatClient设置系统提示词
        ChatClient client = chatClient.defaultSystem("你是一位热情、专业的导游,熟悉各种旅游目的地的风土人情和景点信息。你的任务是根据用户的需求,为他们规划一条合理且有趣的旅游路线。").build();
        String c = client.prompt().user("你是谁").call().content();
        System.out.println("c = " + c);
    }
运行结果说明

AI会固定以专业导游的身份回答问题,无论用户提问什么,都会优先遵循全局系统提示词的人设。

2.2 方式二:单次对话系统提示词(system)

核心特点
  • 不修改全局ChatClient配置,仅当前本次对话生效

  • 优先级高于全局默认提示词,灵活切换AI角色

  • 适合:不同接口、不同测试场景需要不同AI人设

实战代码
@Test
    public void testPrompt2() {
        //直接给当前对话设置设置系统提示词
        ChatClient client = chatClient.build();
        String c = client.prompt().system("你是一个导购").user("你是谁").call().content();
        System.out.println("c = " + c);
    }
核心区别

defaultSystem 不同:system() 是临时生效,只对当前这一次prompt请求有效,不会污染其他对话。

2.3 方式三:系统提示词动态模板(param动态传参)

核心特点
  • 支持 模板占位符 + 动态参数 拼接系统提示词

  • 通过 {变量名} 定义模板,.param() 动态赋值

  • 适合:人设风格可变、提示词动态配置场景

实战代码
//动态模板
    @Test
    public void testPrompt3() {

        ChatClient client = chatClient.build();
        String c = client.prompt().system(u->u.text("你是一个{voice}语气的陪玩").param("voice","高冷")).user("你是谁").call().content();
        System.out.println("c = " + c);
    }
执行逻辑

模板渲染后真实系统提示词:你是一个高冷语气的陪玩,可通过修改param参数,随意切换高冷、温柔、活泼等语气。

2.4 方式四:伪系统提示词(User模板模拟系统人设)

核心特点
  • 无system层级提示词,将角色设定写入用户提问中

  • 同样支持动态模板param传参,双变量替换

  • 适用部分不支持独立system参数的老旧大模型接口

实战代码
@Test
    public void testPrompt4() {

        ChatClient client = chatClient.build();
        String c = client.prompt().user(u->u.text("你是一个{voice}语气的老师,请回答{question}").param("voice","温柔").param("question","你是谁")).call().content();
        System.out.println("c = " + c);
    }
场景说明

部分模型对system提示词支持不完善,可通过这种伪系统提示词的方式,把角色设定嵌入用户prompt,达到同样效果。

2.5 方式五:外部文件加载Prompt(解耦硬编码)

核心特点
  • 将Prompt提示词写入独立 .st 模板文件,彻底解耦代码

  • 支持统一管理大量、复杂的提示词,便于维护修改

  • 企业级项目最推荐的写法

步骤1:创建模板文件

resources 目录下新建 prompt.st 文件,写入自定义系统提示词:

你是一名专业的Java技术博主,回答问题简洁、专业、通俗易懂。

步骤2:代码加载外部Prompt
//外部文件作为提示词
    @Test
    public void testPrompt5(@Value("classpath:/prompt.st") Resource resource) {

        ChatClient client = chatClient.defaultSystem(resource).build();
        String c = client.prompt().user("你是谁").call().content();
        System.out.println("c = " + c);
    }

三、五种Prompt方式核心区别总结

Prompt方式

生效范围

是否支持动态参数

适用场景

defaultSystem 全局系统词

全局所有对话

固定AI全局人设

system 单次系统词

仅当前对话

临时切换AI角色

system + param 动态模板

仅当前对话

动态修改AI人设、语气

User伪系统Prompt

仅当前对话

兼容不支持system的模型

外部文件Prompt

全局

支持文件模板参数

企业项目、复杂提示词维护

四、核心知识点总结

  1. 优先级:单次system提示词 > 全局defaultSystem提示词

  2. 动态模板核心{key} 占位符 + .param(key,value) 赋值

  3. 最佳实践:简单场景用动态模板,复杂项目用外部文件加载Prompt,彻底解耦代码

  4. 伪系统Prompt 是兼容方案,优先使用标准的system层级提示词

五、结语

以上五种Prompt写法覆盖了 Spring AI 开发中99%的业务场景,从基础固定人设、临时对话配置,到动态参数渲染、企业级文件解耦,层层递进。掌握这五种用法,即可熟练完成AI对话角色定制、提示词优化、动态问答等核心功能开发。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐