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_KEY、OPENAI_BASE_URL、OPENAI_MODEL 放进 .env,再用 python-dotenv 加载。
然后开始看 LangGraph quickstart。
真正花时间的地方,不是模型调用,而是把一些基础但关键的细节弄清楚。比如:
- Python 里的函数怎么定义
- 字典和对象有什么区别
state["messages"]和message.content为什么一个用[],一个用.TypedDict为什么用class定义Annotated[list[AnyMessage], operator.add]到底是什么意思operator.add为什么能让 messages 追加@tool为什么要求函数必须写 docstringToolMessage为什么要用tool_call_id,而不是只用工具名Literal["tool_node", END]为什么 Pylance 会警告
这些问题看起来都挺细,也不全是 Agent 编排本身。
但它们会影响我对这套 Python 生态的掌控感。基础语法、类型、消息对象、工具封装这些东西越清楚,后面看 LangGraph 的 node、state、edge、tool loop 时就越不容易糊成一团。
到 LangGraph 这里,核心其实就是 state 怎么变、node 怎么跑、edge 怎么决定下一步。
现在我对最小 tool-calling Agent 的理解大概是:
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。
后面可能会做一个很小的工作流:
我现在感觉,如果只是复制 quickstart,其实很快就能跑起来。但真想搞明白,还是得知道 Python 类型、state 是怎么合并的、messages 里到底放了什么、工具调用结果怎么回到模型。
所以我现在不急着上复杂多 Agent,先把一个最小 Graph 跑明白。遇到看似很小的问题,就先追问到自己能用白话讲出来。
这样学会慢一点,但我会更有底。
代码和学习记录会继续放在这个仓库里:
https://github.com/Colin3191/langgraph-demo
这次主要对着 LangGraph Quickstart 学: