为什么值得先写这篇
很多人对 LangChain 的印象还停留在旧版 Agent Executor。现在的官方叙事变了:
Agent = Model + Harness
Harness 是模型外面那圈:提示词、工具、中间件、状态与循环。模型只负责「决定下一步」,Harness 负责「在对的时刻给对的上下文」。
这篇不追大而全,只把最小可跑结构说清楚。
最小 Agent
from langchain.agents import create_agent
def get_weather(city: str) -> str:
"""Get weather for a given city."""
return f"Always sunny in {city}!"
agent = create_agent(
model="openai:gpt-4o",
tools=[get_weather],
system_prompt="You are a helpful assistant. Be concise.",
)
result = agent.invoke({
"messages": [{"role": "user", "content": "上海天气怎么样?"}]
})
print(result["messages"][-1].content)
三样东西就够了:
| 组件 | 作用 |
|---|---|
| model | 决定说还是调工具 |
| tools | 可被调用的能力 |
| system_prompt | 约束风格与边界 |
Harness 里真正重要的四块
- 工具循环:模型要工具 → 执行 → 结果回写 → 再问模型
- 状态:
AgentState里至少有messages - 中间件:重试、摘要、人在环、限流等
- 持久化:checkpointer +
thread_id才能跨轮记忆
和旧认知的差异
以前常写 initialize_agent / AgentExecutor。现在默认入口是 create_agent,底层跑在 LangGraph 上。好处是:循环、状态、中断、检查点都更可控。
我的结论
如果你只是想验证一个 Agent 思路,不要一上来堆框架全家桶。
先用 create_agent 把 模型 + 工具 + 系统提示 跑通,再加中间件。
下一篇我会单独拆:工具定义里最容易踩的几个坑。