惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
WordPress大学
WordPress大学
博客园_首页
罗磊的独立博客
D
Docker
N
Netflix TechBlog - Medium
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
I
InfoQ
L
LangChain Blog
GbyAI
GbyAI
V
V2EX
博客园 - 聂微东
P
Proofpoint News Feed
博客园 - 【当耐特】
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
U
Unit 42
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏

博客园 - 菩提树下的杨过

langchain4j 学习系列(10)-Skill使用示例 利用SWIG实现JAVA调用C/C++代码 LangGraph4j 学习系列(9)-人机协同(human_in_the_loop) LangGraph4j 学习系列(8)-checkpoint检查点 LangGraph4j 学习系列(7)-流式响应 LangGraph4j 学习系列(6)-并行工作流 LangGraph4j 学习系列(5)-Hook勾子 LangGraph4j 学习系列(4)-SCHEMA和Channel LangGraph4j 学习系列(3)-循环工作流 LangGraph4j 学习系列(2)-条件工作流 Agent设计模式学习(基于langchain4j实现)(11) - PlanAndExecute Agent设计模式学习(基于langchain4j实现)(10) - ReACT Agent设计模式学习(基于langchain4j实现)(9) - 人机协同 Agent设计模式学习(基于langchain4j实现)(8) - 非AI智能体 Agent设计模式学习(基于langchain4j实现)(7) - 监督者模式 Agent设计模式学习(基于langchain4j实现)(6) - 组合复杂工作流 Agent设计模式学习(基于langchain4j实现)(5) - 条件工作流 Agent设计模式学习(基于langchain4j实现)(4) - 并行工作流 Agent设计模式学习(基于langchain4j实现)(3) - 循环工作流 Agent设计模式学习(基于langchain4j实现)(2) - 顺序工作流
LangGraph4j 学习系列(1)-顺序工作流
菩提树下的杨过 · 2026-02-16 · via 博客园 - 菩提树下的杨过

一句话秒懂

LangGraph是一个状态管理和工作流编排框架,专注于构建复杂的多步骤应用,LangGraph4j是LangGraph开源生态中的java实现。

既生瑜?何生亮?

Dify VS LangGraph4j (有了dify,还有必要学习langgraph之类的编排框架吗?)

听听deepseek 怎么说?

deepseek

官网

基本概念

langgraph4j

温馨提示:初学者只需了解 节点(NodeAction)、边(EdgeAction)、状态(AgentState) 即可快速上手。

文档

顺序工作流

 

lg4j_01

定义节点

import org.bsc.langgraph4j.action.NodeAction;
import org.bsc.langgraph4j.state.AgentState;

import java.util.Map;

/**
 * @author junmingyang
 */
public class Node1Action implements NodeAction<AgentState> {
    @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<AgentState> {
    @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<AgentState> 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<AgentState> 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中。 

文中源码