【 SpringAI核心特性 | Prompt工程 】

1. Prompt 工程

基本概念:Prompt ؜工程又叫提示‏词工程,简单来说,就是输入‌给 AI 的指令。

比如下面‏这段内容,就是提示词:

请问桂林电子科技大学是一个怎么样的学校?

1.1 Prompt分类

在 AI ؜对话中,基于角色的⁠分类是最常见的,通‏常存在 3 种主要‌类型的 Promp‏t:

1)用户 Prompt :这是用户向 AI 提供的实际问题、指令或信息,传达了用户的直接需求。用户 Prompt 告诉 AI 模型 “做什么”,比如回答问题、编写代码、生成创意内容等。

用户:帮我写一篇有关桂电的介绍文章

2)系统 Prompt :这是设置 AI 模型行为规则和角色定位的隐藏指令,用户通常不能直接看到。系统 Prompt 相当于给 AI 设定人格和能力边界,即告诉 AI “你是谁?你能做什么?”。

系统:你是一位经验丰富的软件工程师,擅长分析代码问题并提供建设性建议。
回答时保持专业性,但避免使用过于学术的术语,确保新手能够理解你的建议。

3)助手 Prompt :这是 AI 模型的响应内容。在多轮对话中,之前的助手回复也会成为当前上下文的一部分,影响后续对话的理解和生成。某些场景下,开发者可以主动预设一些助手消息作为对话历史的一部分,引导后续互动。

系统:你是编程导航的专业编程导师,擅长引导初学者入门编程并制定学习路径。使用友好鼓励的语气,解释复杂概念时要通俗易懂,适当使用比喻让新手理解,避免过于晦涩的技术术语。用户:我完全没有编程基础,想学习编程开发,但不知道从何开始,能给我一些建议吗?助手:欢迎加入编程的世界!作为编程小白,建议你可以按照以下步骤开始学习之旅...【多轮对话继续】

1.2 Prompt优化

高质量的 Promp‏t 可以显著提升 AI 输‌出的质量,因此‏掌握 Prompt 优化技巧非常重要。

1.2.1 基础提示技巧

1. 明确指定任务和角色

为 AI ؜提供清晰的任务描述⁠和角色定位,帮助模‏型理解背景和期望。

系统:你是一位经验丰富的Python教师,擅长向初学者解释编程概念。
用户:请解释 Python 中的列表推导式,包括基本语法和 2-3 个实用示例。

2. 提供详细说明和具体示例

提供足够的؜上下文信息和期望的⁠输出格式示例,减少‏模型的不确定性。

请提供一个社交媒体营销计划,针对一款新上市的智能手表。计划应包含:
1. 目标受众描述
2. 三个内容主题示例格式:
目标受众: [描述]
内容主题: [主题1], [主题2], [主题3]

3. 明确输出格式要求

指定输出的格式、长度、风格等要求,获得更符合预期的结果。

撰写一篇关于气候变化的科普文章,要求:
- 使用通俗易懂的语言,适合高中生阅读
- 包含5个小标题,每个标题下2-3段文字
- 总字数控制在800字左右
- 结尾提供3个可行的个人行动建议

1.2.2 进阶提示技巧

1. 分步骤指导(Step-by-Step)

将复杂任务分解为可管理的步骤,确保模型完成每个关键环节。

请帮我创建一个简单的网站落地页设计方案,按照以下步骤:步骤1: 分析目标受众(考虑年龄、职业、需求等因素)
步骤2: 确定页面核心信息(主标题、副标题、价值主张)
步骤3: 设计页面结构(至少包含哪些区块)
步骤4: 制定视觉引导策略(颜色、图像建议)
步骤5: 设计行动召唤(CTA)按钮和文案

2. 少样本学习(Few-Shot Learning)

通过提供几؜个输入-输出对的示⁠例,帮助模型理解任‏务模式和期望输出。

我将给你一些情感分析的例子,然后请你按照同样的方式分析新句子的情感倾向。输入: "这家餐厅的服务太差了,等了一个小时才上菜"
输出: 负面,因为描述了长时间等待和差评服务输入: "新买的手机屏幕清晰,电池也很耐用"
输出: 正面,因为赞扬了产品的多个方面现在分析这个句子:
"这本书内容还行,但是价格有点贵"

核心:任务越复杂,就越要给 Prompt 补充更多细节

2. SpringAI 核心特性

2.1 多轮对话实现

要实现具有 “记忆力” 的 AI 应用,让 AI 能够记住用户之前的对话内容并保持上下文连贯性,我们可以使用Spring AI 框架的 对话记忆能力

