Skip to content

Commit 8c4e541

Browse files
authored
Refine language and formatting in hooks.md (#263)
1 parent 9887a1c commit 8c4e541

File tree

1 file changed

+75
-75
lines changed
  • docs/frameworks/agent-framework/tutorials

1 file changed

+75
-75
lines changed

docs/frameworks/agent-framework/tutorials/hooks.md

Lines changed: 75 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ keywords: [Hooks, Interceptors, Agent控制, 监控, 重试, 回退, 日志, 护
66

77
# Hooks 和 Interceptors
88

9-
> 让开发者在每个步骤控制和自定义 Agent 执行
9+
> 让开发者在每个步骤控制和自定义 Agent 执行
1010
1111
Hooks 和 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

13461346
Hooks 和 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

Comments
 (0)