diff --git a/knowledge_20260716_Spring_AI_Alibaba_Graph_诊断编排改造/knowledge_20260716_Spring_AI_Alibaba_Graph_诊断编排改造.html b/knowledge_20260716_Spring_AI_Alibaba_Graph_诊断编排改造/knowledge_20260716_Spring_AI_Alibaba_Graph_诊断编排改造.html new file mode 100644 index 0000000..0420f0e --- /dev/null +++ b/knowledge_20260716_Spring_AI_Alibaba_Graph_诊断编排改造/knowledge_20260716_Spring_AI_Alibaba_Graph_诊断编排改造.html @@ -0,0 +1,192 @@ + + +
+ + +作者:叫我小杨同学的小码酱
+ StateGraphAgent 编排条件边故障诊断 +让 ReactAgent 继续负责做事,让 StateGraph 负责下一步去哪里。
+生活类比:Planner、Executor、Verifier 是医院科室,Graph 是分诊和转诊制度。
+官方核心模型是 State、Nodes、Edges。本地依赖 1.1.2.0 已确认支持 StateGraph、条件边、编译配置、中断和 threadId。
+当前 ChatService 已经是半个状态机:SequentialAgent 运行 Planner、Executor、Verifier,外层 Java 再根据 PASS、LOW_CONFID、REJECT 决定 Composer 或重试。Graph 改造的价值,是把分散的控制权显式化。
+当前:SequentialAgent + 外层 if/else +目标:StateGraph 条件边 + ReactAgent 语义节点+
Supervisor 适合动态选择专科 Agent;Gatekeeper、Verifier 等强制门禁应由代码边控制。普通工具失败也不需要 interrupt,只有等待人工输入或审批时才暂停。
+保存统一诊断上下文、计划、Executor 结构化输出、Gatekeeper 结果、Verifier verdict、重试轮次和最终结果。不要在 State 里复制所有原始日志或完整思考过程。
+ +StateGraph graph = new StateGraph("diagnosis_workflow", strategies)
+ .addNode("planner", plannerNode)
+ .addNode("executor", executorNode)
+ .addNode("gatekeeper", gatekeeperNode)
+ .addNode("verifier", verifierNode)
+ .addNode("retry_guard", retryGuardNode)
+ .addNode("composer", composerNode)
+ .addNode("fallback", fallbackNode)
+ .addEdge(START, "planner")
+ .addEdge("planner", "executor")
+ .addConditionalEdges("executor", routeAfterExecutor,
+ Map.of("gatekeeper","gatekeeper",
+ "retry_guard","retry_guard",
+ "fallback","fallback"))
+ .addConditionalEdges("gatekeeper", routeAfterGatekeeper,
+ Map.of("verifier","verifier","fallback","fallback"))
+ .addConditionalEdges("verifier", routeAfterVerifier,
+ Map.of("retry_guard","retry_guard",
+ "composer","composer",
+ "fallback","fallback"))
+ .addConditionalEdges("retry_guard", routeAfterRetry,
+ Map.of("planner","planner","composer","composer"))
+ .addEdge("composer", END)
+ .addEdge("fallback", END);
+
+ RunnableConfig config = RunnableConfig.builder()
+ .threadId(runId)
+ .addMetadata("sessionId", sessionId)
+ .addMetadata("runId", runId)
+ .build();
+ 一个 diagnosis_run 使用一个 Graph thread,避免同一 session 下多个 run 共享检查点。MemorySaver 不是跨重启持久化。
+ +本地 ReactAgent 提供 asNode(boolean, boolean)。当前项目第一阶段更适合用适配节点调用已有 Agent,显式控制输入、outputKey 和解析;状态契约稳定后再评估直接 asNode。
+Graph 的节点可以是 LLM,也可以是普通 Java 代码;ReactAgent 本身已经是子图。所谓“Multi-Agent 改 Graph”,实际上是把跨 Agent 状态转换交给父 Graph。
+官方页面示例有 OverAllStaste 拼写错误,实际类型是 OverAllState。网站主分支可能领先于本地依赖,最终必须以项目 JAR 和编译测试为准。
+不会,ReactAgent 可以作为子图节点继续使用。
失败跳转是确定性规则,不需要增加一次模型决策。
不一定,合法 no-evidence 引用仍要经过 Gatekeeper 和 Verifier。
正常表达可以使用轻量 Agent,系统失败要保留固定模板。
当前数据模型下优先使用 runId,sessionId 作为元数据。
需要暂停、恢复和检查 Graph 历史状态时。
可以,但要验证 outputKey、messages 和父子检查点。
入口和输出策略独立,诊断核心可以共用。