2.1.1 ChatClient 

之前我们是直接使用 Spring Boot 注入的 ChatModel 来调用大模型完成对话,而通过我们自己构造的 ChatClient,可实现功能更丰富、更灵活的 AI 对话客户端,也更推荐通过这种方式调用 AI。

通过示例代码,؜能够感受到 ChatMode⁠l 和 ChatClient 的‏区别。ChatClien‌t 支持更复杂灵活的链式调用‏(Fluent API):

// 基础用法(ChatModel)
ChatResponse response = chatModel.call(new Prompt("你好"));// 高级用法(ChatClient)
ChatClient chatClient = ChatClient.builder(chatModel).defaultSystem("你是恋爱顾问").build();String response = chatClient.prompt().user("你好").call().content();

2.1.2 构建方式‌

方式 1:构造器注入(Spring 项目专用)

服务类代码

@Service
public class CodeService {  // 类名贴合编程场景private final ChatClient chatClient;  // 配置好的AI编程工具// Spring自动传入建造者,只需配置编程助手身份public CodeService(ChatClient.Builder builder) {this.chatClient = builder.defaultSystem("你是编程助手,擅长Java、Python代码解答,会解释原理")  // 设定AI身份.build();  // 生成工具}// 对外提供编程问题查询方法public String askCodeQuestion(String question) {return chatClient.send(question);  // 调用工具发送问题}
}

控制器使用示例

@RestController
public class CodeController {@Autowired  // Spring自动注入CodeServiceprivate CodeService codeService;@GetMapping("/ask-code")public String askCode(String question) {// 调用服务获取AI的编程解答return codeService.askCodeQuestion(question);}
}

方式 2:建造者模式(非 Spring 项目用)

public class CodeDemo {public static void main(String[] args) {// 1. 准备基础AI模型(工具内核)ChatModel chatModel = new ChatModel("你的APIKey");// 2. 用建造者模式组装工具(设定编程助手身份)ChatClient chatClient = ChatClient.builder(chatModel).defaultSystem("你是编程助手,会写代码、查bug").build();// 3. 调用工具提问String answer = chatClient.send("Python怎么读取Excel文件?");System.out.println(answer);  // 输出AI的解答}
}

2.1.3 响应格式
// ChatClient支持多种响应格式
// 1. 返回 ChatResponse 对象(包含元数据如 token 使用量)
ChatResponse chatResponse = chatClient.prompt().user("Tell me a joke").call().chatResponse();// 2. 返回实体对象(自动将 AI 输出映射为 Java 对象)
// 2.1 返回单个实体
record ActorFilms(String actor, List<String> movies) {}
ActorFilms actorFilms = chatClient.prompt().user("Generate the filmography for a random actor.").call().entity(ActorFilms.class);// 2.2 返回泛型集合
List<ActorFilms> multipleActors = chatClient.prompt().user("Generate filmography for Tom Hanks and Bill Murray.").call().entity(new ParameterizedTypeReference<List<ActorFilms>>() {});// 3. 流式返回(适用于打字机效果)
Flux<String> streamResponse = chatClient.prompt().user("Tell me a story").stream().content();// 也可以流式返回ChatResponse
Flux<ChatResponse> streamWithMetadata = chatClient.prompt().user("Tell me a story").stream().chatResponse();

2.1.4 Advisors

Spring AI 使用 Advisors(顾问)机制来增强 AI 的能力,可以理解为一系列可插拔的拦截器,在调用 AI 前和调用 AI 后可以执行一些额外的操作,比如:

