defaultAdvisors()
方法注册增强器。
增强器也参与可观察性堆栈,因此您可以查看与其执行相关的指标和跟踪。
核心组件
API 包含用于非流式场景的CallAroundAdvisor
和 CallAroundAdvisorChain
,以及用于流式场景的 StreamAroundAdvisor
和 StreamAroundAdvisorChain
。
它还包括 AdvisedRequest
用于表示未密封的 Prompt 请求,AdvisedResponse
用于 Chat Completion 响应。两者都包含一个 advise-context
用于在增强器链中共享状态。

Advisors API 类
nextAroundCall()
和 nextAroundStream()
是关键增强器方法,通常执行诸如检查未密封的 Prompt 数据、自定义和增强 Prompt 数据、调用增强器链中的下一个实体、可选地阻止请求、检查聊天完成响应以及抛出异常以指示处理错误等操作。
此外,getOrder()
方法确定增强器在链中的顺序,而 getName()
提供唯一的增强器名称。
由 Spring AI 框架创建的增强器链允许按 getOrder()
值排序的多个增强器顺序调用。
较低的值首先执行。
最后一个增强器(自动添加)将请求发送到 LLM。
以下流程图说明了增强器链与聊天模型之间的交互:

Advisors API 流程
1
创建请求
Spring AI 框架从用户的
Prompt
创建一个 AdvisedRequest
,同时创建一个空的 AdvisorContext
对象。2
处理请求
链中的每个增强器处理请求,可能会修改它。或者,它可以选择通过不调用下一个实体来阻止请求。在后一种情况下,增强器负责填写响应。
3
发送请求
框架提供的最后一个增强器将请求发送到
Chat Model
。4
创建响应
聊天模型的响应然后通过增强器链传回并转换为
AdvisedResponse
。后者包括共享的 AdvisorContext
实例。5
处理响应
每个增强器可以处理或修改响应。
6
返回响应
通过提取
ChatCompletion
将最终的 AdvisedResponse
返回给客户端。增强器顺序
增强器在链中的执行顺序由getOrder()
方法决定。需要理解的关键点:
执行顺序
执行顺序
- 具有较低顺序值的增强器首先执行。
- 增强器链作为堆栈运行:
- 链中的第一个增强器首先处理请求。
- 它也是最后一个处理响应的。
控制执行顺序
控制执行顺序
- 要控制执行顺序:
- 将顺序设置为接近
Ordered.HIGHEST_PRECEDENCE
以确保增强器在链中首先执行(首先处理请求,最后处理响应)。 - 将顺序设置为接近
Ordered.LOWEST_PRECEDENCE
以确保增强器在链中最后执行(最后处理请求,首先处理响应)。
- 将顺序设置为接近
- 较高的值被解释为较低的优先级。
- 如果多个增强器具有相同的顺序值,它们的执行顺序不能保证。
执行顺序和顺序值之间的表面矛盾是由于增强器链的堆栈性质:
- 具有最高优先级(最低顺序值)的增强器被添加到堆栈顶部。
- 当堆栈展开时,它将首先处理请求。
- 当堆栈重绕时,它将最后处理响应。
Ordered
接口的语义:
对于需要在输入和输出端都是链中第一个的用例:
- 为每一端使用单独的增强器。
- 使用不同的顺序值配置它们。
- 使用增强器上下文在它们之间共享状态。
API 概述
主要增强器接口位于包org.springframework.ai.chat.client.advisor.api
中。以下是创建自己的增强器时会遇到的关键接口:
CallAroundAdvisorChain
和 StreamAroundAdvisorChain
:
接口是:
实现增强器
要创建增强器,实现CallAroundAdvisor
或 StreamAroundAdvisor
(或两者)。要实现的关键方法是用于非流式的 nextAroundCall()
或用于流式增强器的 nextAroundStream()
。
示例
我们将提供一些实践示例来说明如何实现用于观察和增强用例的增强器。日志增强器
我们可以实现一个简单的日志增强器,在调用链中的下一个增强器之前记录AdvisedRequest
,之后记录 AdvisedResponse
。
注意,增强器只观察请求和响应,不修改它们。
此实现同时支持非流式和流式场景。
- 为增强器提供唯一名称。
- 您可以通过设置顺序值来控制执行顺序。较低的值首先执行。
MessageAggregator
是一个实用类,将 Flux 响应聚合为单个 AdvisedResponse。这对于记录或观察整个响应而不是流中的单个项目的其他处理很有用。注意,您不能在MessageAggregator
中修改响应,因为它是只读操作。
重读 (Re2) 增强器
“Re-Reading Improves Reasoning in Large Language Models” 文章介绍了一种称为重读 (Re2) 的技术,可以提高大型语言模型的推理能力。 Re2 技术要求像这样增强输入提示:before
方法通过应用重读技术增强用户的输入查询。aroundCall
方法拦截非流式请求并应用重读技术。aroundStream
方法拦截流式请求并应用重读技术。- 您可以通过设置顺序值来控制执行顺序。较低的值首先执行。
- 为增强器提供唯一名称。
Spring AI 内置增强器
Spring AI 框架提供了几个内置增强器来增强您的 AI 交互。以下是可用增强器的概述:聊天内存增强器
聊天内存增强器
这些增强器在聊天内存存储中管理对话历史:
MessageChatMemoryAdvisor
检索内存并将其作为消息集合添加到提示中。这种方法保持了对话历史的结构。注意,并非所有 AI 模型都支持这种方法。
PromptChatMemoryAdvisor
检索内存并将其合并到提示的系统文本中。
VectorStoreChatMemoryAdvisor
从 VectorStore 检索内存并将其添加到提示的系统文本中。此增强器对于从大型数据集中高效搜索和检索相关信息很有用。
问题回答增强器
问题回答增强器
QuestionAnswerAdvisor
此增强器使用向量存储来提供问答功能,实现 RAG(检索增强生成)模式。
内容安全增强器
内容安全增强器
SafeGuardAdvisor
一个简单的增强器,旨在防止模型生成有害或不适当的内容。
流式与非流式

增强器流式与非流式流程
- 非流式增强器处理完整的请求和响应。
- 流式增强器将请求和响应作为连续流处理,使用响应式编程概念(例如,用于响应的 Flux)。
最佳实践
专注责任
保持增强器专注于特定任务以获得更好的模块化。
共享状态
必要时使用
adviseContext
在增强器之间共享状态。支持两种模式
实现增强器的流式和非流式版本以获得最大灵活性。
考虑顺序
仔细考虑增强器在链中的顺序以确保正确的数据流。
向后兼容性
AdvisedRequest
类已移动到新包。API 重大变更
Spring AI 增强器链从版本 1.0 M2 到 1.0 M3 经历了重大变化。以下是主要修改:增强器接口
- 单独的
RequestAdvisor
和ResponseAdvisor
接口 RequestAdvisor
在ChatModel.call
和ChatModel.stream
方法之前调用ResponseAdvisor
在这些方法之后调用- 使用
StreamResponseMode
作为ResponseAdvisor
的一部分
上下文映射处理
- 上下文映射是一个单独的方法参数
- 映射是可变的并沿链传递
文档有误?请协助编辑
发现文档问题?点击此处直接在 GitHub 上编辑并提交 PR,帮助我们改进文档!