Spring AI Advisor机制

article/2025/6/11 10:50:29

Spring AI Advisors 是 Spring AI 框架中用于拦截和增强 AI 交互的核心组件,其设计灵感类似于 WebFilter,通过链式调用实现对请求和响应的处理5。以下是关键特性与实现细节:

核心功能

‌1. 请求/响应拦截‌

  • 通过 AroundAdvisor 接口动态修改聊天请求(AdvisedRequest)和响应(AdvisedResponse),支持日志记录、内容转换等场景。
  • 处理流程遵循责任链模式,请求按顺序通过所有 Advisor,响应则逆序返回。

2‌. 上下文共享‌

  • 通过 AdvisorContext(一个 Map<String, Object>)在 Advisor 链中传递数据,实现跨拦截器的状态共享。

3‌. 多模型兼容性‌

  • 封装通用 AI 模式(如记忆管理、日志记录),确保代码可复用且兼容不同大模型(如 GPT、Claude、通义千问等)16。

典型应用

‌- 记忆管理‌:通过 MessageChatMemoryAdvisor 保存对话历史,实现多轮上下文关联7。
‌- 日志记录‌:内置 SimpleLoggerAdvisor 可记录交互详情,便于调试7。
‌- 动态提示词修改‌:在请求链中实时调整发送给大模型的提示内容58。

配置示例

// 添加记忆和日志 Advisor
chatClient.prompt().user(message).advisors(new MessageChatMemoryAdvisor(chatMemory),new SimpleLoggerAdvisor()).call();
var chatClient = ChatClient.builder(chatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build(), // chat-memory advisorQuestionAnswerAdvisor.builder((vectorStore).builder() // RAG advisor).build();var conversationId = "678";String response = this.chatClient.prompt()// Set advisor parameters at runtime.advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, conversationId)).user(userText).call().content();

核心组件

由非流式处理方案和 for 流式处理方案组成。 它还包括表示 Chat Completion 响应的未密封 Prompt 请求。两者都在 advisor 链中持有 to share 状态。
CallAroundAdvisor CallAroundAdvisorChain StreamAroundAdvisor StreamAroundAdvisorChain AdvisedRequest AdvisedResponse advise-context
在这里插入图片描述
关键 advisor 方法,通常执行各种作,例如检查未密封的 Prompt 数据、自定义和扩充 Prompt 数据、调用 advisor 链中的下一个实体、选择性地阻止请求、检查聊天完成响应以及引发异常以指示处理错误。nextAroundCall() nextAroundStream()
此外,该方法确定链中的 advisor 顺序,同时提供唯一的 advisor 名称。getOrder() getName()
由 Spring AI 框架创建的 Advisor 链允许按顺序调用多个按其值排序的 advisor。 首先执行较低的值。 自动添加的最后一个 advisor 将请求发送到 LLM。getOrder()

以程图说明了Advisor链和聊天模型之间的交互:
在这里插入图片描述

  1. Spring AI 框架创建一个 from user’s 以及一个空对象。AdvisedRequestPromptAdvisorContext
  2. 链中的每个 advisor 都会处理请求,并可能对其进行修改。或者,它也可以选择通过不调用下一个实体来阻止请求。在后一种情况下,Advisor负责填写回复。
  3. 框架提供的最后一个 advisor 将请求发送到 .Chat Model
  4. 然后,聊天模型的响应将通过Advisor链传回并转换为 .later 包括共享实例。AdvisedResponseAdvisorContext
  5. 每个Advisor都可以处理或修改响应。
  6. final 通过提取 .AdvisedResponseChatCompletion

API 概述

主要的 Advisor 。以下是在创建自己的 advisor 时会遇到的关键界面:org.springframework.ai.chat.client.advisor.api

public interface Advisor extends Ordered {String getName();
}

同步和反应式 Advisor 的两个子接口是

public interface CallAroundAdvisor extends Advisor {/*** Around advice that wraps the ChatModel#call(Prompt) method.* @param advisedRequest the advised request* @param chain the advisor chain* @return the response*/AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain);}

public interface StreamAroundAdvisor extends Advisor {/*** Around advice that wraps the invocation of the advised request.* @param advisedRequest the advised request* @param chain the chain of advisors to execute* @return the result of the advised request*/Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain);}

要继续 Advice 链,请在 Advice 实现中使用 :CallAroundAdvisorChain StreamAroundAdvisorChain

这些接口包括

public interface CallAroundAdvisorChain {AdvisedResponse nextAroundCall(AdvisedRequest advisedRequest);
}

public interface StreamAroundAdvisorChain {Flux<AdvisedResponse> nextAroundStream(AdvisedRequest advisedRequest);
}

