【SpringAIAlibaba新手村系列】(6)PromptTemplate 提示词模板与变量替换

简介: 本章详解Spring AI 1.1.2中Prompt核心机制:以System/User/Assistant/Tool四类消息构建结构化提示,强调“角色决定语义”;涵盖多模型配置(DeepSeek/Qwen)、五种实战调用方式及系统消息最佳实践,夯实AI交互工程基础。

第五章 Prompt 提示词基础与多种消息类型

版本标注

  • Spring AI: 1.1.2
  • Spring AI Alibaba: 1.1.2.0

章节定位

  • Prompt 仍然是基础,但在 1.1.2.x 中,Prompt 往往会与 Tool Calling、MCP、RAG、结构化输出、Agent System Prompt、Routing Prompt 一起协同工作。

s01 > s02 > s03 > s04 > [ s05 ] s06 > s07 > s08 > s09 > s10 > s11 > s12 > s13 > s14 > s15 > s16 > s17 > s18

"同一句话, 放在不同消息角色里, 效果可能完全不同" -- Prompt 的本质不是提问, 而是精确表达任务。


一、Prompt 的核心概念

1.1 什么是 Prompt?

Prompt(提示词) 是我们与 AI 沟通的唯一方式,你可以把它理解成:

"给 AI 写的 prompt 就是给 AI 下达的指令或提出的问题"

就像和人沟通一样,你说的越清楚,对方理解得越准确。Prompt 写得好不好,直接决定了 AI 输出的质量。

1.2 Prompt 的组成要素

一个完整的 Prompt 通常由两部分组成:

┌────────────────────────────────────────────────────┐
│                    Prompt 的组成                    │
├────────────────────────────────────────────────────┤
│                                                    │
│  【系统消息 System Message】                        │
│  ─────────────────────────                         │
│  你是一个法律助手,只回答法律相关问题               │
│  其他问题回复"抱歉,我只能回答法律问题"             │
│                                                    │
│  【用户消息 User Message】                          │
│  ──────────────────                                │
│  什么是知识产权法?                                │
│                                                    │
└────────────────────────────────────────────────────┘

1.3 Spring AI 中的消息类型

在 Spring AI 中,消息被抽象为几个类:

消息类型 说明 典型用途
SystemMessage 系统提示词,设定 AI 角色和行为 "你是一个Java专家"
UserMessage 用户消息,实际的问题 "什么是反射?"
AssistantMessage AI 的回复消息 记录对话历史
ToolResponseMessage 工具调用返回的结果 天气查询结果

二、多种模型支持

2.1 多模型配置

本章的项目展示了如何在同一个应用中支持多个不同的 AI 模型:

// 项目中配置了两种模型
@Resource(name = "deepseek")       // DeepSeek 开源模型
private ChatModel deepseekChatModel;

@Resource(name = "qwen")           // 阿里云通义千问
private ChatModel qwenChatModel;

// 对应的两个 ChatClient
@Resource(name = "deepseekChatClient")
private ChatClient deepseekChatClient;

@Resource(name = "qwenChatClient")
private ChatClient qwenChatClient;

2.2 模型选择策略

不同模型有不同的特点:

模型 特点 适用场景
DeepSeek 开源免费,中文能力强 成本敏感场景
Qwen (通义千问) 阿里云服务稳定,中文优化好 生产环境首选

三、项目代码详解

3.1 控制器代码

package com.atguigu.study.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.ToolResponseMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * Prompt 提示词控制器
 * 展示各种 Prompt 的使用方式
 */
@RestController
public class PromptController
{
   
    // 注入 DeepSeek 模型和 ChatClient
    @Resource(name = "deepseek")
    private ChatModel deepseekChatModel;

    @Resource(name = "qwen")
    private ChatModel qwenChatModel;

    @Resource(name = "deepseekChatClient")
    private ChatClient deepseekChatClient;

    @Resource(name = "qwenChatClient")
    private ChatClient qwenChatClient;

