大家好,我是Java1234_小锋老师,最近更新《2027版本 Spring AI 2.0 开发Java Agent智能体 视频教程》专辑,感谢大家支持。

本课程主要介绍和讲解Spring AI 2.0简介,Spring AI 2.0 HelloWorld搭建,Advisors --- 拦截器模式增强AI能力,对话与提示词工程(Prompt),工具调用 (Function Calling / Tools) ,RAG(检索增强生成),MCP(模型 上下文协议)和多模态支持。
等这个Spring AI2.0基础课程录制完成,接下来要发布2个 企业级Java AI实战课程,RAG企业知识库系统和AI智能客服系统。大家可以点点关注,后面更精彩。
视频教程+课件+源码打包下载:
链接:https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd=1234
提取码:0000
Spring AI 2.0 开发Java Agent智能体 - 对话与提示词工程(Prompt)
一、核心概念总览
Spring AI 2.0 提供了统一、易用的对话与提示词工程 API,核心组件包括:
| 组件 | 作用 | 关键特性 |
|---|---|---|
| Message | 封装对话内容 | 支持SYSTEM 、USER 、ASSISTANT 、TOOL四种类型Spring |
| Prompt | 模型输入容器 | 包含消息列表和模型配置选项 |
| PromptTemplate | 提示词模板引擎 | 支持变量替换、外部文件加载、自定义分隔符Spring |
| ChatClient | 对话 API 入口 | 流畅链式调用,简化提示词构建与响应处理Spring |
| ChatModel | 底层模型接口 | 统一抽象不同大模型(OpenAI、Anthropic、Ollama 等)Spring |
二、核心知识点详解
1. 消息类型(Message Type)
Spring AI 定义了四种标准消息类型,用于构建结构化对话:
-
SYSTEM:设定 AI 角色、行为准则和能力边界(如 "你是一位 Java 开发专家,只回答编程相关问题")
-
USER:用户输入的问题或指令
-
ASSISTANT:AI 的历史回复(用于多轮对话上下文)
-
TOOL:工具调用的结果(如函数执行返回值)
2. 提示词工程基础原则
有效提示词应包含三要素:
-
角色设定:明确 AI 身份和能力范围
-
上下文信息:提供必要背景知识
-
清晰指令:明确任务目标和输出格式
提示词优化技巧:
-
使用分隔符(如 ```、---)区分不同内容块
-
设定输出格式(如 JSON、Markdown)
-
控制模型参数(temperature:0~1,越低越确定;maxTokens:最大输出长度)Spring
3. 提示词模板(PromptTemplate)
解决硬编码提示词的复用性和维护性问题,支持:
-
变量替换(使用
{}占位符) -
外部文件加载(从 resources 读取模板)
-
自定义渲染器(如修改分隔符为
<>) -
系统提示词模板(SystemPromptTemplate)专门用于角色设定
4. ChatClient 流畅 API
Spring AI 2.0 推荐使用 ChatClient 进行对话开发,特点:
-
链式调用,代码简洁
-
内置提示词构建器
-
支持流式响应(Flux<String>)
-
统一处理不同模型的响应格式Spring
三,具体应用实例
1,PromptTemplate提示词模版
我们如果不用提示词模版,很多时候写代码是这样的:
// 不用模板:手写相同的逻辑,重复且难以维护
@GetMapping("/chat/java")
public String java() { return chatClient.prompt().user("介绍下Java").call().content(); }
@GetMapping("/chat/python")
public String python() { return chatClient.prompt().user("介绍下Python").call().content(); }
我们现在用提示词模版简化系统设计:
/**
* 使用模板:一套代码应对所有场景
* @param topic
* @return
*/
@RequestMapping(value = "/ask",produces = "text/html;charset=utf-8")
public Flux<String> ask(String topic) {
PromptTemplate template = new PromptTemplate("介绍下{topic}");
Prompt prompt = template.create(Map.of("topic", topic));
return chatClient.prompt(prompt)
.stream()
.content();
}
测试,浏览器输入:http://localhost:8080/ask?topic=java

再测试,浏览器输入:http://localhost:8080/ask?topic=python

2,使用 ChatClient 的流式 API 可以最快速地组装提示词
我们看下代码:
/**
* 使用 `ChatClient` 的流式 API 可以最快速地组装提示词
* @param topic
* @return
*/
@RequestMapping(value = "/ask2",produces = "text/html;charset=utf-8")
public Flux<String> ask2(String topic) {
return chatClient.prompt()
.system("你是一个专业的书评助手") // 设置系统提示
.user(u->u.text("请给我三本关于{topic}的书籍").param("topic", topic))
.stream()
.content();
}
测试,浏览器输入:http://localhost:8080/ask2?topic=python

再测试,浏览器输入:http://localhost:8080/ask2?topic=java

3,系统提示词工程 ------ defaultSystem
通过 defaultSystem 构建"专家角色",将其作为 AI 的"行动纲领",确保所有对话都有统一的行为准则。
我们先在AiConfiguration配置类里加一个ChatClient实例:
/**
* 创建一个 ChatClient 对象,用于处理聊天请求。
*
* @param model OpenAiChatModel 对象,用于处理聊天请求。
* @return ChatClient 对象,用于处理聊天请求。
*/
@Bean
public ChatClient chatClient3(OpenAiChatModel model){
// System Prompt 工程:清晰定义 AI 的角色、任务、约束和输出格式
String systemPrompt = """
你是一个资深的 Java 技术顾问。
禁止回答任何非技术类问题,例如天气或娱乐八卦。
代码示例必须符合 Java 17+ 规范。
回答需要符合以下格式:首先一句话概括问题的核心,然后提供代码示例,最后补充注意事项。
如果自己不确定,可以说"关于这个问题,我目前没有确切的信息",禁止编造内容。
""";
return ChatClient
.builder(model) // 创建 ChatClient 对象,并设置模型为 model
.defaultSystem(systemPrompt)
.defaultAdvisors(new SimpleLoggerAdvisor()) // 添加一个 SimpleLoggerAdvisor,记录请求日志
.build(); // 构建 ChatClient 对象
}
接下来,MyAiChatController里加下chatClient3实例,以及定义一个新接口方法:
@Autowired
private ChatClient chatClient3 ;
/**
* @param question
* @return
*/
@RequestMapping(value = "/ask3",produces = "text/html;charset=utf-8")
public Flux<String> ask3(String question) {
return chatClient3.prompt() // 创建一个 Prompt 对象,用于构建聊天请求。
.user( question) // 设置用户输入的文本。
.stream() // 调用 ChatClient 对象的 call() 方法,发送聊天请求给大模型并获取响应。
.content(); // 获取响应的文本内容。
}
我们来测试下,浏览器输入:http://localhost:8080/ask3?question=写一个java起泡法排序算法
