Spring AI 2.0 开发Java Agent智能体 - 对话与提示词工程(Prompt)
大家好,我是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起泡法排序算法
