@@ -6,7 +6,7 @@ keywords: [Hooks, Interceptors, Agent控制, 监控, 重试, 回退, 日志, 护
66
77# Hooks 和 Interceptors
88
9- > 让开发者在每个步骤控制和自定义 Agent 执行
9+ > 让开发者在每个步骤控制和自定义 Agent 执行。
1010
1111Hooks 和 Interceptors 提供了一种更精细控制 Agent 内部行为的方式。
1212
@@ -18,10 +18,10 @@ Hooks 和 Interceptors 在这些步骤的前后暴露了钩子点,允许你:
1818
1919<img src =" /img/agent/hooks/reactagent-hook.png " alt =" reactagent " width =" 450 " />
2020
21- - ** 监控** : 通过日志、分析和调试跟踪 Agent 行为
22- - ** 修改** : 转换提示、工具选择和输出格式
23- - ** 控制** : 添加重试、回退和提前终止逻辑
24- - ** 强制执行** : 应用速率限制、护栏和 PII 检测
21+ - ** 监控** : 通过日志、分析和调试跟踪 Agent 行为;
22+ - ** 修改** : 转换提示、工具选择和输出格式;
23+ - ** 控制** : 添加重试、回退和提前终止逻辑;
24+ - ** 强制执行** : 应用速率限制、护栏和 PII 检测。
2525
2626通过将它们传递给 ` ReactAgent.builder() ` 来添加 Hooks 和 Interceptors:
2727
@@ -44,13 +44,13 @@ ReactAgent agent = ReactAgent.builder()
4444
4545## Hooks 和 Interceptors 能做什么?
4646
47- * 监控。 使用日志、分析和调试跟踪 Agent 行为。
47+ * 监控: 使用日志、分析和调试跟踪 Agent 行为;
4848
49- * 修改。 转换提示、工具选择和输出格式。
49+ * 修改: 转换提示、工具选择和输出格式;
5050
51- * 控制。 添加重试、回退和提前终止逻辑。
51+ * 控制: 添加重试、回退和提前终止逻辑;
5252
53- * 强制执行。 应用速率限制、护栏和 PII 检测。
53+ * 强制执行: 应用速率限制、护栏和 PII 检测。
5454
5555## 内置实现
5656
@@ -61,9 +61,9 @@ Spring AI Alibaba 为常见用例提供了预构建的 Hooks 和 Interceptors
6161当接近 token 限制时自动压缩对话历史。
6262
6363** 适用场景** :
64- * 超出上下文窗口的长期对话
65- * 具有大量历史记录的多轮对话
66- * 需要保留完整对话上下文的应用程序
64+ * 超出上下文窗口的长期对话;
65+ * 具有大量历史记录的多轮对话;
66+ * 需要保留完整对话上下文的应用程序。
6767
6868<Code
6969 language="java"
@@ -87,18 +87,18 @@ ReactAgent agent = ReactAgent.builder()
8787</Code >
8888
8989** 配置选项** :
90- - ` model ` : 用于生成摘要的 ChatModel
91- - ` maxTokensBeforeSummary ` : 触发摘要之前的最大 token 数
92- - ` messagesToKeep ` : 摘要后保留的最新消息数
90+ - ` model ` : 用于生成摘要的 ChatModel;
91+ - ` maxTokensBeforeSummary ` : 触发摘要之前的最大 token 数;
92+ - ` messagesToKeep ` : 摘要后保留的最新消息数。
9393
9494### Human-in-the-Loop(人机协同)
9595
9696暂停 Agent 执行以获得人工批准、编辑或拒绝工具调用。
9797
9898** 适用场景** :
99- * 需要人工批准的高风险操作(数据库写入、金融交易)
100- * 人工监督是强制性的合规工作流程
101- * 长期对话,使用人工反馈引导 Agent
99+ * 需要人工批准的高风险操作(数据库写入、金融交易);
100+ * 人工监督是强制性的合规工作流程;
101+ * 长期对话,使用人工反馈引导 Agent。
102102
103103<Code
104104 language="java"
@@ -129,9 +129,9 @@ ReactAgent agent = ReactAgent.builder()
129129限制模型调用次数以防止无限循环或过度成本。
130130
131131** 适用场景** :
132- * 防止失控的 Agent 进行太多 API 调用
133- * 在生产部署中强制执行成本控制
134- * 在特定调用预算内测试 Agent 行为
132+ * 防止失控的 Agent 进行太多 API 调用;
133+ * 在生产部署中强制执行成本控制;
134+ * 在特定调用预算内测试 Agent 行为。
135135
136136<Code
137137 language="java"
@@ -150,9 +150,9 @@ ReactAgent agent = ReactAgent.builder()
150150检测和处理对话中的个人身份信息。
151151
152152** 适用场景** :
153- * 具有合规要求的医疗保健和金融应用
154- * 需要清理日志的客户服务 Agent
155- * 任何处理敏感用户数据的应用程序
153+ * 具有合规要求的医疗保健和金融应用;
154+ * 需要清理日志的客户服务 Agent;
155+ * 任何处理敏感用户数据的应用程序。
156156
157157<Code
158158 language="java"
@@ -181,9 +181,9 @@ ReactAgent agent = ReactAgent.builder()
181181自动重试失败的工具调用,具有可配置的指数退避。
182182
183183** 适用场景** :
184- * 处理外部 API 调用中的瞬态故障
185- * 提高依赖网络的工具的可靠性
186- * 构建优雅处理临时错误的弹性 Agent
184+ * 处理外部 API 调用中的瞬态故障;
185+ * 提高依赖网络的工具的可靠性;
186+ * 构建优雅处理临时错误的弹性 Agent。
187187
188188<Code
189189 language="java"
@@ -209,9 +209,9 @@ ReactAgent agent = ReactAgent.builder()
209209在执行工具之前强制执行一个规划步骤,以概述 Agent 将要采取的步骤。
210210
211211** 适用场景** :
212- * 需要执行复杂、多步骤任务的 Agent
213- * 通过在执行前显示 Agent 的计划来提高透明度
214- * 通过检查建议的计划来调试错误
212+ * 需要执行复杂、多步骤任务的 Agent;
213+ * 通过在执行前显示 Agent 的计划来提高透明度;
214+ * 通过检查建议的计划来调试错误。
215215
216216<Code
217217 language="java"
@@ -233,9 +233,9 @@ ReactAgent agent = ReactAgent.builder()
233233使用一个 LLM 来决定在多个可用工具之间选择哪个工具。
234234
235235** 适用场景** :
236- * 当多个工具可以实现相似目标时
237- * 需要根据细微的上下文差异进行工具选择
238- * 动态选择最适合特定输入的工具
236+ * 当多个工具可以实现相似目标时;
237+ * 需要根据细微的上下文差异进行工具选择;
238+ * 动态选择最适合特定输入的工具。
239239
240240<Code
241241 language="java"
@@ -257,9 +257,9 @@ ReactAgent agent = ReactAgent.builder()
257257在没有实际执行工具的情况下,使用 LLM 模拟工具的输出。
258258
259259** 适用场景** :
260- * 在演示或测试期间模拟 API
261- * 在开发过程中为工具提供占位符行为
262- * 在不产生实际成本或副作用的情况下测试 Agent 逻辑
260+ * 在演示或测试期间模拟 API;
261+ * 在开发过程中为工具提供占位符行为;
262+ * 在不产生实际成本或副作用的情况下测试 Agent 逻辑。
263263
264264<Code
265265 language="java"
@@ -281,9 +281,9 @@ ReactAgent agent = ReactAgent.builder()
281281在将上下文发送给 LLM 之前对其进行修改,以注入、删除或修改信息。
282282
283283** 适用场景** :
284- * 向 LLM 提供额外的上下文或指令
285- * 从对话历史中删除不相关或冗余的信息
286- * 动态修改上下文以引导 Agent 的行为
284+ * 向 LLM 提供额外的上下文或指令;
285+ * 从对话历史中删除不相关或冗余的信息;
286+ * 动态修改上下文以引导 Agent 的行为。
287287
288288<Code
289289 language="java"
@@ -305,21 +305,21 @@ ReactAgent agent = ReactAgent.builder()
305305
306306你可以通过以下方式创建自定义功能:
307307
308- 1 . ** MessagesModelHook** - 在模型调用前后执行,专注于消息操作(推荐)
309- 2 . ** ModelHook** - 在模型调用前后执行,可访问完整状态
310- 3 . ** AgentHook** - 在 Agent 开始和结束时执行
311- 4 . ** ModelInterceptor** - 拦截和修改模型请求/响应
312- 5 . ** ToolInterceptor** - 拦截和修改工具调用
308+ 1 . ** MessagesModelHook** - 在模型调用前后执行,专注于消息操作(推荐);
309+ 2 . ** ModelHook** - 在模型调用前后执行,可访问完整状态;
310+ 3 . ** AgentHook** - 在 Agent 开始和结束时执行;
311+ 4 . ** ModelInterceptor** - 拦截和修改模型请求/响应;
312+ 5 . ** ToolInterceptor** - 拦截和修改工具调用。
313313
314314### MessagesModelHook
315315
316316` MessagesModelHook ` 是一个专门用于操作消息列表的 Hook,** 使用更简单,更推荐** 。它直接接收和返回消息列表,无需处理复杂的 ` OverAllState ` 。
317317
318318** 适用场景** :
319- - 消息修剪、过滤或转换
320- - 添加系统提示或上下文消息
321- - 消息压缩和摘要
322- - 简单的消息操作需求
319+ - 消息修剪、过滤或转换;
320+ - 添加系统提示或上下文消息;
321+ - 消息压缩和摘要;
322+ - 简单的消息操作需求。
323323
324324<Code
325325 language="java"
@@ -363,8 +363,8 @@ public class MessageTrimmingHook extends MessagesModelHook {
363363
364364` MessagesModelHook ` 通过 ` AgentCommand ` 返回操作结果:
365365
366- - ** REPLACE 策略** :替换所有现有消息
367- - ** APPEND 策略** :将新消息追加到现有消息列表
366+ - ** REPLACE 策略** :替换所有现有消息;
367+ - ** APPEND 策略** :将新消息追加到现有消息列表。
368368
369369<Code
370370 language="java"
@@ -565,16 +565,16 @@ public class MessageDeletionHook extends ModelHook {
565565#### 使用建议
566566
567567** 选择 MessagesModelHook,如果你需要:**
568- - ✅ 简单的消息操作(修剪、过滤、转换)
569- - ✅ 添加或修改系统提示
570- - ✅ 消息压缩和摘要
571- - ✅ 快速实现消息相关的 Hook
568+ - ✅ 简单的消息操作(修剪、过滤、转换);
569+ - ✅ 添加或修改系统提示;
570+ - ✅ 消息压缩和摘要;
571+ - ✅ 快速实现消息相关的 Hook。
572572
573573** 选择 ModelHook,如果你需要:**
574- - ✅ 访问和修改 ` OverAllState ` 中的其他数据
575- - ✅ 在状态中存储自定义信息(如计数器、缓存等)
576- - ✅ 基于全局状态做复杂决策
577- - ✅ 需要查看 Agent 执行过程中的完整上下文
574+ - ✅ 访问和修改 ` OverAllState ` 中的其他数据;
575+ - ✅ 在状态中存储自定义信息(如计数器、缓存等);
576+ - ✅ 基于全局状态做复杂决策;
577+ - ✅ 需要查看 Agent 执行过程中的完整上下文。
578578
579579#### 对比示例
580580
@@ -836,10 +836,10 @@ public class DynamicToolInterceptor extends ModelInterceptor {
836836</Code >
837837
838838** 使用场景** :
839- - 根据用户权限动态添加或移除工具
840- - 根据对话上下文临时启用特定工具
841- - 实现工具的动态加载和卸载
842- - 在特定条件下限制可用的工具集
839+ - 根据用户权限动态添加或移除工具;
840+ - 根据对话上下文临时启用特定工具;
841+ - 实现工具的动态加载和卸载;
842+ - 在特定条件下限制可用的工具集。
843843
844844### ToolInterceptor
845845
@@ -894,10 +894,10 @@ public class ToolMonitoringInterceptor extends ToolInterceptor {
894894` RunnableConfig ` 提供了一个 ` context() ` 方法,允许你在同一个执行流程中的多个 Hook 调用、多轮模型或工具调用之间共享数据。这对于实现计数器、累积统计信息或跨多次调用维护状态非常有用。
895895
896896** 适用场景** :
897- * 跟踪模型或工具调用次数
898- * 累积性能指标(总耗时、平均响应时间等)
899- * 在 before/after Hook 之间传递临时数据
900- * 实现基于计数的限流或断路器
897+ * 跟踪模型或工具调用次数;
898+ * 累积性能指标(总耗时、平均响应时间等);
899+ * 在 before/after Hook 之间传递临时数据;
900+ * 实现基于计数的限流或断路器。
901901
902902** 示例:使用 RunnableConfig.context() 实现调用计数器**
903903
@@ -1055,10 +1055,10 @@ public class ModelCallLimiterHook extends ModelHook {
10551055
10561056** 关键要点** :
10571057
1058- * ** context() 是共享的** : 同一个执行流程中的所有 Hook 共享同一个 context
1059- * ** 数据持久性** : context 中的数据在整个 Agent 执行期间保持有效
1060- * ** 类型安全** : 需要自己管理 context 中数据的类型转换
1061- * ** 命名约定** : 建议使用双下划线前缀命名 context key(如 ` __model_call_count__ ` )以避免与用户数据冲突
1058+ * ** context() 是共享的** : 同一个执行流程中的所有 Hook 共享同一个 context;
1059+ * ** 数据持久性** : context 中的数据在整个 Agent 执行期间保持有效;
1060+ * ** 类型安全** : 需要自己管理 context 中数据的类型转换;
1061+ * ** 命名约定** : 建议使用双下划线前缀命名 context key(如 ` __model_call_count__ ` )以避免与用户数据冲突。
10621062
10631063## 执行顺序
10641064
@@ -1345,11 +1345,11 @@ ReactAgent agent = ReactAgent.builder()
13451345
13461346Hooks 和 Interceptors 提供了强大的机制来控制和自定义 Agent 的执行流程:
13471347
1348- - ** Hooks** : 在 Agent 执行的关键点插入自定义逻辑(before/after)
1349- - ** Interceptors** : 拦截和修改模型调用和工具执行
1350- - ** 灵活组合** : 可以组合多个 Hooks 和 Interceptors
1351- - ** 执行顺序** : 理解执行顺序对于构建正确的功能至关重要
1352- - ** 跳转控制** : 支持提前退出和条件跳转
1348+ - ** Hooks** : 在 Agent 执行的关键点插入自定义逻辑(before/after);
1349+ - ** Interceptors** : 拦截和修改模型调用和工具执行;
1350+ - ** 灵活组合** : 可以组合多个 Hooks 和 Interceptors;
1351+ - ** 执行顺序** : 理解执行顺序对于构建正确的功能至关重要;
1352+ - ** 跳转控制** : 支持提前退出和条件跳转。
13531353
13541354通过合理使用这些机制,你可以构建具有监控、安全、性能优化等高级功能的生产级 Agent 应用。
13551355
0 commit comments