答题钱多多
111.21M · 2026-02-21
在开始写代码之前,先回答一个问题:Agent 到底是什么?
这个词被用滥了,各家有各家的说法。Anthropic 在 Building Effective Agents 里给出了一个相对清晰的定义,他们先区分了两个容易混淆的概念:
翻译过来就是:Workflow 是按剧本走的,每一步都是提前写死的;Agent 是自己决定怎么走的,根据当前情况动态选择下一步该做什么。
Anthropic 进一步描述了 Agent 的运作方式:
简单说:Agent 接到任务 → 自主规划 → 调用工具获取环境反馈 → 根据反馈决定下一步 → 直到任务完成。
其中最关键的一个能力是工具调用(Tool Use)。没有工具,LLM 只能说;有了工具,LLM 才能做。这篇就从这里开始。
那我们就从这里开始,写一个最简单的 Agent。本处使用langchain的执行环境。
我们来实现一个最小的 Agent:给它一个查天气的工具,然后让它自己决定什么时候调用。
pip install langchain langchain-openai
@tool
def get_weather(city: str) -> str:
"""查询指定城市的当前天气。"""
mock_data = {
"北京": "晴,气温 12°C,微风",
"上海": "多云,气温 18°C,东南风 3 级",
"广州": "小雨,气温 22°C,湿度 85%",
}
return mock_data.get(city, f"暂无 {city} 的天气数据")
@tool 是 LangChain 提供的装饰器,它会把函数的名称和 docstring 自动转成模型可以理解的工具描述。docstring 写得越清晰,模型调用得越准确,这点不能省。
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain.agents import create_agent
import os
# 设置 OpenAI API Key
os.environ["OPENAI_API_KEY"] = "xxx" #改成自己的API_KEY
tools = [get_weather]
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 使用新版 LangChain 的 create_agent
agent = create_agent(llm, tools)
{agent_scratchpad} 是 Agent 的"草稿纸",用来记录中间的思考过程和工具调用结果,不能删。verbose=True 会把每一步的推理过程打印出来,调试阶段建议开着。
result = agent_executor.invoke({"input": "北京今天天气怎么样?"})
print(result["output"])
输出大概长这样:
> Entering new AgentExecutor chain...
Invoking: `get_weather` with `{'city': '北京'}`
晴,气温 12°C,微风
北京今天天气晴朗,气温 12°C,有微风,适合外出。
> Finished chain.
模型自己判断需要调用 get_weather,传入正确的参数,拿到结果之后再组织成自然语言回答。这就是最基本的 Agent 闭环。
这篇做了两件事:
下一篇会深入工具这个话题,看看在tool调用上Agent内部实际做了什么,以及除了自定义函数,还能给 Agent 装上哪些更强的手脚。
参考资料:Building Effective Agents — Anthropic