    /**
     * 方式一:使用 ChatClient 的简洁 API(推荐)
     * 
     * .system() 方法设置系统提示词
     * .user() 方法设置用户消息
     * .stream() 开启流式输出
     *
     * 接口:http://localhost:8005/prompt/chat?question=火锅介绍下
     */
    @GetMapping("/prompt/chat")
    public Flux<String> chat(String question)
    {
   
        return deepseekChatClient.prompt()
            // system() 设置系统消息:AI的角色设定
            .system("你是一个法律助手,只回答法律问题,"
                   + "其它问题回复,我只能回答法律相关问题,其它无可奉告")
            // user() 设置用户消息
            .user(question)
            // stream() 流式输出
            .stream()
            .content();
    }

    /**
     * 方式二:使用底层 Message 对象(更底层灵活)
     * 
     * 创建 SystemMessage 和 UserMessage 对象
     * 组合成 Prompt 进行调用
     * 
     * 接口:http://localhost:8005/prompt/chat2?question=葫芦娃
     */
    @GetMapping("/prompt/chat2")
    public Flux<ChatResponse> chat2(String question)
    {
   
        // 1. 系统消息:设定AI为"讲故事助手"
        SystemMessage systemMessage = new SystemMessage(
            "你是一个讲故事的助手,每个故事控制在300字以内"
        );

        // 2. 用户消息:用户的问题
        UserMessage userMessage = new UserMessage(question);

        // 3. 组合成 Prompt
        //    Prompt 是 Message 的容器,可以包含多个消息
        Prompt prompt = new Prompt(userMessage, systemMessage);

        // 4. 调用并返回流式响应
        return deepseekChatModel.stream(prompt);
    }

    /**
     * 方式三:提取响应中的文本
     * 
     * 获取 ChatResponse 对象后,需要手动提取内容
     * 
     * 接口:http://localhost:8005/prompt/chat3?question=葫芦娃
     */
    @GetMapping("/prompt/chat3")
    public Flux<String> chat3(String question)
    {
   
        SystemMessage systemMessage = new SystemMessage(
            "你是一个讲故事的助手,每个故事控制在600字以内且以HTML格式返回"
        );

        UserMessage userMessage = new UserMessage(question);
        Prompt prompt = new Prompt(userMessage, systemMessage);

        // 使用 map 转换响应,提取文本内容
        // getResults().get(0) 获取第一个结果块
        // getOutput().getText() 获取生成的文本
        return deepseekChatModel.stream(prompt)
            .map(response -> response.getResults().get(0).getOutput().getText());
    }

    /**
     * 方式四:获取 AssistantMessage 对象
     * 
     * 如果需要获取 AI 回复的完整对象(包含元数据)
     * 可以获取 AssistantMessage
     * 
     * 接口:http://localhost:8005/prompt/chat4?question=葫芦娃
     */
    @GetMapping("/prompt/chat4")
    public String chat4(String question)
    {
   
        // 通过 ChatClient 获取完整响应
        AssistantMessage assistantMessage = deepseekChatClient.prompt()
                .user(question)
                .call()
                .chatResponse()            // 获取 ChatResponse 对象
                .getResult()               // 获取结果
                .getOutput();              // 获取输出消息

        // 通过 getText() 获取文本内容
        return assistantMessage.getText();
    }

    /**
     * 方式五:模拟工具调用场景(ToolResponseMessage)
     * 
     * 这个示例展示了 ToolResponseMessage 的使用场景
     * 实际使用会在 ToolCalling 章节详细讲解
     * 
     * 接口:http://localhost:8005/prompt/chat5?city=北京
     */
    @GetMapping("/prompt/chat5")
    public String chat5(String city)
    {
   
        // 1. 用户问题:询问城市天气
        String answer = deepseekChatClient.prompt()
                .user(city + "未来3天天气情况如何?")
                .call()
                .chatResponse()
                .getResult()
                .getOutput()
                .getText();

        // 2. 模拟工具返回结果(实际是外部工具调用的返回值)
        ToolResponseMessage toolResponseMessage = new ToolResponseMessage(
                List.of(
                    // ToolResponse 参数:toolCallId, toolName, content
                    new ToolResponseMessage.ToolResponse("1", "获得天气", city)
                )
        );

        // 3. 组合结果
        //    在实际应用中,会把工具返回的信息再发送给 AI,让它结合信息回答
        String toolResponse = toolResponseMessage.getText();
        String result = answer + toolResponse;

        return result;
    }
}