Advisor

要创建 advisor,请实现一下。要实现的关键方法是针对非流式处理或流式处理Advisor。CallAroundAdvisor StreamAroundAdvisor nextAroundCall() nextAroundStream()

日志记录样例:

可以实现一个简单的日志 advisor,记录对链中下一个 advisor 的调用之前和之后。 请注意,advisor 仅观察请求和响应,不会修改它们。 此实现支持非流式处理和流式处理方案。AdvisedRequest AdvisedResponse

public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class);@Overridepublic String getName() {return this.getClass().getSimpleName();}@Overridepublic int getOrder() {return 0;}@Overridepublic AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {logger.debug("BEFORE: {}", advisedRequest);AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest);logger.debug("AFTER: {}", advisedResponse);return advisedResponse;}@Overridepublic Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {logger.debug("BEFORE: {}", advisedRequest);Flux<AdvisedResponse> advisedResponses = chain.nextAroundStream(advisedRequest);return new MessageAggregator().aggregateAdvisedResponse(advisedResponses,advisedResponse -> logger.debug("AFTER: {}", advisedResponse));}
}
  1. 为 advisor 提供唯一名称。
  2. 可以通过设置 order 值来控制执行顺序。较低的值首先执行。
  3. 它是一个实用程序类,用于将 Flux 响应聚合到单个 AdvisedResponse 中。 这对于记录或其他观察整个响应而不是流中单个项目的处理非常有用。 请注意,不能更改 中的响应,因为它是只读作。MessageAggregator MessageAggregator

重读 (Re2) Advisor

“Re-Reading Improves Reasoning in Large Language Models” 一文介绍了一种称为 Re-Reading (Re2) 的技术,该技术可以提高大型语言模型的推理能力。 Re2 技术需要像这样扩充输入提示:

{Input_Query}
Read the question again: {Input_Query}

实现将 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();}
}
  1. 该方法应用 Re-Reading 技术来增强用户的输入查询。before
  2. 该方法拦截非流式处理请求并应用 Re-Reading 技术。aroundCall
  3. 该方法拦截流请求并应用 Re-Reading 技术。aroundStream
  4. 可以通过设置 order 值来控制执行顺序。较低的值首先执行。
  5. 为 advisor 提供唯一名称。

内置Advisor程序

Spring AI 框架提供了几个内置的Advisor程序来增强您的 AI 交互。以下是可用Advisor的概述:

聊天记忆Advisor
这些Advisor在聊天内存存储中管理对话历史记录:

  • MessageChatMemoryAdvisor
    检索内存并将其作为消息集合添加到提示符中。此方法维护会话历史记录的结构。请注意,并非所有 AI 模型都支持此方法。
  • PromptChatMemoryAdvisor
    检索内存并将其合并到提示的系统文本中。
  • VectorStoreChatMemoryAdvisor
    从 VectorStore 中检索内存,并将其添加到提示符的系统文本中。此 advisor 可用于从大型数据集中高效搜索和检索相关信息。

问题解答Advisor

  • QuestionAnswerAdvisor
    此 advisor 使用向量存储来提供问答功能,实现 RAG(检索增强生成)模式。

内容安全Advisor

  • SafeGuardAdvisor
    一个简单的 advisor,旨在防止模型生成有害或不适当的内容。
MessageChatMemoryAdvisor

Spring AI中的MessageChatMemoryAdvisor是一个关键组件,主要用于管理AI应用中的聊天记忆和上下文增强。以下是其核心特性和工作原理:
‌1. 基本功能‌

  • 负责将用户提问和AI回复存入历史记录,形成上下文记忆链
  • 通过维护对话状态提升聊天机器人的连贯性和相关性
  1. 工作流程‌
  • 采用链式处理结构,作为请求/响应流程的中间件
  • 处理流程:接收请求 → 存储用户消息 → 传递修改后的请求 → 接收响应 → 存储AI回复
  1. 技术实现‌
  • 继承自AroundAdvisor基类,支持请求/响应的动态修改
  • 与ChatMemory组件协同工作,支持多种存储后端(内存/JDBC/Neo4j等)
  1. 典型应用场景‌
  • 多轮对话系统中保持上下文一致性
  • 实现角色预设(通过SystemMessage)
  • 控制对话窗口大小(如GPT模型的token限制)
PromptChatMemoryAdvisor

PromptChatMemoryAdvisor是Spring AI框架中用于管理对话上下文的核心组件,主要功能是将历史对话信息动态注入到当前提示词中23。以下是其关键特性:

