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 → 自动当结束