四、系统消息的最佳实践

4.1 系统消息的作用

系统消息(SystemMessage)就像是给 AI 设置的"人格"和"工作规则":

// ❌ 模糊的系统消息(AI 可能自由发挥)
.system("你是一个助手")

// ✅ 明确的系统消息(AI 知道该怎么做)
.system("""
    你是一个专业的Java技术博主。
    1. 回答问题时优先使用代码示例
    2. 解释概念时要用通俗易懂的语言
    3. 每次回答控制在500字以内
    4. 使用Markdown格式输出代码块
    """)

4.2 优秀的系统消息包含要素

要素 说明 示例
角色设定 AI 是什么身份 "你是一个法律顾问"
能力边界 能回答什么,不能回答什么 "只回答法律相关问题"
输出格式 要求如何返回结果 "用HTML格式返回"
字数控制 要求输出多长 "控制在300字以内"
风格要求 语气、措辞要求 "用通俗易懂的语言"

五、本章小结

5.1 核心概念回顾

概念 说明
Prompt 提示词,发送给 AI 的完整指令
SystemMessage 系统消息,设定 AI 的角色和行为
UserMessage 用户消息,用户实际提出的问题
AssistantMessage AI 回复的消息对象
ToolResponseMessage 工具调用返回的结果消息

5.2 使用建议

  1. 简单场景:使用 ChatClient.prompt().system().user().call() 链式 API
  2. 需要精细控制:创建 SystemMessage + UserMessage 组装 Prompt
  3. 多模型切换:通过 @Qualifier 区分不同的 ChatModel

本章重点

  1. 理解 Prompt 的组成:系统消息 + 用户消息
  2. 掌握多种创建和使用 Prompt 的方式
  3. 学会在系统中切换使用不同模型

下章剧透(s06):

了解了 Prompt 的基本使用后,下一章我们将学习 PromptTemplate(提示词模板)——如何用占位符实现可复用的提示词。


📝 编辑者:Flittly
📅 更新时间:2026年3月
🔗 相关资源Spring AI Prompt 官方文档