1‌. 核心功能‌

  • 自动检索与当前会话ID关联的历史消息
  • 将历史消息注入系统提示文本(SystemMessage),增强AI模型的上下文理解能力
  • 支持通过ChatMemory接口实现多种存储策略(内存/JDBC/向量库等)
  1. 技术实现‌
  • 基于Spring AOP的AroundAdvisor机制拦截请求/响应流程
  • 默认使用InMemoryChatMemory存储对话记录
  • 通过CONVERSATION_ID标识会话(原CHAT_MEMORY_CONVERSATION_ID_KEY)
  1. 配置参数‌
  • TOP_K参数控制历史消息检索数量(原CHAT_MEMORY_RETRIEVE_SIZE_KEY)
  • DEFAULT_TOP_K默认值从100调整为20
  • 支持通过SystemMessage设定对话角色和规则
VectorStoreChatMemoryAdvisor
核心功能

1‌. 长期记忆管理‌
通过向量数据库存储历史对话记录,实现跨会话的上下文记忆功能
支持语义检索相似历史消息,增强模型对用户意图的理解能力

2‌. 工作流程‌

  • 检索阶段‌:从向量库中检索与当前会话相关的历史消息
  • 提示增强‌:将检索结果注入系统提示文本,构建上下文感知的输入
  • 存储阶段‌:自动保存新生成的对话记录到向量数据库
  1. 技术特性
  • 向量存储集成‌
    支持多种向量数据库(如Azure Cosmos DB、Weaviate等),通过语义相似度检索历史消息
    默认检索结果数量从100条优化为20条(DEFAULT_TOP_K参数)
  • 提示模板定制‌
    使用独立占位符模板long_term_memory管理长期记忆的注入逻辑
应用场景
  • 多轮复杂对话‌
    解决LLM无状态限制,保持跨会话的连贯性35
  • RAG增强‌
    与RetrievalAugmentationAdvisor协同实现检索增强生成5
配置要点
// 示例配置代码
@Bean
VectorStoreChatMemoryAdvisor advisor(VectorStore vectorStore, ChatMemory chatMemory // 需配合MessageWindowChatMemory等实现
) {return new VectorStoreChatMemoryAdvisor(vectorStore, chatMemory);
}
QuestionAnswerAdvisor
核心功能

‌1. RAG流程封装‌
实现检索增强生成(Retrieval-Augmented Generation)全流程,包括知识库检索、上下文拼接和回答生成38
当用户提问时,自动从向量数据库检索相似文档,并作为上下文注入提示词310

‌2. 智能拒答机制‌
若知识库检索结果相似度低于阈值(默认0.5),可能直接拒绝回答而非生成错误信息28

技术实现
  • 检索优化‌

    • 支持配置similarityThreshold(相似度阈值)和topK(返回结果数量)参数,平衡精度与召回率
    • 通过EmbeddingModel将用户问题向量化后执行语义搜索
  • 提示工程‌
    内置默认系统提示模板,动态组合以下要素:

    • 用户原始问题
    • 检索到的相关文档
    • 生成格式约束
