夔新梅 发表于 2026-2-16 20:10:00

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

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

文档https://deepwiki.com/langgraph4j/langgraph4j  顺序工作流  
定义节点
import org.bsc.langgraph4j.action.NodeAction;
import org.bsc.langgraph4j.state.AgentState;

import java.util.Map;

/**
* @author junmingyang
*/
public class Node1Action implements NodeAction {
    @Override
    public Map<String, Object> apply(AgentState state) throws Exception {
      System.out.println("current Node: node-1");
      return Map.of("myData", "node1-my-value",
                "node1Key", "node1-value");
    }
}  
import org.bsc.langgraph4j.action.NodeAction;
import org.bsc.langgraph4j.state.AgentState;

import java.util.Map;

/**
* @author junmingyang
*/
public class Node2Action implements NodeAction {
    @Override
    public Map<String, Object> apply(AgentState state) throws Exception {
      System.out.println("current Node: node-2");
      return Map.of("myData", "node2-my-value",
                "node2Key", "node2-value");
    }
}注:节点上可以携带数据(即:节点的状态),当工作流运行至本节点时,apply()方法将会调用,业务处理逻辑在此处理(如何:包括调用LLM,调用其它接口来更新状态)
 完整示例import org.bsc.langgraph4j.GraphDefinition;
import org.bsc.langgraph4j.GraphRepresentation;
import org.bsc.langgraph4j.GraphStateException;
import org.bsc.langgraph4j.StateGraph;
import org.bsc.langgraph4j.state.AgentState;

import java.util.Map;

import static org.bsc.langgraph4j.action.AsyncNodeAction.node_async;

/**
* SequenceGraphApplication 类演示了如何使用 LangGraph4j 构建和执行一个简单的序列图。
* 该应用程序创建了一个包含两个节点的序列图,节点按顺序执行:
* START -> node-1 -> node-2 -> END
*
* @author 菩提树下的杨过(yjmyzz.cnblogs.com)
* @since 1.0
*/
public class SequenceGraphApplication {

    public static void main(String[] args) throws GraphStateException {
      StateGraph sequenceGraph = getSequenceGraph();

      //打印图的mermaid代码
      System.out.println(sequenceGraph.getGraph(GraphRepresentation.Type.MERMAID, "Sequence Graph", true).content());

      //编译图并运行(初始数据值为 test->test-init-value
      sequenceGraph
                .compile() //编译
                .invoke(Map.of("test", "test-init-value")) //运行(并赋初始值)
                .ifPresent(c -> {
                  //运行结束后,会执行本段逻辑
                  System.out.println(c.data());
                });

    }

    public static StateGraph getSequenceGraph() throws GraphStateException {
      return new StateGraph<>(AgentState::new)
                //向图中添加2个节点
                .addNode("node-1", node_async(new Node1Action()))
                .addNode("node-2", node_async(new Node2Action()))
                //加一条边(开始->node1)
                .addEdge(GraphDefinition.START, "node-1")
                //加1条边(node1->node2)
                .addEdge("node-1", "node-2")
                //加1条边(node2->结束)
                .addEdge("node-2", GraphDefinition.END);
    }


}  
运行结果current Node: node-1
current Node: node-2
{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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

搁胱 发表于 2026-2-19 03:18:51

热心回复!

里豳朝 发表于 2026-2-19 18:44:46

过来提前占个楼

崔瑜然 发表于 2026-2-21 20:30:28

不错,里面软件多更新就更好了

站竣凰 发表于 2026-2-27 23:05:51

新版吗?好像是停更了吧。

匡菲 发表于 2026-3-7 09:42:59

过来提前占个楼

司马黛 发表于 2026-3-7 09:51:13

鼓励转贴优秀软件安全工具和文档!
页: [1]
查看完整版本: LangGraph4j 学习系列(1)-顺序工作流