LangGraph4J

LangGraph4J和 LangChain4J 有什么区别?

  • LangChain4J 专注于 LLM 调用链、Prompt 模板、RAG 等基础能力的封装,是"链式"编排
  • LangGraph4J 专注于复杂 Agent 工作流的"图式"编排,支持状态机、条件分支、循环、检查点等高级特性
  • LangGraph4J 可以看作是 LangChain4J 的上层编排框架,用于构建更复杂的 Agent 应用场景。
  • LangChain4J 更像是一套乐高积木,提供了各种现成的组件让你去调用大模型;而 LangGraph4J 则是搭积木的图纸和流水线,它关注的是怎么把这些组件按照一定的逻辑编排起来
  • LangGraph4J 的核心抽象是 StateGraph,需要先定义一个状态类,里面包含消息历史、中间结果这些字段,然后每个节点执行的时候都能读取和修改这个共享状态。而 LangChain4J 没有内置的状态管理机制,如果要做多轮对话或者复杂的上下文传递,得自己去维护。

LangGraph4J 中 StateGraph 和 CompiledGraph 的区别?

  • StateGraph:你在纸上画流程图、写节点逻辑、画箭头 → 还不能跑。
  • CompiledGraph:把流程图 “编译” 成可执行程序 → 能直接跑、能断点、能回溯。
  • StateGraph 相当于 Java 源代码,CompiledGraph 相当于编译后的字节码

请解释 AgentState 在 LangGraph4J 中的作用

  • AgentState 就是 AI 工作流的共享笔记本所有节点都靠它存数据、读数据、传数据!
  • 存数据:用户问什么、AI 想什么、查到什么数据,全都存在这里。
  • 数据传递:第一个节点(思考)把结果写进去第二个节点(查天气)从里面读第三个节点(生成回答)再从里面读,节点之间不直接说话,只读写这个本子。
  • 决定下一步怎么走(指路)AI 看一眼本子:有工具调用 → 走工具节点没有 → 直接回答
// 这就是一个笔记本!
class MyState extends AgentState {
    String userQuestion;  // 存用户问题
    String weatherInfo;   // 存天气结果
    String aiAnswer;      // 存AI最终回答
}

项目中是如何使用适配器模式将现有的 NodeExecutor 适配为 LangGraph 的 AsyncNodeAction 的?

  • 写一个适配器类,包裹旧的 NodeExecutor,把 LangGraph 标准的异步调用,转发给老同步执行器,再把结果包装成框架要的异步格式,完美兼容,不改老代码。
  • 在LangGraph框架内部跑流程、跑异步、跑并发、跑断点、跑流式只认 AsyncNodeAction不认你自己写的 NodeExecutor你不转,就塞不进流程图里。
  • NodeExecutor = 你原来的圆孔插头,AsyncNodeAction = 新的扁孔插座,适配器 = 转接头
  • 原来项目业务都是换成一个个接口,比如下单,支付都是一个个节点,每个节点都实现一个NodeExecutor自定义接口,所有节点,只能从这里拿数据不能自己加参数、不能乱传值、不能读数据库
  • 所有节点,只能返回要更新的数据不能返回别的、不能抛异常乱飞、不能直接返回页面
  • 输出必须是:Map(要更新到笔记本里的数据)所有节点,只能返回要更新的数据不能返回别的、不能抛异常乱飞、不能直接返回页面
  • 这样操作就统一了所有节点的格式
public interface NodeExecutor {

    // 就这一个方法!!!
    Map<String, Object> execute(FlowContext context);

}

GraphBuilder 图构建器是如何自动识别入口和出口节点的?

  • 你告诉它:有哪些步骤(节点)
  • 你告诉它:步骤之间怎么跳转(箭头 / 边,比如哪一步到哪一步放在数组里)
  • 它自动数:每个步骤被多少箭头指向(入度,写循环程序自动找入度出度)
  • 它自动数:每个步骤指出多少箭头(出度)
  • 入度 = 0 → 自动当开始
  • 出度 = 0 → 自动当结束
posted @ 2026-04-01 13:55  Huangyien  阅读(107)  评论(0)    收藏  举报