AI项目博客
记录 AI 工程实践与大模型应用

Spring AI Alibaba 28|Hooks 与 Interceptors · 实际示例

示例 1:内容审核 Interceptor

public class ContentModerationInterceptor extends ModelInterceptor {

  private static final List<String> BLOCKED_WORDS =
      List.of("敏感词1", "敏感词2", "敏感词3");

  @Override
  public ModelResponse interceptModel(ModelRequest request, ModelCallHandler handler) {
      // 检查输入
      for (Message msg : request.getMessages()) {
          String content = msg.getText().toLowerCase();
          for (String blocked : BLOCKED_WORDS) {
              if (content.contains(blocked)) {
				return ModelResponse.of(AssistantMessage.builder().content("检测到不适当的内容,请修改您的输入").build());
              }
          }
      }

      // 执行模型调用
      ModelResponse response = handler.call(request);

      // 检查输出
      String output = response.getContent();
      for (String blocked : BLOCKED_WORDS) {
          if (output.contains(blocked)) {
              // 清理输出
              output = output.replaceAll(blocked, "[已过滤]");
              return response.withContent(output);
          }
      }

      return response;
  }

  @Override
  public String getName() {
      return "ContentModerationInterceptor";
  }
}

示例 2:性能监控 – 使用 Interceptor

使用 ModelInterceptor 和 ToolInterceptor 监控模型和工具调用的性能:

// 模型调用性能监控
public class ModelPerformanceInterceptor extends ModelInterceptor {

  @Override
  public ModelResponse interceptModel(ModelRequest request, ModelCallHandler handler) {
      // 请求前记录
      System.out.println("发送请求到模型: " + request.getMessages().size() + " 条消息");

      long startTime = System.currentTimeMillis();

      // 执行实际调用
      ModelResponse response = handler.call(request);

      // 响应后记录
      long duration = System.currentTimeMillis() - startTime;
      System.out.println("模型响应耗时: " + duration + "ms");

      return response;
  }

  @Override
  public String getName() {
      return "ModelPerformanceInterceptor";
  }
}

// 工具调用性能监控
public class ToolPerformanceInterceptor extends ToolInterceptor {

  @Override
  public ToolCallResponse interceptToolCall(ToolCallRequest request, ToolCallHandler handler) {
      String toolName = request.getToolName();
      long startTime = System.currentTimeMillis();

      System.out.println("执行工具: " + toolName);

      try {
          ToolCallResponse response = handler.call(request);

          long duration = System.currentTimeMillis() - startTime;
          System.out.println("工具 " + toolName + " 执行成功 (耗时: " + duration + "ms)");

          return response;
      } catch (Exception e) {
          long duration = System.currentTimeMillis() - startTime;
          System.err.println("工具 " + toolName + " 执行失败 (耗时: " + duration + "ms): " + e.getMessage());

          return ToolCallResponse.of(
              request.getToolCallId(),
              request.getToolName(),
              "工具执行失败: " + e.getMessage()
          );
      }
  }

  @Override
  public String getName() {
      return "ToolPerformanceInterceptor";
  }
}

// 使用示例
ReactAgent agent = ReactAgent.builder()
  .name("monitored_agent")
  .model(chatModel)
  .tools(tools)
  .interceptors(new ModelPerformanceInterceptor())
  .interceptors(new ToolPerformanceInterceptor())
  .build();

示例 3:工具缓存 Interceptor

public class ToolCacheInterceptor extends ToolInterceptor {

  private Map<String, ToolCallResponse> cache = new ConcurrentHashMap<>();
  private final long ttlMs;

  public ToolCacheInterceptor(long ttlMs) {
      this.ttlMs = ttlMs;
  }

  @Override
  public ToolCallResponse interceptToolCall(ToolCallRequest request, ToolCallHandler handler) {
      String cacheKey = generateCacheKey(request);

      // 检查缓存
      ToolCallResponse cached = cache.get(cacheKey);
      if (cached != null && !isExpired(cached)) {
          System.out.println("缓存命中: " + request.getToolName());
          return cached;
      }

      // 执行工具
      ToolCallResponse response = handler.call(request);

      // 缓存结果
      cache.put(cacheKey, response);

      return response;
  }

  @Override
  public String getName() {
      return "ToolCacheInterceptor";
  }

  private String generateCacheKey(ToolCallRequest request) {
      return request.getToolName() + ":" +
             request.getArguments();
  }

  private boolean isExpired(ToolCallResponse response) {
      // 实现 TTL 检查逻辑
      return false;
  }
}

在 Spring AI Alibaba 中,Hook 和 Interceptor 都可以用于干预 Agent 执行:

特性 Hook Interceptor
执行位置 Agent 级别(before/after agent, before/after model) 模型或工具调用级别
中断能力 支持中断和恢复(如 HumanInTheLoopHook) 不支持中断,仅拦截和修改
使用场景 人工审批、Agent 间协调 日志记录、重试、降级
配置方式 .hooks(List.of(…)) .interceptors(List.of(…))
  • Agents 文档 – 了解 ReactAgent 的核心概念
  • Messages 文档 – 了解消息类型和使用
  • Models 文档 – 了解模型配置和使用

本文整理自 Spring AI Alibaba 官方文档《Hooks 与 Interceptors》:https://java2ai.com/docs/frameworks/agent-framework/tutorials/hooks

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 28|Hooks 与 Interceptors · 实际示例

评论 抢沙发

AI项目博客

专注 AI 工程化落地 —— 覆盖智能体、大模型、Java AI 与 Python 的学习笔记,以及 AI 平台的项目实战记录。

关于本站文章归档

登录

找回密码

注册