第一个Agent
你将学会: 用 create_agent 让模型在需要时调用你写的函数。
前置: L00、L01。

Agent = Model + Harness。Harness 就是循环:看消息 → 调工具或作答 → 把工具结果塞回去 → 再看。LangChain 把循环写好了,入口是 create_agent。
完整代码
from dotenv import load_dotenv
load_dotenv()
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.tools import tool
model = init_chat_model(
"deepseek:deepseek-chat",
temperature=0.5,
max_tokens=2500,
timeout=300,
max_retries=6,
)
@tool
def get_weather(city: str) -> str:
"""查询某城市的天气。city 用中文或英文城市名。"""
print(f"[工具] get_weather({city})", flush=True)
return f"{city}今天晴,25°C。"
agent = create_agent(
model=model,
tools=[get_weather],
system_prompt="你是助手。问天气时必须调用 get_weather,不要编造。",
)
result = agent.invoke(
{"messages": [{"role": "user", "content": "杭州天气怎么样?"}]}
)
print("\n--- 轨迹 ---")
for m in result["messages"]:
name = getattr(m, "name", "")
extra = f" name={name}" if name else ""
print(f"{m.type:8s}{extra} {m.text[:80]!r}")
print("\n最终回答 =>", result["messages"][-1].content)
终端里应出现 [工具] get_weather(...),说明是 Python 执行了函数,不是模型「假装查了天气」。
现在可以回答:三套产品怎么选
你已经亲手跑过 create_agent,这三句话才有意义:
| 需求 | 用 |
|---|---|
| 模型 + 工具循环(你现在这样) | LangChain create_agent |
| 循环不够,要自己规定每一步(先校验再问模型再发邮件) | LangGraph StateGraph(L10) |
| 任务很长,要写文件、派小弟、做计划 | Deep Agents create_deep_agent(L11) |
LangChain 的 agent 底层已经是 LangGraph。用 create_agent 不必先学画图。
常见翻车
| 现象 | 处理 |
|---|---|
| 模型直接口胡天气、不调工具 | 系统提示写明「必须调用」;工具 docstring 写清何时用 |
tool_choice / thinking 报错 | 模型改回 deepseek-chat |
| 函数没有 docstring | @tool 靠 docstring 告诉模型,必须写 |
练习
- 再加一个工具
get_time(city: str) -> str,固定返回"12:00"。问「杭州现在天气和时间」。确认两个工具都被调用(或至少天气被调用、时间在提示下被调用)。 - 把
get_weather的返回改成"未知城市",看模型如何把工具结果讲给人听。
本章验收
- 能从零写出带
@tool的create_agent并跑通 - 能在日志里指出:哪一步是模型、哪一步是你的函数
- 能用自己的话说清何时还不用 LangGraph
对照仓库:01-快速入门/Overview概览.py、03-代理与工具/Agents代理.py
下一课:让 Agent 记住对话
JavaWeb
Spring
MyBatis
linux
消息队列
JavaSE
工具
片段
AI
搜索
dy