阶段:G1-核心心智模型 | 预计耗时:45-60 分钟 | 前置:G0 验收通过 代码:
langgraph-learn/examples/01_tool_agent.py(已跑通的计算器 agent,本篇把它拆开) 关联归档:学习 01 篇(为什么要自己敲命令)
学习目标
- 逐行理解这个 50 行文件:工具怎么定义、模型怎么接、agent 怎么造、消息轨迹怎么读
- 建立核心心智模型:Agent = 模型在循环里反复决定"说话还是调工具"
- 做 3 次改动实验,每次先预测再运行
核心知识(逐行解剖)
1. 工具 = 带文档字符串的普通函数
@tool
def add(a: int, b: int) -> int:
"""两数相加"""
return a + b
@tool装饰器做三件事:把函数签名变成参数 schema、把 docstring 变成工具说明书、包一层"模型说调用就执行"的协议- docstring 是写给模型看的——模型靠它判断"这个工具是干嘛的、什么时候用"。写成"adds numbers"和写成"两数相加"会影响模型选择
- 类型注解不是摆设:模型生成参数时按 schema 来
2. 模型 = OpenAI 兼容协议的一个实例
llm = ChatOpenAI(model=..., api_key=os.environ["SILICONFLOW_API_KEY"], base_url="https://api.siliconflow.cn/v1")
- 任何兼容 OpenAI 协议的服务都能这样接(SiliconFlow/DeepSeek 官方/Ollama)——一套代码换厂商
temperature=0:要的是稳定执行,不是创作
3. create_agent:框架替你写好了 ReAct 循环
agent = create_agent(model=llm, tools=[add, multiply], system_prompt="...")
它内部是一张循环图(Studio 里能看):agent节点 ⇄ tools节点,条件边判断"模型要求调工具就进 tools,否则结束"。G1-03 你会亲手把这个循环写一遍——写完才真正理解它。
4. 消息轨迹:结果里最有教材价值的部分
for m in result["messages"]: print(f"[{m.__class__.__name__}] ...")
运行后你会看到类似四条消息:
[HumanMessage] 请计算 (3+5)×12 等于多少?
[AIMessage] (工具调用请求) ← 模型决定调 add(3,5)
[ToolMessage] 8 ← 工具执行结果
[AIMessage] 最终答案... ← 模型继续决定:再调 multiply(8,12)
这就是 Agent 的全部秘密:模型每轮看一遍全部消息,决定"调下一个工具"还是"回答完毕"。
实验任务(3 次改动,每次先写预期)
- 换模型:
LG_MODEL=deepseek-ai/DeepSeek-V3-2 .venv/Scripts/python.exe examples/01_tool_agent.py(注:模型名以 SiliconFlow 控制台为准) - 观察:两个模型的工具调用轨迹有何不同?(调用次数、参数、话术) - 加第三个工具:写一个
@tool def power(base: int, exp: int)——验证你理解了工具定义 - 改 system_prompt:删掉"禁止心算"再跑——模型会不会直接心算报答案?(这就是为什么 prompt 里要有硬性要求)
验收标准
衔接下一阶段
会用高层 API 了 → G1-02 State 与 Reducer:图内部靠什么记住中间结果。