Spring AI alibaba Prompt模板Advisor自定义 - 实践

news/2025/10/27 17:22:12/文章来源:https://www.cnblogs.com/gccbuaa/p/19169673

本文为个人学习笔记整理,仅供交流参考,非专业教学资料,内容请自行甄别。

文章目录

  • 前言
  • 一、Prompt
  • 二、Prompt模板化配置
  • 三、Advisor
  • 四、自定义Advisor


前言

  本篇主要介绍Spring AI alibaba Prompt的概念,以及如何模板化配置,自定义Advisor拦截器。

一、Prompt

  Prompt是提示词,简单来说,每次使用AI,在对话框中输入的提问内容,对于大模型来说就是提示词。
在这里插入图片描述
  提示词也可以进行细分,主要可分为以下三种类型:

  这三类提示词在代码中的体现,都实现了Message接口:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、Prompt模板化配置

  在AI应用开发中,需要定义系统提示词。可以将提示词作为常量定义,或者保存在数据库中。Spring AI的官方提供了模板化配置的功能。模板化配置
  Spring AI 中快速模板化的一个关键组件是PromptTemplate类,旨在方便创建结构化提示,然后发送到人工智能模型进行处理。
在这里插入图片描述
  Spring AI 提供了PromptTemplate的不同实现类,对应不同角色的消息:

  同时Spring AI 支持从模板文件中读取Prompt信息,并且动态替换占位符的功能,首先在项目的resources目录下定义一个文件:system-message.st,文件中的内容带有占位符:

“扮演深耕{field}领域的专家。开场向用户表明身份,告知用户可倾诉{type}难题。引导用户详述事情经过、对方反应及自身想法,以便给出专属解决方案。”

  因为上述的文案,是给AI大模型预设的,所以应该构造一个SystemPromptTemplate,并且将读取到的文件内容赋值给它:

@Value("classpath:/promts/system-message.st")
Resource systemResource;
//.....
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);

  然后使用SystemPromptTemplatecreateMessageAPI,进行占位符填充,并获取最终的提示词。

String text = systemPromptTemplate.createMessage(Map.of("field", "JAVA编程", "type", "学习方向")).getText();

三、Advisor

  Spring AI中的Advisor,相当于Spring 的AOP切面,允许用户在调用大模型前后,执行一些操作,getOrder()方法决定多个Advisor组成的责任链的执行顺序(较低的值首先被执行),而getName()则是提供一个自定义的名称。
在这里插入图片描述
  它有两个实现类,分别是CallAroundAdvisorStreamAroundAdvisor。代表了不同的模式(流式或非流式)。用户在自定义实现时最好两个都要实现。
在这里插入图片描述
  和Spring 的 AOP切面一样,多个Advisor会组成责任链,责任链和大模型之间的交互:

  1. Spring AI从用户的Prompt提示词,创建一个ChatClientRequest ,并且创建一个context 上下文对象,用于在整个责任链中进行消息传递。
  2. 链中的每个Advisor都会处理请求,并可能对请求的内容进行修改。也可以直接拦截请求,不向下一个Advisor传递,并且构造响应,返回结果。
  3. 由框架提供的最终Advisor将请求发送至大模型。
  4. 模型的响应随后通过责任链进行传递并转化为ChatClientResponse(包含了context 上下文对象),每个后置的Advisor也可以对响应进行处理。
  5. 最终的ChatClientResponse通过提取ChatCompletion返回客户端。

  Spring AI提供了一些内置的Advisor,对功能进行扩展:

在这里插入图片描述
日志拦截器,在请求和响应时打印日志,但是级别是debug
在这里插入图片描述
敏感词拦截器,拦截用户自定义的敏感词,如果发现用户提问包含敏感词,就直接拦截,构造响应返回给用户,响应内容也是可以用户自定义的

  可以通过ChatClientdefaultAdvisorsAPI,加入自定义的拦截器。

chatClient = ChatClient.builder(
dashScopeChatModel
).defaultSystem(text)
//基于数据库的会话记忆保存
.defaultAdvisors(new MessageChatMemoryAdvisor(dbBasedChatMemory),
//自定义日志拦截器
new MyLogAdvisor(),
//敏感词检测
new SensitiveWordCheckAdvisor())
.build();

