LangGraph4j 入门指南:面向 Java 开发者的有状态 AI 工作流框架
LangGraph4j 是 Java 生态中用于构建「有状态、可循环、多步骤」LLM 应用的工作流编排库,灵感来自 Python 的 LangGraph,可与 LangChain4j、Spring AI 配合使用。
读者与前置知识
| 项目 | 说明 |
|---|---|
| 目标读者 | 有 Java 开发经验、刚开始接触 LLM / Agent 的开发者 |
| 需要会 | Java 17+、Maven/Gradle、接口与 Lambda、基本的 CompletableFuture 概念 |
| 不必先会 | Python、LangChain、向量数据库、Prompt 工程 |
| 建议搭配 | 至少了解「大模型能根据文本生成回复」这一基本事实即可开始 |
1. 先搞清楚:你要解决什么问题?
1.1 普通 Java 程序 vs LLM 应用
你熟悉的 Spring Boot 接口通常是:
请求 → 业务逻辑 → 数据库 → 返回 JSON
而 LLM 应用常见模式是:
用户问题 → 调用大模型 → 可能还要查资料、调工具、再调模型 → 最终回答
难点在于:中间步骤不固定 。模型可能决定「先搜网页」「再算数」「最后总结」,也可能失败后重试------这不是一条直线,而是一张带分支、可回环的流程图。
1.2 LangGraph4j 在生态中的位置
┌─────────────────────────────────────────────────────────┐
│ 你的 Java 应用 │
├─────────────────────────────────────────────────────────┤
│ LangGraph4j ← 工作流编排(图、状态、检查点) │
├─────────────────────────────────────────────────────────┤
│ LangChain4j 或 Spring AI ← 调模型、工具、RAG、记忆 │
├─────────────────────────────────────────────────────────┤
│ OpenAI / Ollama / 通义 / 其他模型 API │
└─────────────────────────────────────────────────────────┘
| 库 | 职责 | 类比 |
|---|---|---|
| LangChain4j / Spring AI | 封装模型调用、Tool、Embedding、RAG | 像 JDBC 驱动 + 工具箱 |
| LangGraph4j | 定义「先做什么、再做什么、状态怎么传」 | 像工作流引擎(Activiti / Camunda 的 AI 版思路) |
| LangGraph (Python) | 同一套设计理念的 Python 实现 | Java 版即 LangGraph4j |
LangGraph4j 不负责 替你选模型或写 Prompt;它负责把多个步骤(节点)连成一张可执行、可持久化、可调试的图。
1.3 为什么需要「图」而不是 if-else?
手写 if-else 在 3 步流程时还能应付。当出现以下情况时,图结构更清晰:
- Agent 根据结果循环(例如:工具调用失败 → 换策略重试)
- 多个 Agent 协作(研究 Agent → 写作 Agent → 审核 Agent)
- 需要暂停等人审批(Human-in-the-loop)
- 长对话要断点续跑(检查点持久化)
- 要可视化流程、逐步调试
LangGraph4j 用 StateGraph(状态图) 表达这些逻辑;与只能表示「有向无环」的 DAG 相比,它支持环(cycle),这是 Agent「反复思考---行动」的基础。
2. 五个核心概念(用 Java 思维理解)
把 LangGraph4j 想成:共享状态的有限状态机 + 可编排的任务节点。
#mermaid-svg-B9fscy89HwBbUBE0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-B9fscy89HwBbUBE0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-B9fscy89HwBbUBE0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-B9fscy89HwBbUBE0 .error-icon{fill:#552222;}#mermaid-svg-B9fscy89HwBbUBE0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-B9fscy89HwBbUBE0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-B9fscy89HwBbUBE0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-B9fscy89HwBbUBE0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-B9fscy89HwBbUBE0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-B9fscy89HwBbUBE0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-B9fscy89HwBbUBE0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-B9fscy89HwBbUBE0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-B9fscy89HwBbUBE0 .marker.cross{stroke:#333333;}#mermaid-svg-B9fscy89HwBbUBE0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-B9fscy89HwBbUBE0 p{margin:0;}#mermaid-svg-B9fscy89HwBbUBE0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-B9fscy89HwBbUBE0 .cluster-label text{fill:#333;}#mermaid-svg-B9fscy89HwBbUBE0 .cluster-label span{color:#333;}#mermaid-svg-B9fscy89HwBbUBE0 .cluster-label span p{background-color:transparent;}#mermaid-svg-B9fscy89HwBbUBE0 .label text,#mermaid-svg-B9fscy89HwBbUBE0 span{fill:#333;color:#333;}#mermaid-svg-B9fscy89HwBbUBE0 .node rect,#mermaid-svg-B9fscy89HwBbUBE0 .node circle,#mermaid-svg-B9fscy89HwBbUBE0 .node ellipse,#mermaid-svg-B9fscy89HwBbUBE0 .node polygon,#mermaid-svg-B9fscy89HwBbUBE0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-B9fscy89HwBbUBE0 .rough-node .label text,#mermaid-svg-B9fscy89HwBbUBE0 .node .label text,#mermaid-svg-B9fscy89HwBbUBE0 .image-shape .label,#mermaid-svg-B9fscy89HwBbUBE0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-B9fscy89HwBbUBE0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-B9fscy89HwBbUBE0 .rough-node .label,#mermaid-svg-B9fscy89HwBbUBE0 .node .label,#mermaid-svg-B9fscy89HwBbUBE0 .image-shape .label,#mermaid-svg-B9fscy89HwBbUBE0 .icon-shape .label{text-align:center;}#mermaid-svg-B9fscy89HwBbUBE0 .node.clickable{cursor:pointer;}#mermaid-svg-B9fscy89HwBbUBE0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-B9fscy89HwBbUBE0 .arrowheadPath{fill:#333333;}#mermaid-svg-B9fscy89HwBbUBE0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-B9fscy89HwBbUBE0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-B9fscy89HwBbUBE0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B9fscy89HwBbUBE0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-B9fscy89HwBbUBE0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B9fscy89HwBbUBE0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-B9fscy89HwBbUBE0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-B9fscy89HwBbUBE0 .cluster text{fill:#333;}#mermaid-svg-B9fscy89HwBbUBE0 .cluster span{color:#333;}#mermaid-svg-B9fscy89HwBbUBE0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-B9fscy89HwBbUBE0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-B9fscy89HwBbUBE0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-B9fscy89HwBbUBE0 .icon-shape,#mermaid-svg-B9fscy89HwBbUBE0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B9fscy89HwBbUBE0 .icon-shape p,#mermaid-svg-B9fscy89HwBbUBE0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-B9fscy89HwBbUBE0 .icon-shape .label rect,#mermaid-svg-B9fscy89HwBbUBE0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B9fscy89HwBbUBE0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-B9fscy89HwBbUBE0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-B9fscy89HwBbUBE0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需要工具
可以回答
START
节点 A
节点 B
条件边
调用工具
生成回复
END
2.1 State(状态)--- AgentState
- 整张图共享一个 Map 结构的状态(键值对)。
- 你通常继承
AgentState,用 Schema 声明每个字段如何更新。 - 类比:一个在整个流水线中传递的
Context对象,每个节点只返回「要改的字段」,由框架合并进总状态。
关键机制:Reducer(归约器)
| Reducer 类型 | 行为 | 典型用途 |
|---|---|---|
| 默认(覆盖) | 新值直接替换旧值 | 当前步骤名、最终答案 |
Channels.appender() |
新值追加到列表 | 对话消息列表、工具调用历史 |
自定义 Channel.of(reducer) |
你定义合并规则 | 例如统一转大写、取最大值 |
2.2 Node(节点)--- 干活的单元
- 实现
NodeAction<YourState>或异步的AsyncNodeAction。 - 输入:当前状态;输出:
Map<String, Object>表示状态增量(不是整份状态)。 - 节点里可以是:调 LLM、查数据库、发 HTTP、纯 Java 业务逻辑------不一定非要调模型。
2.3 Edge(边)--- 控制流
| 类型 | API 思路 | 说明 |
|---|---|---|
| 普通边 | addEdge("A", "B") |
A 执行完必定到 B |
| 条件边 | addConditionalEdges(...) |
根据状态或路由函数决定下一跳 |
| 入口 | addEdge(START, "firstNode") |
图从哪里开始 |
| 出口 | addEdge("lastNode", END) |
图在哪里结束 |
2.4 Compile(编译)--- 运行前校验
stateGraph.compile() 得到 CompiledGraph:
- 检查图结构(例如是否有孤立节点)
- 可传入
CompileConfig:检查点、断点、递归深度限制等 - 必须先 compile 才能 invoke / stream
2.5 Checkpoint(检查点)--- 可恢复的存档
- 每一步可把状态存进
CheckpointSaver(内存、MySQL、PostgreSQL、Redis 等)。 - 用途:多轮对话、崩溃恢复、人工审核后继续、调试时「时光倒流」看历史状态。
3. 环境准备与依赖
3.1 版本要求
| 发布线 | Java 版本 | 说明 |
|---|---|---|
1.8.x 稳定版 |
Java 17+ | 生产环境推荐 |
1.8-SNAPSHOT |
Java 17+ | 尝鲜,API 可能变动 |
撰写本文时 Maven Central 最新稳定版为 1.8.18 (2026-06-12)。集成前请到 Maven Central 确认当前版本号。
3.2 Maven 依赖(最小可运行)
xml
<properties>
<langgraph4j.version>1.8.18</langgraph4j.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.bsc.langgraph4j</groupId>
<artifactId>langgraph4j-bom</artifactId>
<version>${langgraph4j.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.bsc.langgraph4j</groupId>
<artifactId>langgraph4j-core</artifactId>
</dependency>
</dependencies>
3.3 常用扩展模块
| 模块 | 用途 |
|---|---|
langgraph4j-langchain4j / langchain4j-agent |
与 LangChain4j 集成,含 ReAct Agent 示例 |
spring-ai-core / spring-ai-agent |
与 Spring AI 集成 |
langgraph4j-postgres-saver / mysql-saver / redis-saver |
检查点持久化 |
studio(Jetty / Spring Boot / Quarkus) |
嵌入式 Web UI 调试图 |
4. 第一个图:从零跑通(官方最小示例)
下面示例不调用任何大模型,只演示 状态如何在节点间流动。建议原样复制运行一次,再改。
4.1 定义状态
java
import org.bsc.langgraph4j.state.AgentState;
import org.bsc.langgraph4j.state.Channels;
import org.bsc.langgraph4j.state.Channel;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
class SimpleState extends AgentState {
public static final String MESSAGES_KEY = "messages";
// messages 字段:每次更新会「追加」到列表,而不是覆盖
public static final Map<String, Channel<?>> SCHEMA = Map.of(
MESSAGES_KEY, Channels.appender(ArrayList::new)
);
public SimpleState(Map<String, Object> initData) {
super(initData);
}
public List<String> messages() {
return this.<List<String>>value(MESSAGES_KEY).orElse(List.of());
}
}
4.2 定义两个节点
java
import org.bsc.langgraph4j.action.NodeAction;
import java.util.List;
import java.util.Map;
class GreeterNode implements NodeAction<SimpleState> {
@Override
public Map<String, Object> apply(SimpleState state) {
System.out.println("GreeterNode,当前消息: " + state.messages());
return Map.of(SimpleState.MESSAGES_KEY, "Hello from GreeterNode!");
}
}
class ResponderNode implements NodeAction<SimpleState> {
@Override
public Map<String, Object> apply(SimpleState state) {
System.out.println("ResponderNode,当前消息: " + state.messages());
if (state.messages().contains("Hello from GreeterNode!")) {
return Map.of(SimpleState.MESSAGES_KEY, "Acknowledged greeting!");
}
return Map.of(SimpleState.MESSAGES_KEY, "No greeting found.");
}
}
4.3 组图、编译、执行
java
import org.bsc.langgraph4j.StateGraph;
import org.bsc.langgraph4j.GraphStateException;
import static org.bsc.langgraph4j.action.AsyncNodeAction.node_async;
import static org.bsc.langgraph4j.StateGraph.START;
import static org.bsc.langgraph4j.StateGraph.END;
import java.util.Map;
public class SimpleGraphApp {
public static void main(String[] args) throws GraphStateException {
var stateGraph = new StateGraph<>(SimpleState.SCHEMA, SimpleState::new)
.addNode("greeter", node_async(new GreeterNode()))
.addNode("responder", node_async(new ResponderNode()))
.addEdge(START, "greeter")
.addEdge("greeter", "responder")
.addEdge("responder", END);
var compiledGraph = stateGraph.compile();
// stream:每执行完一个节点,yield 一次状态(适合观察中间过程)
for (var item : compiledGraph.stream(
Map.of(SimpleState.MESSAGES_KEY, "Let's begin!"))) {
System.out.println(item);
}
}
}
4.4 执行过程解读
- 初始状态里
messages已有"Let's begin!" greeter追加"Hello from GreeterNode!"responder看到问候语,追加"Acknowledged greeting!"- 到达
END,流结束
两条执行 API:
| 方法 | 返回 | 适用场景 |
|---|---|---|
stream(initialState, config) |
AsyncGenerator,逐步产出状态 |
调试、流式 UI、观察每步结果 |
invoke(initialState, config) |
CompletableFuture<最终状态> |
只关心最终结果 |
5. 条件分支:让图「会做决定」
普通边是固定路线;条件边根据状态动态选下一节点------Agent「该不该调工具」就靠这个。
java
import org.bsc.langgraph4j.action.AsyncCommandAction;
import org.bsc.langgraph4j.graph.EdgeMapping;
// 伪代码结构:节点 A 执行完后,由 routingFunction 决定去向
graph.addConditionalEdges(
"nodeA",
(AsyncCommandAction<MyState>) (state, config) -> {
if (state.needsTool()) {
return "use_tool";
}
return "respond";
},
EdgeMapping.builder()
.to("execute_tool", "use_tool")
.to("generate_answer", "respond")
.build()
);
路由函数返回值是逻辑标签 ;EdgeMapping 把标签映射到真实节点名。这样图里可以出现 A → 工具 → 再回到 A 的环,实现 ReAct(推理 + 行动)循环。
6. 运行时配置:RunnableConfig 与 CompileConfig
6.1 RunnableConfig(单次执行上下文)
java
import org.bsc.langgraph4j.RunnableConfig;
import org.bsc.langgraph4j.CompiledGraph;
var config = RunnableConfig.builder()
.threadId("user-session-123") // 会话/线程 ID,检查点按此分组
.streamMode(CompiledGraph.StreamMode.UPDATES) // 只流式输出「变更」
.putMetadata("userId", "u-001")
.putMetadata("model", "gpt-4")
.build();
compiledGraph.stream(inputs, config);
节点可通过 AsyncNodeActionWithConfig 读取 config.metadata("userId"),实现「同一张图、不同用户不同策略」。
6.2 CompileConfig(编译期行为)
java
import org.bsc.langgraph4j.CompileConfig;
var compileConfig = CompileConfig.builder()
.checkpointSaver(mySaver) // 检查点存储
.recursionLimit(50) // 防死循环,默认 25
.interruptBefore("dangerous_step") // 执行前暂停(人工审核)
.interruptAfter("draft_ready") // 执行后暂停
.build();
var graph = stateGraph.compile(compileConfig);
| 配置项 | 作用 |
|---|---|
checkpointSaver |
状态持久化实现 |
recursionLimit |
超过步数抛错,防止 Agent 无限循环 |
interruptBefore / interruptAfter |
Human-in-the-loop 断点 |
graphId |
日志、监控中区分多图实例 |
7. 检查点与多轮对话
没有检查点时,每次 stream 都是全新的一次执行。要支持「用户第 2 条消息接着聊」,需要:
- 编译时配置
CheckpointSaver - 每次执行使用相同
threadId
java
import org.bsc.langgraph4j.checkpoint.MemorySaver;
var saver = new MemorySaver();
var compiled = stateGraph.compile(
CompileConfig.builder().checkpointSaver(saver).build()
);
var config = RunnableConfig.builder().threadId("chat-001").build();
// 第一轮
compiled.invoke(Map.of("messages", "你好"), config);
// 第二轮:同一 threadId,从检查点恢复上下文
compiled.invoke(Map.of("messages", "刚才我说了什么?"), config);
生产环境可换:
langgraph4j-postgres-saverlanggraph4j-mysql-saverlanggraph4j-redis-saver
8. 与 LangChain4j / Spring AI 集成
LangGraph4j 可以单独用;实际项目里多数会叠加 AI 框架。
8.1 选型建议
| 你已经在用 | 建议 |
|---|---|
| 纯 Java、无 Spring | LangChain4j + langchain4j-agent |
| Spring Boot 3.x | Spring AI + spring-ai-agent |
| 只想学图怎么跑 | 先只依赖 langgraph4j-core(上一章示例) |
8.2 ReAct Agent 快速体验(LangChain4j)
ReAct = 模型推理 → 决定是否调工具 → 看结果 → 再推理,直到能回答。
java
// 1. 定义工具(LangChain4j 注解)
public class TestTool {
@Tool("测试工具")
String execTest(@P("消息") String message) {
return "tool executed OK: " + message;
}
}
// 2. 配置本地 Ollama 模型(需先安装并 pull 模型)
var model = OllamaChatModel.builder()
.modelName("qwen2.5:7b")
.baseUrl("http://localhost:11434")
.temperature(0.0)
.build();
// 3. AgentExecutor 内部已是 LangGraph4j 图
var agent = AgentExecutor.builder()
.chatModel(model)
.toolsFromObject(new TestTool())
.build()
.compile();
for (var item : agent.stream(Map.of("messages", "调用测试工具两次"))) {
System.out.println(item);
}
Spring AI 侧 API 类似,工具注解为 @Tool + @ToolParam,详见仓库 spring-ai/spring-ai-agent 模块。
9. 能力一览(按学习顺序)
| 能力 | 说明 | 学习时机 |
|---|---|---|
| 线性图 | START → 多节点 → END | 第 1 天 |
| 条件边与环 | Agent 循环、分支 | 第 2--3 天 |
stream / invoke |
同步 vs 观察每步 | 第 1 天 |
| Checkpointer | 多轮对话、恢复 | 有状态需求时 |
| Interrupt | 人工审批 | 企业流程 |
| 子图 Subgraph | 大图拆模块 | 复杂系统 |
| 并行分支 | 多节点同时跑 | 性能优化 |
| Studio | 浏览器里看图、跑图 | 调试阶段 |
| PlantUML / Mermaid | 导出流程图 | 文档与评审 |
| OpenTelemetry | 链路追踪 | 生产可观测 |
10. 典型应用场景
| 场景 | 图里大致长什么样 |
|---|---|
| 客服机器人 | 意图识别 → RAG 检索 → 生成 → 不满意则转人工 |
| 代码助手 | 读仓库 → 生成补丁 → 跑测试 → 失败则回到生成 |
| 研报生成 | 搜索 Agent → 摘要 Agent → 写作 Agent → 审核节点(可 interrupt) |
| 审批流 + AI | 业务节点纯 Java,AI 节点只负责起草意见 |
| 多用户 SaaS | 每用户一个 threadId + DB Checkpointer |
11. 与手写代码 / 其他方案的对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 手写 if-else + 状态对象 | 零依赖、完全可控 | 流程复杂后难维护、难可视化 |
| 仅 LangChain4j Chains | 上手快 | 多为 DAG,难表达循环 Agent |
| LangGraph4j | 环、检查点、断点、Studio | 多一层概念,需先理解 State/Node/Edge |
| Python LangGraph | 生态示例最多 | 非 Java 技术栈 |
12. 推荐学习路径(约 1--2 周)
第 1 步 跑通本文 §4 无 LLM 示例
↓
第 2 步 加一个条件边,模拟「需要/不需要工具」两分支
↓
第 3 步 引入 LangChain4j 或 Spring AI,跑通 AgentExecutor
↓
第 4 步 加 MemorySaver,用同一 threadId 发两轮消息
↓
第 5 步 读仓库 how-tos/ 里感兴趣的 notebook(需 Java 22 的部分工具可选)
↓
第 6 步 用 Studio 或 Mermaid 导出图,对照代码理解
13. 常见问题
Q1:compile() 报错 GraphStateException?
常见原因:节点未连到 START/END、条件边映射漏了分支、节点名拼写不一致。对照 addEdge / addConditionalEdges 逐项检查。
Q2:Agent 死循环?
调大或理解 recursionLimit(默认 25)。业务上应在条件边里设计「满足条件则 END」的出口。
Q3:stream 和 invoke 选哪个?
要接 SSE 给前端、或调试每步状态 → stream;批处理只要最终结果 → invoke。
Q4:必须用 LangChain4j 吗?
不必须。langgraph4j-core 可独立使用;只有调模型、Tool、RAG 时才需要 AI 框架。
Q5:和 Spring AI Alibaba Graph 什么关系?
阿里 spring-ai-alibaba-graph-core 内嵌了 LangGraph4j 思想/实现,概念相通;学会 LangGraph4j 后迁移成本低。
14. 参考资源
| 资源 | 链接 |
|---|---|
| GitHub 主仓库 | https://github.com/langgraph4j/langgraph4j |
| 官方文档站 | https://langgraph4j.github.io/langgraph4j/ |
| Maven Central | https://central.sonatype.com/search?q=g%3Aorg.bsc.langgraph4j |
| 示例项目集 | https://github.com/langgraph4j/langgraph4j-examples |
| Discord 社区 | https://discord.gg/szVVztSYKh |
| Spring AI + LangGraph4j 入门模板 | https://github.com/Breezeware-OS/dynamo-multi-ai-agent-langgraph4j-starter |
15. 术语表
| 术语 | 含义 |
|---|---|
| LLM | Large Language Model,大语言模型 |
| Agent | 能根据环境多步决策的程序(常含模型 + 工具) |
| ReAct | Reasoning + Acting,边想边调工具的模式 |
| RAG | Retrieval-Augmented Generation,检索增强生成 |
| State / AgentState | 图内共享状态对象 |
| Node | 执行单元 |
| Edge | 节点间跳转规则 |
| Reducer | 合并状态更新的函数 |
| Checkpoint | 某时刻状态的快照 |
| threadId | 区分不同会话的执行线程标识 |
文档基于 LangGraph4j 1.8.x 官方 README 与 Core Library 文档整理。版本号与 API 以官方仓库为准。