典型配置示例
@Bean
QuestionAnswerAdvisor advisor(VectorStore vectorStore, EmbeddingModel embeddingModel
) {return QuestionAnswerAdvisor.builder(vectorStore).searchRequest(SearchRequest.builder().similarityThreshold(0.6)  // 调高精度要求.topK(5)                   // 限制返回条目数.build()).build();
}

该组件与VectorStoreChatMemoryAdvisor协同工作时,可同时实现短期对话记忆和长期知识检索。

SafeGuardAdvisor

以下是关于Spring AI中SafeGuardAdvisor的详细解析:

核心功能

‌1. 敏感内容拦截‌
自动检测用户输入中的敏感词(如政治、暴力等违规内容),触发拦截时直接终止请求处理流程
支持自定义敏感词库,可通过动态更新适配不同业务场景的合规要求

‌2. 资源保护机制‌
在请求被标记为敏感时,立即阻断后续模型调用,避免不必要的计算资源消耗
与日志审计模块联动,记录完整的拦截事件信息供合规审查

技术实现
  • 多级过滤管道‌
    采用正则表达式匹配结合语义分析(需集成NLP模型)实现高精度检测
    支持配置白名单机制,允许特定角色绕过敏感词检查

  • 轻量级拦截器‌
    基于Spring AOP实现,对原有业务逻辑侵入性低,平均延迟增加<5ms
    默认集成到ChatClient的请求处理链中,优先级通常设为最高

典型配置示例
@Bean
SafeGuardAdvisor safeGuardAdvisor() {return SafeGuardAdvisor.builder().blockThreshold(0.8)    // 敏感词置信度阈值.customBlockWords(List.of("内部资料")) // 追加自定义敏感词.build();
}

该组件常与QuestionAnswerAdvisor组合使用,形成"先过滤后增强"的安全处理链路。在金融、医疗等强监管领域应用尤为广泛。

流式处理与非流式处理

在这里插入图片描述

  • 非流式处理Advisor处理完整的请求和响应。
  • Streaming advisor 使用反应式编程概念(例如,用于响应的 Flux)将请求和响应作为连续流处理。
@Override
public Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {return  Mono.just(advisedRequest).publishOn(Schedulers.boundedElastic()).map(request -> {// This can be executed by blocking and non-blocking Threads.// Advisor before next section}).flatMapMany(request -> chain.nextAroundStream(request)).map(response -> {// Advisor after next section});
}

最佳实践

  1. 让Advisor专注于特定任务,以实现更好的模块化。
  2. 必要时使用 to share state between advisors。adviseContext
  3. 实施 advisor 的流式处理和非流式处理版本,以实现最大的灵活性。
  4. 仔细考虑 Advisor 在供应链中的顺序,以确保数据正常流动。

http://www.hkcw.cn/article/gSPKIQGRPt.shtml

相关文章

GPTBots在AI大语言模型应用中敏感数据匿名化探索和实践

背景 随着人工智能技术的快速发展&#xff0c;尤其是大语言模型&#xff08;LLM-large language model&#xff09;在金融、医疗、客服等领域的广泛应用&#xff0c;处理海量数据已成为常态。然而&#xff0c;这些数据中往往包含个人可识别信息&#xff08;PII-Personally Ide…

使用 C++/OpenCV 制作跳动的爱心动画

使用 C/OpenCV 制作跳动的爱心动画 本文将引导你如何使用 C 和 OpenCV 库创建一个简单但有趣的跳动爱心动画。我们将通过绘制参数方程定义的爱心形状&#xff0c;并利用正弦函数来模拟心跳的缩放效果。 目录 简介先决条件核心概念 参数方程绘制爱心动画循环模拟心跳效果 代码…

入门AJAX——XMLHttpRequest(Get)

一、什么是 AJAX AJAX Asynchronous JavaScript And XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 1、XML与异步JS XML: 是一种比较老的前后端数据传输格式&#xff08;已经几乎被 JSON 代替&#xff09;。它的格式与HTML类似&#xff0c;通过严格的闭合自定义标…

MDP的observations部分

文章目录 1.isaaclab的observations1.1 根状态相关观测base_pos_zbase_lin_vel &#xff08;use&#xff09;base_ang_vel &#xff08;use&#xff09;projected_gravity (use)root_pos_wroot_quat_wroot_lin_vel_wroot_ang_vel_w 1.2 关节状态相关观测joint_posjoint_pos_rel…

Rhino插件大全下载指南:解锁犀牛潜能,提升设计效率

Rhinoceros&#xff08;简称Rhino&#xff0c;犀牛&#xff09;以其强大的NURBS曲面建模能力、灵活的脚本环境以及与Grasshopper参数化设计工具的无缝集成&#xff0c;在全球工业设计、建筑设计、珠宝设计、船舶设计等领域备受推崇。为了进一步拓展Rhino的功能&#xff0c;满足…

百万级临床试验数据库TrialPanorama发布!AI助力新药研发与临床评价迎来新基石

2025年5月22日&#xff0c;伊利诺伊大学厄巴纳-香槟分校的研究团队在《arXiv》上发表了一篇前瞻性研究论文《TrialPanorama: Database and Benchmark for Systematic Review and Design of Clinical Trials》&#xff0c;该研究建立了一个临床试验数据库TrialPanorama&#xff…

运维 vm 虚拟机ip设置

虚拟网络设置 nat 模式 网卡 主机设置网卡地址 虚拟机绑定网卡

问题七、isaacsim中添加IMU传感器

0 前言 NVIDIA Isaac Sim 中的 IMU 传感器可跟踪车身运动并输出模拟加速度计和陀螺仪读数。与真实 IMU 传感器一样,模拟 IMU 可通过平台单元提供局部 x、y、z 轴的加速度和角速度测量值。 1 创建IMU传感器 按照下述步骤依次点击 使用python创建 基于IsaacSensorCreateImuSe…

AutoGenTestCase - 借助AI大模型生成测试用例

想象一下&#xff0c;你正在为一个复杂的支付系统编写测试用例&#xff0c;需求文档堆积如山&#xff0c;边缘场景层出不穷&#xff0c;手动编写让你焦头烂额。现在&#xff0c;有了AutoGenTestCase&#xff0c;这个AI驱动的“测试用例生成机”可以从需求文档中自动生成数百个测…

警惕假冒 CAPTCHA 攻击通过多阶段payload链部署远控和盗窃信息

在过去几个月中&#xff0c;Trend Micro 托管检测与响应&#xff08;MDR&#xff09;调查中发现假冒 CAPTCHA 的案例激增。这些 CAPTCHA 通过钓鱼邮件、URL 重定向、恶意广告或 SEO 污染投放。所有观察到的案例均表现出类似行为&#xff1a;指导用户将恶意命令复制粘贴到 Windo…

2024-2025-2-《移动机器人设计与实践》-复习资料-8……

2024-2025-2-《移动机器人设计与实践》-复习资料-1-7-CSDN博客 08 移动机器人基础编程 单选题&#xff08;6题&#xff09; 在ROS中&#xff0c;用于移动机器人速度控制的消息类型通常是&#xff1f; A. std_msgs/StringB. geometry_msgs/TwistC. sensor_msgs/ImageD. nav_ms…

楼宇自控系统赋能设备管理智能化集中化,驱动建筑节能高效运行

在建筑行业追求可持续发展与高效运营的当下&#xff0c;传统建筑设备管理模式因信息分散、调控粗放等问题&#xff0c;导致能源浪费严重、设备维护成本高企。而楼宇自控系统凭借对建筑内各类设备的智能化、集中化管理能力&#xff0c;成为解决这些难题的关键。通过实时监测、智…

三、kafka消费的全流程

五、多线程安全问题 1、多线程安全的定义 使用多线程访问一个资源&#xff0c;这个资源始终都能表现出正确的行为。 不被运行的环境影响、多线程可以交替访问、不需要任何额外的同步和协同。 2、Java实现多线程安全生产者 这里只是模拟多线程环境下使用生产者发送消息&…

集合类基础概念

目录 集合类概述 集合框架的体系结构 单列集合&#xff08;Collection&#xff09; List接口 Set接口 双列集合&#xff08;Map&#xff09; Map接口 线程安全与性能考虑 集合与数组的区别 大小是否固定 数据类型与存储 操作方法丰富性 内存与性能 类型安全与泛型…

1500多个免费的HTML模板

1500多个免费的HTML模板 用于网站&#xff0c;着陆页&#xff0c;博客&#xff0c;投资组合&#xff0c;电子商务和管理仪表板 Free HTML Website Templates on HTMLrev https://htmlrev.com/

博客操作规范

一、博客内容规范 专有名词&#xff1a;深蓝粗体&#xff0c;一级专有名词。 专有名词&#xff1a;靛蓝粗体&#xff0c;二级专有名词。 一般名词&#xff1a;浅蓝粗体&#xff0c;一般名词。 标记名词&#xff0c;蓝色粗体&#xff0c;标记性的名词。 重点句子&#xff1…

秋招Day12 - 计算机网络 - IP

IP协议的定义和作用&#xff1f; IP协议用于在计算机网络中传递数据包&#xff0c;定义了数据包的格式和处理规则&#xff0c;确保数据能够从一个设备传递到另一个设备&#xff0c;中间可能经过多个不同的设备&#xff08;路由器&#xff09;。 IP协议有哪些作用&#xff1f;…

电阻电容的选型

一、电阻选型 1.1安装方式 贴片电阻体积小&#xff0c;适用于SMT生产&#xff1b;功率小&#xff1b;易拆解插件电阻体积大&#xff1b;功率大&#xff1b;不易脱落 1.2阻值 电阻的阻值是离散的&#xff0c;其标称阻值根据精度分为E6、E12、E24、E48、E96、E192六大系列&am…

【网络安全】SRC漏洞挖掘思路/手法分享

文章目录 Tip1Tip2Tip3Tip4Tip5Tip6Tip7Tip8Tip9Tip10Tip11Tip12Tip13Tip14Tip15Tip16Tip17Tip18Tip19Tip20Tip21Tip22Tip23Tip24Tip25Tip26Tip27Tip28Tip29Tip30Tip1 “复制该主机所有 URL”:包含该主机上的所有接口等资源。 “复制此主机里的链接”:包括该主机加载的第三…

论文中pdf图片文件太大怎么办

文章目录 1.使用pdf文件的打印功能将文件导出2.操作3.前后文件大小对比 1.使用pdf文件的打印功能将文件导出 该方法在保证清晰度的同时&#xff0c;内存空间也能实现减少&#xff08;如果使用线上的压缩pdf工具&#xff0c;清晰度会直线下降&#xff09; 2.操作 点击文件—&…