Agent 开发学习记录:LangGraph Quickstart

最近开始系统学 Agent 开发,准备用 LangGraph 做一些多 Agent 的练习。

背景是:我是前端,对大模型、tool calling、模型 API 这些概念不算陌生,但 Python、LangChain、LangGraph 这套生态比较浅。所以这次不是直接复制 demo,而是边跑官方 quickstart,边把每个不确定的细节都弄清楚。

一开始先做项目初始化,用 uv init 建 Python 项目。

很快遇到第一个坑:项目名叫 langgraph,然后 uv add langgraph 报错,因为项目名和依赖名撞了,等于项目依赖自己。于是把项目名改成了 langgraph-demo

接着配置模型。

我用的是 Azure 的 cognitiveservices.azure.com endpoint,不是传统的 xxx.openai.azure.com。这里确认了一下该用 langchain-openai 里的 ChatOpenAI,并把 OPENAI_API_KEYOPENAI_BASE_URLOPENAI_MODEL 放进 .env,再用 python-dotenv 加载。

然后开始看 LangGraph quickstart。

真正花时间的地方,不是模型调用,而是把一些基础但关键的细节弄清楚。比如:

  • Python 里的函数怎么定义
  • 字典和对象有什么区别
  • state["messages"]message.content 为什么一个用 [],一个用 .
  • TypedDict 为什么用 class 定义
  • Annotated[list[AnyMessage], operator.add] 到底是什么意思
  • operator.add 为什么能让 messages 追加
  • @tool 为什么要求函数必须写 docstring
  • ToolMessage 为什么要用 tool_call_id,而不是只用工具名
  • Literal["tool_node", END] 为什么 Pylance 会警告

这些问题看起来都挺细,也不全是 Agent 编排本身。

但它们会影响我对这套 Python 生态的掌控感。基础语法、类型、消息对象、工具封装这些东西越清楚,后面看 LangGraph 的 node、state、edge、tool loop 时就越不容易糊成一团。

到 LangGraph 这里,核心其实就是 state 怎么变、node 怎么跑、edge 怎么决定下一步。

现在我对最小 tool-calling Agent 的理解大概是:

用户消息
-> LLM 节点
-> 如果 AIMessage 里有 tool_calls,就进入 tool_node
-> tool_node 执行工具,把结果包装成 ToolMessage
-> 回到 LLM
-> LLM 根据工具结果生成最终回答
-> END

messages 是整个流程的上下文主线。

llm_call 返回 {"messages": [AIMessage]}

tool_node 返回 {"messages": [ToolMessage]}

因为 state 里用 operator.add 定义了 reducer,所以这些消息不是覆盖,而是不断追加。

这一步让我对 Agent 的感觉从"模型自己会用工具"变成了"程序在显式控制模型和工具之间的循环"。

另外官方示例里用了 display(...) 画图,我才发现这块最好配合 Jupyter Notebook 看。

后面准备继续学:

  • checkpoint
  • interrupt
  • human-in-the-loop
  • multi-agent supervisor
  • MCP 工具接入

因为我也想把学习记录同步发到 X 上,所以顺手看了下 X 官方的 MCP server。

后面可能会做一个很小的工作流:

AI 总结学习记录
-> 生成 X 草稿
-> 人工确认
-> 调 MCP 发帖

我现在感觉,如果只是复制 quickstart,其实很快就能跑起来。但真想搞明白,还是得知道 Python 类型、state 是怎么合并的、messages 里到底放了什么、工具调用结果怎么回到模型。

所以我现在不急着上复杂多 Agent,先把一个最小 Graph 跑明白。遇到看似很小的问题,就先追问到自己能用白话讲出来。

这样学会慢一点,但我会更有底。

代码和学习记录会继续放在这个仓库里:

https://github.com/Colin3191/langgraph-demo

这次主要对着 LangGraph Quickstart 学:

https://docs.langchain.com/oss/python/langgraph/quickstart