项目总介绍: Agent自学指南
前言
在开始写代码之前,先回答一个问题:Agent 到底是什么?
这个词被用滥了,各家有各家的说法。Anthropic 在 Building Effective Agents 里给出了一个相对清晰的定义,他们先区分了两个容易混淆的概念:
Workflows are systems where LLMs and tools are orchestrated through predefined code paths. Agents, on the other hand, are systems where LLMs dynamically direct their own processes and tool usage, maintaining control over how they accomplish tasks.
翻译过来就是:Workflow 是按剧本走的,每一步都是提前写死的;Agent 是自己决定怎么走的,根据当前情况动态选择下一步该做什么。
Anthropic 进一步描述了 Agent 的运作方式:
Agents begin their work with either a command from, or interactive discussion with, the human user. Once the task is clear, agents plan and operate independently, potentially returning to the human for further information or judgement. During execution, it's crucial for the agents to gain "ground truth" from the environment at each step (such as tool call results or code execution) to assess its progress.
简单说:Agent 接到任务 → 自主规划 → 调用工具获取环境反馈 → 根据反馈决定下一步 → 直到任务完成。
其中最关键的一个能力是工具调用(Tool Use)。没有工具,LLM 只能说;有了工具,LLM 才能做。这篇就从这里开始。
那我们就从这里开始,写一个最简单的 Agent。本处使用langchain的执行环境。
用 LangChain 写一个会查天气的 Agent
我们来实现一个最小的 Agent:给它一个查天气的工具,然后让它自己决定什么时候调用。
安装依赖
bash
pip install langchain langchain-openai
定义工具
python
@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 写得越清晰,模型调用得越准确,这点不能省。
初始化模型和 Agent
python
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 会把每一步的推理过程打印出来,调试阶段建议开着。
运行
python
result = agent_executor.invoke({"input": "北京今天天气怎么样?"})
print(result["output"])
输出大概长这样:
csharp
> Entering new AgentExecutor chain...
Invoking: `get_weather` with `{'city': '北京'}`
晴,气温 12°C,微风
北京今天天气晴朗,气温 12°C,有微风,适合外出。
> Finished chain.
模型自己判断需要调用 get_weather,传入正确的参数,拿到结果之后再组织成自然语言回答。这就是最基本的 Agent 闭环。
小结
这篇做了两件事:
- 借 Anthropic 的定义说清楚了 Agent 和 Workflow 的区别------关键在于谁来决定下一步
- 用 LangChain 写了一个最小的工具调用 Agent,把"说"和"做"的闭环跑通了
下一篇会深入工具这个话题,看看在tool调用上Agent内部实际做了什么,以及除了自定义函数,还能给 Agent 装上哪些更强的手脚。