四、自定义Advisor

  用户自定义Advisor,最好需要同时实现CallAroundAdvisor, StreamAroundAdvisor两个接口,分别重写流式和非流式的相关方法,例如自定义的日志拦截器:

/**
* 自定义日志拦截器
*/
@Slf4j
public class MyLogAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {
@Override
public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {
//前置增强
log.info("自定义日志拦截器,AI request:{}",advisedRequest.userText());
//调用下一个拦截器
AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest);
//后置增强
log.info("自定义日志拦截器,AI response:{}",advisedResponse.response().getResult().getOutput().getText());
return advisedResponse;
}
@Override
public Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {//前置增强log.info("自定义日志拦截器,AI request:{}",advisedRequest.userText());Flux<AdvisedResponse> advisedResponseFlux = chain.nextAroundStream(advisedRequest);return new MessageAggregator().aggregateAdvisedResponse(advisedResponseFlux, new Consumer<AdvisedResponse>() {@Overridepublic void accept(AdvisedResponse advisedResponse) {//后置增强log.info("自定义日志拦截器,AI response:{}",advisedResponse.response().getResult().getOutput().getText());}});}@Overridepublic String getName() {return this.getClass().getSimpleName();}@Overridepublic int getOrder() {return 0;}}

  自定义Re2拦截器,其实现方式是取出用户的提问词,然后重复发给AI。但是每次用户的对话是需要消耗token的,这样的做法相当于消耗了双倍的token。

/**
* 自定义 Re2 Advisor
* 可提高大型语言模型的推理能力
*/
public class ReReadingAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {
private AdvisedRequest before(AdvisedRequest advisedRequest) {
Map<String, Object> advisedUserParams = new HashMap<>(advisedRequest.userParams());advisedUserParams.put("re2_input_query", advisedRequest.userText());return AdvisedRequest.from(advisedRequest).userText("""{re2_input_query}Read the question again: {re2_input_query}""").userParams(advisedUserParams).build();}@Overridepublic AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {return chain.nextAroundCall(this.before(advisedRequest));}@Overridepublic Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {return chain.nextAroundStream(this.before(advisedRequest));}@Overridepublic int getOrder() {return 0;}@Overridepublic String getName() {return this.getClass().getSimpleName();}}

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

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

相关文章

11-文件上传

11-文件上传$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");文件上传和下载的原理文件上传从浏览器上传文件的时候需要对文件进行限制 这个限制是在配置文件…

wqe

wqe报告名称:AR(Active Area Reverse)fin cut工艺业务需求与数据目标报告(深度调研增强版) 版本:V1.2 日期:2025-9-4 编制人:[李晓睿/数字智能部] 审核人:[姓名/部门] 引言 1.1 背景与业务场景项目发起背景(…

集采带量下医疗器械生产厂家如何通过数字化转型实现降本增效

数字化管理系统正在成为医疗器械生产厂家应对集采挑战的“手术刀”,精准切除管理冗余和效率低下的痛点。数字化管理系统正在成为医疗器械生产厂家应对集采挑战的“手术刀”,精准切除管理冗余和效率低下的痛点。 “订…

告别命名误区!深度剖析TurtleBot3 vs. TurtleBot4 开源平台

一. TurtleBot3与TurtleBot4非“前任”与“继任”的关系 在高校机器人科研与教学领域,TurtleBot系列一直是ROS入门与原型验证的热门选择。当TurtleBot4推出后,许多老师不禁产生一个疑问:是否TurtleBot3已经过时?命…

2025年锌铝镁桥架公司、口碑好的锌铝镁桥架品牌、行业内锌铝镁桥架供应商、锌铝镁桥架公司推荐榜、靠谱的锌铝镁桥架供应厂家综合评测

文章摘要 锌铝镁桥架作为电缆敷设的关键组件,在2025年随着基础设施建设和智能电网发展,行业需求持续增长,预计市场规模年复合增长率达8%-10%。本文基于行业数据、用户口碑和公司实力,综合评测前十名锌铝镁桥架供应…

嵌入式基础--第七周作业--OLED显示

一.I2C协议的基本原理和时序协议 一、I2C 协议的基本原理 I2C协议的核心设计思想是用最少的连线实现多个器件之间的通信。它只需要两根线:SDA:串行数据线,用于传输数据。SCL:串行时钟线,用于同步时钟。核心特性 半…

TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

102302105汪晓红作业1

作业1 作业①:用requests和BeautifulSoup库方法定向爬取给定网址 http://www.shanghairanking.cn/rankings/bcur/2020 的数据,屏幕打印爬取的大学排名信息。 代码与结果 核心代码:点击查看代码#设置headers,模拟浏览…

【IEEE出版 | 重庆邮电大学主办 | 多届次、高层次】第六届人工智能与计算机工程国际学术会议(ICAICE 2025)

第六届人工智能与计算机工程国际学术会议(ICAICE 2025)将于2025年11月7-9日在重庆召开。【早鸟优惠、学生优惠、团队优惠、学生友好】 【重庆邮电大学主办|多届次、高层次】 第六届人工智能与计算机工程国际学术会议…

普通幂转下降幂

一个 trick。更新日志 2025/10/27:开工。概念 一个小 trick,利用第二类斯特林数将普通幂转化成下降幂。 思路 \[v^k=\sum_{i=0}^{\min(v,k)} {k\brace i}v^{\underline{i}}=\sum_{i=0}^{\min(v,k)}{k\brace i}\binom…

解决Java项目在复杂网络环境下访问外网不通的问题

解决Java项目在复杂网络环境下访问外网不通的问题 问题描述 在企业内部或本地开发环境中,Java项目经常遇到无法访问外网API或资源的情况。这是由于复杂的网络环境导致的,常见的网络限制包括:防火墙策略限制 代理服务…

私有2.4G无线对讲机方案:BLE芯片+PA芯片

在许多需要团队协作的场景中,清晰、即时、稳定的沟通是效率和安全的关键。传统对讲机笨重、频道申请麻烦;而手机通话则成本高、组群不便,在复杂环境中信号更是堪忧。在商场、仓库、景区等场景中,即时通信的稳定性与…

PyCharm 2024超详细下载安装教程(附安装包+激活教程)超详细图文步骤

目录一、PyCharm 2024 介绍二、PyCharm 2024安装包网盘下载三、PyCharm 2024 安装教程及激活教程1.解压PyCharm 2024安装包2.启动PyCharm 2024安装程序3.点下一步4.选PyCharm 2024安装位置5.勾选PyCharm 2024安装选项6…

发布会回顾|袋鼠云发布多模态数据中台,重构AI时代的数据底座

在AI全面渗透产业的浪潮中,数据平台的能力边界正在被重新定义。在2025袋鼠云秋季数智发布会上,袋鼠云重磅发布“数栈多模态数据中台”,标志着数栈正式完成从结构化数据中台向AI时代“全模态、全场景”的全面升级。袋…

Docker容器里面部署的Jenkins的Java17升级到21版本(无需删除之前容器,内部在线升级) - 攻城狮

发现Jenkins出现了如此提示: Java 17 end of life in JenkinsYou are running Jenkins on Java 17, support for which will end on or after Mar 31, 2026. Refer to the documentation for more details. 原因是ja…

布谷直播系统源码:高并发直播架构设计到搭建部署配置

在移动互联网时代,直播已成为内容传播、电商带货和社交互动的核心载体。面对动辄百万甚至千万级的瞬时用户涌入,如何构建一个稳定、流畅、可扩展的高并发直播系统,是每个技术团队必须攻克的堡垒。山东(泰安)布谷科技…

25.10.27联考题解

CF2110D 求最小值的问题可以考虑转化成二分答案然后判断合法性。于是先二分答案,然后发现判断合法性本质就是判断连通性,因为是 DAG 于是考虑拓扑排序维护到一个点的合法最大值即可。 B 考虑 \(k=0\) 怎么做?我们直…

医疗器械行业数字化破局:一体化平台正在淘汰多系统集成模式

当“系统集成”消耗企业30%IT预算的时代即将结束,一体化架构正重新定义医疗供应链数字化当“系统集成”消耗企业30%IT预算的时代即将结束,一体化架构正重新定义医疗供应链数字化 “我们使用了五套系统,CRM管客户、E…

报表知识

FORM frm_pf_status USING lt_status_name TYPE slis_t_extab. SET PF-STATUS PF_1000EXCLUDING lt_status_name. . ENDFORM. DATA: gt_excluding TYPE slis_t_extab. " ALV工具栏按钮排除表 CLEAR gt_excluding…