  • 前置增强:调用 AI 前改写一下 Prompt 提示词、检查一下提示词是否安全
  • 后置增强:调用 AI 后记录一下日志、处理一下返回的结果

关键组件解析

组件作用开发场景
Prompt原始用户输入开发者直接处理用户输入
AdvisedRequest增强的请求对象添加上下文/角色设定(如defaultSystem("恋爱顾问")
AroundAdvisor拦截器(AOP 思想)核心扩展点
• 日志记录
• 请求改写
• 权限校验
• 敏感词过滤
Chat ModelAI 模型接口对接 OpenAI/Anthropic 等大模型
ChatResponse原始 AI 响应包含元数据(token 用量等)
AdvisedResponse增强的响应对象结果格式化/业务逻辑封装

开发重点:AroundAdvisor(拦截器)

这是最强大的扩展点,可自定义处理逻辑:

  1.动态角色设定

// 在 Before 拦截器中
if(request.getUser().isPremium()) {request.setSystemRole("高级情感顾问");
} else {request.setSystemRole("基础情感助手");
}

 2.敏感词过滤

// 在 After 拦截器中
if(response.contains("暴力内容")) {return response.filterSensitiveWords();
}

 3.业务逻辑集成

// 调用前注入业务数据
request.addContext("用户订单历史: " + orderService.getHistory());

3. 总结

本文介绍了 Prompt 工程与 SpringAI 核心特性。Prompt 工程包括基本概念、三类 Prompt(用户、系统、助手)及优化技巧(明确任务角色、分步骤指导等)。SpringAI 核心特性涵盖多轮对话实现(ChatClient 的构建与使用)、多种响应格式,以及 Advisors 机制(通过拦截器增强 AI 能力),还解析了关键组件和开发重点,助力构建更高效的 AI 应用。


大功告成!

出处:编程导航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92033.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows wsl2-06-docker hello world

hello-world 例子 就像其他任何一门语言一样&#xff0c;我们来体验 docker 的 hello world $ docker run hello-world但是报错 :~$ docker run hello-world Unable to find image hello-world:latest locally docker: Error response from daemon: Get "https://registry…

Python知识点4-嵌套循环break和continue使用死循环

一、循环【重点掌握】 1.嵌套循环类似于嵌套if语句 语法&#xff1a; while 表达式1&#xff1a;while 表达式2&#xff1a;语句# 1. # 循环5次&#xff0c;打印0~4 m 0 while m < 5:print(m)m 1 # 循环3次&#xff0c;打印0~2 n 0 while n < 3:print(n)n 1print(&qu…

将HTML+JS+CSS数独游戏包装为安卓App

HTMLJSCSS制作一个数独游戏-CSDN博客 中开发了一个数独游戏&#xff0c;这个数独游戏提供了一次性回退到指定步骤的辅助功能&#xff0c;在解决复杂数独问题时十分有帮助&#xff0c;可作为玩数独游戏的辅助工具&#xff0c;因此&#xff0c;考虑将它改装成安卓App安装在手机上…

编程语言Java入门——核心技术篇(一)封装、继承和多态

同专栏基础知识篇写在这里&#xff0c;有兴趣的可以去看看&#xff1a; 编程语言Java入门——基础知识篇&#xff08;一&#xff09;-CSDN博客 编程语言Java入门——基础知识篇&#xff08;二&#xff09;-CSDN博客 编程语言Java入门——基础知识篇&#xff08;三&#xff0…

【39】MFC入门到精通——C++ /MFC操作文件行(读取,删除,修改指定行)

文章目录1 通过关键词&#xff0c;读取某一行 &#xff08;3种方法&#xff09;2 删除 指定行3 修改 指定行1 通过关键词&#xff0c;读取某一行 &#xff08;3种方法&#xff09; 通过定位关键词&#xff0c;读取某一行信息,返回CString //通过定位关键词&#xff0c;读取某…

5 种可行的方法:如何将 Redmi 联系人备份到 Mac

将 Redmi 联系人备份到 Mac 是防止因手机损坏、丢失或更换设备而导致数据丢失的重要措施。虽然云服务提供了便利性&#xff0c;但拥有离线备份可以提供额外的安全性&#xff0c;而无需完全依赖互联网。如果您想知道如何将 Redmi 联系人备份到 Mac&#xff0c;本文将为您介绍 5 …

LeRobot 具身智能机械臂 SO-ARM100 从搭建到训练全流程

今天给大家分享一下 LeRobot 具身智能机械臂 SO-ARM100 的完整使用流程&#xff0c;包括设备组装、环境配置、远程控制、数据录制到模型训练的全过程。适合刚入门具身智能的小伙伴参考学习。 一、前期准备与资源获取 在开始之前&#xff0c;我们需要准备好相关的资源和工具&a…

LINUX720 SWAP扩容;新增逻辑卷;逻辑卷扩容;数据库迁移;gdisk

SWAP空间扩展 方法一 增加硬盘或分区扩展 swap -s mkswap /dev/sdd6 blkid /dev/sdd6 swapon /dev/sdd6 swapon -s vim /etc/fstab /dev/sdd6 swap swap defaults 0 0 开机自动扩容 swap -s [rootweb ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sd…

Python 进程间通信:TCP安全加密数据传输

最近在写安全方面的程序&#xff0c;有需求&#xff0c;就做了这些TCP加密数据传输类。 utils.safeUtils的内容详见&#xff1a; SafeObj&#xff1a;Python 高安全性加密数据容器类-CSDN博客SafeKey&#xff1a;Python 高安全性加密密码容器类-CSDN博客 如有任何问题或漏洞欢迎…

Windows批量修改文件属性方法

标题使用icacls命令&#xff08;推荐批量操作&#xff09;打开管理员权限的命令提示符&#xff08;CMD&#xff09;执行以下命令&#xff1a;cmd icacls "文件夹路径" /grant 用户名:(OI)(CI)F /T /C 参数说明&#xff1a;(OI)&#xff1a;对象继承 - 适用于文件夹(C…

Entity Component System架构

ECS架构 1 简介 在当今快速发展的软件开发领域&#xff0c;游戏开发、实时模拟等场景对系统的性能、灵活性和可扩展性提出了极高的要求。传统的面向对象架构在面对复杂且动态变化的实体时&#xff0c;往往会出现代码耦合度高、扩展性差等问题。​ ECS&#xff08;Entity - Com…

.vscode 扩展配置

一、vue快捷键配置 在项目.vscode下新建vue3.0.code-snippets 每当输入vue3.0后自动生成代码片段 {"Vue3.0快速生成模板": {"scope": "vue","prefix": "Vue3.0","body": ["<template>"," &…

一个基于阿里云的C端Java服务的整体项目架构

1.背景介绍 总结一下工作使用到的基于通常的公有云的项目整体架构&#xff0c;如何基于公有云建设安全可靠的服务&#xff0c;以阿里云为例的整体架构&#xff1b;1. 全局流量治理层&#xff08;用户请求入口&#xff09;1.1 域名与 DNS 解析域名注册与备案&#xff1a;通过阿里…

《剥开洋葱看中间件:Node.js请求处理效率与错误控制的深层逻辑》

在Node.js的运行时环境中&#xff0c;中间件如同一系列精密咬合的齿轮&#xff0c;驱动着请求从进入到响应的完整旅程&#xff0c;而洋葱模型则是这组齿轮的传动系统。它以一种看似矛盾的方式融合了顺序与逆序、分离与协作——让每个处理环节既能独立工作&#xff0c;又能感知全…

GaussDB union 的用法

1 union 的作用union 运算符用于组合两个或更多 select 语句的结果集。2 union 使用前提union 中的每个 select 语句必须具有相同的列数这些列也必须具有相似的数据类型每个 select 语句中的列也必须以相同的顺序排列3 union 语法select column_name(s) from table1 union sele…

构建足球实时比分APP:REST API与WebSocket接入方案详解

在开发足球实时比分应用时&#xff0c;数据接入方式的选择直接影响用户体验和系统性能。本文将客观分析REST API和WebSocket两种主流接入方案的技术特点、适用场景和实现策略&#xff0c;帮助开发者做出合理选择。一、REST API&#xff1a;灵活的数据获取方案核心优势标准化接口…

Linux文件系统三要素:块划分、分区管理与inode结构解析

理解文件系统 我们知道文件可以分为磁盘文件和内存文件&#xff0c;内存文件前面我们已经谈过了&#xff0c;下面我们来谈谈磁盘文件。 目录 一、引入"块"概念 解析 stat demo.c 命令输出 基本信息 设备信息 索引节点信息 权限信息 时间戳 二、引入"分区…

基于paddleDetect的半监督目标检测实战

基于paddleDetect的半监督目标检测实战前言相关介绍前提条件实验环境安装环境项目地址使用paddleDetect的半监督方法训练自己的数据集准备数据分割数据集配置参数文件PaddleDetection-2.7.0/configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.ymlPa…

计算机网络:(十)虚拟专用网 VPN 和网络地址转换 NAT

计算机网络&#xff1a;&#xff08;十&#xff09;虚拟专用网 VPN 和网络地址转换 NAT前言一、虚拟专用网 VPN1. 基础概念与作用2. 工作原理3. 常见类型4. 协议对比二、NAT&#xff1a;网络地址转换1. 基础概念与作用2. 工作原理与类型3. 优缺点与问题4. 进阶类型三、VPN 与 N…

数位 dp

数位dp 特点 问题大多是指“在 [l,r][l,r][l,r] 的区间内&#xff0c;满足……的数字的个数、种类&#xff0c;等等。” 但是显然&#xff0c;出题人想要卡你&#xff0c;rrr 肯定是非常大的&#xff0c;暴力枚举一定超时。 于是就有了数位 dp。 基本思路 数位 dp 说白了…