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

Spring AI Alibaba 64|Graph Core · Graph 工作流编排指南 · 步骤 4:构建您的节点:适当处理错误

不同的错误需要不同的处理策略:

错误类型 谁来修复 策略 何时使用
瞬时错误(网络问题、速率限制) 系统(自动) 重试策略 通常会在重试时解决的临时故障
LLM可恢复错误(工具失败、解析问题) LLM 将错误存储在状态中并循环回去 LLM可以看到错误并调整其方法
用户可修复错误(缺少信息、不清楚的指令) 人工 使用 interruptBefore 暂停 需要用户输入才能继续
意外错误 开发者 让它们冒泡 需要调试的未知问题

注意:本示例代码中主要展示了基本的错误处理模式。在实际应用中,您可以根据需要添加重试策略、错误恢复机制等。本示例中的 SearchDocumentationNode 展示了基本的错误处理:捕获异常并存储错误信息,然后继续执行流程。

LLM可恢复错误

将错误存储在状态中并循环回去,以便 LLM 可以看到出错的地方并重试:

注意:以下是一个示例,展示如何处理 LLM 可恢复的错误。本示例代码不在 QuickStartExample.java 中,仅用于说明错误处理模式:

import com.alibaba.cloud.ai.graph.action.NodeAction;
import com.alibaba.cloud.ai.graph.OverAllState;
import java.util.Map;

// 示例:处理工具调用错误,让 LLM 可以重试
public class ExecuteToolNode implements NodeAction {

  @Override
  public Map<String, Object> apply(OverAllState state) throws Exception {
      try {
          String toolCall = state.value("tool_call")
                  .map(v -> (String) v)
                  .orElse("");
          String result = runTool(toolCall);
          return Map.of(
              "tool_result", result,
              "next_node", "agent"
          );
      } catch (ToolException e) {
          // 让 LLM 看到出错的地方并重试
          return Map.of(
              "tool_result", "Tool error: " + e.getMessage(),
              "next_node", "agent"
          );
      }
  }
}

用户可修复错误

在需要时暂停并从用户那里收集信息(如账户 ID、订单号或澄清):

注意:以下是一个示例,展示如何处理需要用户输入的情况。本示例代码不在 QuickStartExample.java 中,仅用于说明错误处理模式。在实际应用中,使用 interruptBefore 配置来暂停执行:

import com.alibaba.cloud.ai.graph.action.NodeAction;
import com.alibaba.cloud.ai.graph.OverAllState;
import java.util.Map;

// 示例:处理缺少用户输入的情况
public class LookupCustomerHistory implements NodeAction {

  @Override
  public Map<String, Object> apply(OverAllState state) throws Exception {
      String customerId = state.value("customer_id")
              .map(v -> (String) v)
              .orElse(null);

      if (customerId == null) {
          // 暂停执行,等待用户输入
          // 注意:在 Spring AI Alibaba 中,使用 interruptBefore 配置
          return Map.of(
              "status", "需要客户ID",
              "message", "请提供客户的账户ID以查找其订阅历史"
          );
      }

      // 现在继续查找
      Map<String, Object> customerData = fetchCustomerHistory(customerId);
      return Map.of(
          "customer_history", customerData,
          "next_node", "draft_response"
      );
  }

  private Map<String, Object> fetchCustomerHistory(String customerId) {
      // 实际的客户历史查询逻辑
      return Map.of("tier", "premium", "since", "2020-01-01");
  }
}

意外错误

让它们冒泡以进行调试。不要捕获您无法处理的内容:

注意:以下是一个示例,展示如何处理意外错误。实际的 SendReplyNode 实现更简单,直接让异常冒泡:

import com.alibaba.cloud.ai.graph.action.NodeAction;
import com.alibaba.cloud.ai.graph.OverAllState;
import java.util.Map;

// 示例:如果需要在发送前验证数据,可以这样做
public class SendReplyNodeExample implements NodeAction {

  @Override
  public Map<String, Object> apply(OverAllState state) throws Exception {
      // 直接获取值,如果缺少必要数据,让异常自然冒泡
      String response = state.value("draft_response")
              .map(v -> (String) v)
              .orElseThrow(() -> new IllegalStateException("No draft response"));

      // 执行发送操作,任何异常都会冒泡
      emailService.send(response);
      return Map.of("status", "sent");
  }
}

本文整理自 Spring AI Alibaba 官方文档《Graph 工作流编排指南》:https://java2ai.com/docs/frameworks/graph-core/quick-start

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 64|Graph Core · Graph 工作流编排指南 · 步骤 4:构建您的节点:适当处理错误

评论 抢沙发

AI项目博客

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

关于本站文章归档

登录

找回密码

注册