为什么值得先写这篇

很多人对 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 里真正重要的四块

  1. 工具循环:模型要工具 → 执行 → 结果回写 → 再问模型
  2. 状态:AgentState 里至少有 messages
  3. 中间件:重试、摘要、人在环、限流等
  4. 持久化:checkpointer + thread_id 才能跨轮记忆

和旧认知的差异

以前常写 initialize_agent / AgentExecutor。现在默认入口是 create_agent,底层跑在 LangGraph 上。好处是:循环、状态、中断、检查点都更可控。

我的结论

如果你只是想验证一个 Agent 思路,不要一上来堆框架全家桶。
先用 create_agent 把 模型 + 工具 + 系统提示 跑通,再加中间件。

下一篇我会单独拆:工具定义里最容易踩的几个坑。