LLM 多步调用想收成一张图,LangGraph 官方入门现在落在哪?

Agent 流程一旦超过「问一句、调一次工具」,代码里就容易散成一串 if 和嵌套 await:要不要再问模型、失败了回哪一步、状态塞在哪个字典里,全靠约定。想把控制流画成图再跑时,会碰到 LangGraph。旧书签若还停在 langchain-ai.github.io/langgraph/tutorials/introduction/,打开后会跳到现在的文档域。入口落在 docs.langchain.com 的 overview,动手示例则在同站的 quickstart。

官方把它放在哪一层

overview 给自己的定位是:面向长时间、带状态的 Agent 的底层编排框架与运行时。工作流用共享状态、节点、边组成的图来描述,同一张图里可以混确定性步骤和由模型驱动的步骤。它强调持久执行、流式输出、人机回环这类编排能力,不规定提示词写法,也不强推某一种 Agent 架构。文档举例常借用 LangChain 的模型 / 工具集成,但写明 LangGraph 并不强制依赖 LangChain。

若只想先要一个更高层的 Agent 循环,官方会指向 Deep Agents 或 LangChain agents。需要显式控制状态与控制流时,再落到 LangGraph。产品关系上,LangGraph 是编排运行时,LangSmith 负责追踪、评估与部署观测。入门阶段先分清「图怎么跑」和「调用怎么观测」即可。

最小图长什么样

overview 里的最小示例用 StateGraph、MessagesState、START / END:加一个节点、两条边,compile() 之后 invoke。心里模型可以记成:状态进图 → 节点改状态 → 边决定下一步。quickstart 则把同一套 Graph API 做成计算器 Agent:先声明工具并 bind_tools,再定义状态(消息列表 + 调用计数),然后分别实现「调模型」节点和「执行工具」节点,用条件边决定是继续进工具节点还是结束。

安装侧 overview / quickstart 都给了 pip install -U langgraph(以及 uv add)一类入口。quickstart 示例还会装 langchain、langchain-anthropic 以便接聊天模型。模型字符串、默认提供商回文档页核对,正文不写死某一个会过期的快照号。跑通之后,文档指向持久化(checkpointer)、人机回环(interrupt)、流式输出等下一层能力,不必第一天全接。

节点、边、条件边分别干什么

对照 quickstart 的计算器例子,心智可以拆成三块:节点是「干一件事」(调模型、跑工具、写死一段校验)。普通边是「做完 A 一定去 B」。条件边根据状态里的字段(例如最后一条消息有没有 tool_calls)在「再进工具节点」和「结束」之间选路。状态用 TypedDict 一类结构声明后,节点返回的是对状态的增量更新。消息列表常用注解做成追加而不是整表覆盖,避免后一步把前序对话抹掉。

第一张图不必上多 Agent。把现有「模型 → 工具 → 再模型」收成两个节点加一条条件边,往往就比继续堆嵌套 await 好维护。持久化、人机审批、跨会话记忆都是图能跑通之后的加项,overview 把它们列在 capabilities 里,按需点进去即可。

密钥和数据边界先于「图好不好看」

quickstart 前提是:你已经有某个模型提供商的 API key,写在环境变量或本地 .env,不要写进仓库、更不要硬编码进节点函数。工具节点会执行模型选中的调用。若工具能碰文件、数据库或内网接口,权限应和普通后端任务同一套闸门,而不是「图编译成功了就等于安全」。站内此前写过工程侧两篇,可对照一句、不复述正文:循环与费用要用进程内熔断,而不是只写在 Prompt 里(见 Agent 熔断与次数上限)。外部模型进业务仓要先谈代码边界与审批(见 外部模型与代码边界)。

LangGraph 帮你把控制流收干净,不替你决定「工具能不能删库」「密钥放哪」。灰产爬取、打穿沙箱、绕过鉴权之类不在本文范围。合法业务里,把工具做成最小权限、把密钥留在运行环境,比先追求复杂多 Agent 拓扑更要紧。

若你们已经有一堆散落的 await llm + await tool,可以先在纸上画出「状态里有什么、有哪些节点、条件边怎么走」,再对照 overview 的最小图和 quickstart 的工具循环,看差的是编排还是业务规则本身。

你们现在卡在「状态该怎么建模」,还是「条件边不知道何时结束」?