不同的错误需要不同的处理策略:
| 错误类型 | 谁来修复 | 策略 | 何时使用 |
|---|---|---|---|
| 瞬时错误(网络问题、速率限制) | 系统(自动) | 重试策略 | 通常会在重试时解决的临时故障 |
| 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

AI项目博客