目录
相关文章
|
4天前
|
人工智能 前端开发 Java
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
本文围绕 Spring AI 中的流式输出与响应式编程展开,重点解释了传统一次性响应与流式返回的差异,以及 Flux 在异步数据流中的核心作用。文章结合 ChatModel.stream() 与 ChatClient 的多种代码示例,说明如何实现 AI 内容的边生成边返回,并帮助读者理解流式调用在用户体验、性能和长文本场景中的实际价值。
150 4
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
|
14天前
|
人工智能 JSON 安全
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(9)Agent Teams (智能体团队)
本章构建持久化智能体团队,解决一次性子智能体和哑后台任务的问题。每个队友拥有独立线程与 LLM 循环,通过 JSONL 文件邮箱实现跨轮通信;TeammateManager 维护团队名册与生命周期,MessageBus 提供线程安全的消息收发,支持并行协作、任务分派与状态同步,为大型项目多 Agent 协同奠定基础。
504 4
|
2天前
|
缓存 JSON 应用服务中间件
【HTTP】HTTP状态码全分类表(1xx/2xx/3xx/4xx/5xx)(附:《思维导图》)
HTTP状态码是服务器对客户端请求的3位数字响应,依据RFC 7231分为5类:1xx(信息)、2xx(成功)、3xx(重定向)、4xx(客户端错误)、5xx(服务器错误)。本文系统梳理各分类核心码(如200、404、500等),明确语义、场景、特性及常见误区,兼顾规范性与工程实践。
|
7天前
|
SQL 前端开发 Java
【分层架构】Spring MVC三层架构 / DDD领域驱动四层架构 / 微服务分布式架构(DAO/Mapper/Repository/Service/Controller/Manager)
本文系统解析Java企业级分层架构(Controller/Service/Manager/Repository/DAO/Mapper),阐明各层职责边界、设计原则与典型误区,强调单一职责、依赖倒置、关注点分离等核心思想,助力构建高内聚、低耦合、易维护的可扩展系统。
338 11
|
20天前
|
人工智能 Kubernetes 安全
最新!云上openclaw“养虾”服务指南来了
阿里云推出OpenClaw“云上养虾”全栈指南:轻量服务器一键部署、PAI平台智能开发、Agentbay企业托管、MobileClaw安卓版及ACS沙箱环境,覆盖个人、开发者与企业需求,安全、便捷、实用。
947 10
|
17天前
|
存储 弹性计算 运维
阿里云2026年最便宜云服务器:轻量服务器38元和199元1年,云服务器99元和199元1年
2026年阿里云以超低价格推出四款高性价比云服务器:轻量应用服务器38元/年与199元/年款,及云服务器ECS 99元/年与199元/年款,满足从个人开发者到中小企业的不同需求。轻量应用服务器集成管理、开箱即用;ECS提供完全控制权,适合需要稳定且可扩展环境的用户。阿里云还提供丰富的组合套餐与实时价格查询,助力用户以最低成本开启云上之旅。
1115 17
|
5天前
|
存储 JSON vr&ar
什么是 glb/glTF 格式,为什么它们对 3D 设计师如此重要?
glTF(GL传输格式)是Khronos Group推出的开放、高效、跨平台的3D模型标准,支持网格、材质、动画等全要素,JSON+二进制(glb)双格式。轻量、易传输,广泛用于Web、VR、游戏与3D打印,兼容Blender、Unity等主流工具。(239字)
|
23天前
|
人工智能 JavaScript Linux
【最新版养 AI龙虾🦞指南】零基础 OpenClaw 阿里云/本地部署、配置、使用保姆级教程
OpenClaw(原Clawdbot,曾用名Moltbot)作为一款开源轻量级AI自动化代理工具,2026年版本在部署灵活性、功能兼容性上实现重大升级,核心优势在于“自然语言驱动+全流程任务自动化”,无需手动编写脚本,仅需输入口语化指令,即可完成文档处理、日程管理、文件读写、跨工具协同、代码生成等各类重复性工作,被广泛应用于个人办公、新手开发、轻量团队协作等场景,堪称“私人AI员工”。
1069 92
|
23天前
|
人工智能 Ubuntu 机器人
【最新】从单AI踩坑到多 AI Agent团队协作:OpenClaw 阿里云/本地部署多Agent步骤+免费API接入及避坑指南
在AI工具的实际使用中,很多人都会遇到这样的问题:用单个AI助手处理所有工作,结果上下文混乱、角色切换效率低,简单的任务也被拖慢节奏。OpenClaw作为轻量级AI Agent管理平台,其多Agent架构恰好能解决这一痛点,通过让不同AI Agent各司其职,实现专业化分工与高效协作。本文将从单Agent的使用痛点出发,详解OpenClaw多Agent的搭建逻辑与实战效果,同时附上2026年新手零基础下阿里云、MacOS、Linux、Windows11全平台的部署流程,以及阿里云百炼免费大模型API的配置方法和使用中的常见问题解答,让零基础用户也能轻松搭建自己的AI虚拟团队。
1056 3
|
存储 人工智能 Java
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比
本章深度解析 Spring AI 中 `ChatModel`(底层接口)与 `ChatClient`(高级封装)的本质区别:前者如“手动挡”,精准控制但需写大量样板代码;后者似“智能点餐机”,链式调用、支持系统提示、模板、工具调用等,开发高效。初学者推荐优先使用 `ChatClient`。
145 0
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比

热门文章

最新文章