找回密码
 立即注册
首页 业界区 安全 LangGraph4j 学习系列(1)-顺序工作流

LangGraph4j 学习系列(1)-顺序工作流

夔新梅 4 天前
一句话秒懂LangGraph是一个状态管理和工作流编排框架,专注于构建复杂的多步骤应用,LangGraph4j是LangGraph开源生态中的java实现。
既生瑜?何生亮?Dify VS LangGraph4j (有了dify,还有必要学习langgraph之类的编排框架吗?)听听deepseek 怎么说?
1.png
 
官网https://github.com/langgraph4j
 基本概念
2.jpeg
温馨提示:初学者只需了解 节点(NodeAction)、边(EdgeAction)、状态(AgentState) 即可快速上手。

文档https://deepwiki.com/langgraph4j/langgraph4j  顺序工作流 
3.png
 
定义节点
  1. import org.bsc.langgraph4j.action.NodeAction;
  2. import org.bsc.langgraph4j.state.AgentState;
  3. import java.util.Map;
  4. /**
  5. * @author junmingyang
  6. */
  7. public class Node1Action implements NodeAction {
  8.     @Override
  9.     public Map<String, Object> apply(AgentState state) throws Exception {
  10.         System.out.println("current Node: node-1");
  11.         return Map.of("myData", "node1-my-value",
  12.                 "node1Key", "node1-value");
  13.     }
  14. }
复制代码
  
  1. import org.bsc.langgraph4j.action.NodeAction;
  2. import org.bsc.langgraph4j.state.AgentState;
  3. import java.util.Map;
  4. /**
  5. * @author junmingyang
  6. */
  7. public class Node2Action implements NodeAction {
  8.     @Override
  9.     public Map<String, Object> apply(AgentState state) throws Exception {
  10.         System.out.println("current Node: node-2");
  11.         return Map.of("myData", "node2-my-value",
  12.                 "node2Key", "node2-value");
  13.     }
  14. }
复制代码
注:节点上可以携带数据(即:节点的状态),当工作流运行至本节点时,apply()方法将会调用,业务处理逻辑在此处理(如何:包括调用LLM,调用其它接口来更新状态)
 完整示例
  1. import org.bsc.langgraph4j.GraphDefinition;
  2. import org.bsc.langgraph4j.GraphRepresentation;
  3. import org.bsc.langgraph4j.GraphStateException;
  4. import org.bsc.langgraph4j.StateGraph;
  5. import org.bsc.langgraph4j.state.AgentState;
  6. import java.util.Map;
  7. import static org.bsc.langgraph4j.action.AsyncNodeAction.node_async;
  8. /**
  9. * SequenceGraphApplication 类演示了如何使用 LangGraph4j 构建和执行一个简单的序列图。
  10. * 该应用程序创建了一个包含两个节点的序列图,节点按顺序执行:
  11. * START -> node-1 -> node-2 -> END
  12. *
  13. * @author 菩提树下的杨过(yjmyzz.cnblogs.com)
  14. * @since 1.0
  15. */
  16. public class SequenceGraphApplication {
  17.     public static void main(String[] args) throws GraphStateException {
  18.         StateGraph sequenceGraph = getSequenceGraph();
  19.         //打印图的mermaid代码
  20.         System.out.println(sequenceGraph.getGraph(GraphRepresentation.Type.MERMAID, "Sequence Graph", true).content());
  21.         //编译图并运行(初始数据值为 test->test-init-value
  22.         sequenceGraph
  23.                 .compile() //编译
  24.                 .invoke(Map.of("test", "test-init-value")) //运行(并赋初始值)
  25.                 .ifPresent(c -> {
  26.                     //运行结束后,会执行本段逻辑
  27.                     System.out.println(c.data());
  28.                 });
  29.     }
  30.     public static StateGraph getSequenceGraph() throws GraphStateException {
  31.         return new StateGraph<>(AgentState::new)
  32.                 //向图中添加2个节点
  33.                 .addNode("node-1", node_async(new Node1Action()))
  34.                 .addNode("node-2", node_async(new Node2Action()))
  35.                 //加一条边(开始->node1)
  36.                 .addEdge(GraphDefinition.START, "node-1")
  37.                 //加1条边(node1->node2)
  38.                 .addEdge("node-1", "node-2")
  39.                 //加1条边(node2->结束)
  40.                 .addEdge("node-2", GraphDefinition.END);
  41.     }
  42. }
复制代码
  
运行结果
  1. current Node: node-1
  2. current Node: node-2
  3. {node1Key=node1-value, test=test-init-value, node2Key=node2-value, myData=node2-my-value}
复制代码
  
解释第3行是运行到END节点时,图的最终状态数据,可以看到myData被node2中的值覆盖成node2-my-value。而其它key的值,每经过1个节点,都会被merge进AgentState的data map中。  文中源码https://github.com/yjmyzz/langgraph4j-study/tree/main/src/main/java/org/bsc/langgraph4j/agent/_05_sequence
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册