前言

在开始写代码之前,先回答一个问题:Agent 到底是什么?

这个词被用滥了,各家有各家的说法。Anthropic 在 Building Effective Agents 里给出了一个相对清晰的定义,他们先区分了两个容易混淆的概念:

翻译过来就是:Workflow 是按剧本走的,每一步都是提前写死的;Agent 是自己决定怎么走的,根据当前情况动态选择下一步该做什么。

Anthropic 进一步描述了 Agent 的运作方式:

简单说:Agent 接到任务 → 自主规划 → 调用工具获取环境反馈 → 根据反馈决定下一步 → 直到任务完成。

其中最关键的一个能力是工具调用(Tool Use)。没有工具,LLM 只能说;有了工具,LLM 才能做。这篇就从这里开始。

那我们就从这里开始,写一个最简单的 Agent。本处使用langchain的执行环境。


用 LangChain 写一个会查天气的 Agent

我们来实现一个最小的 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 写得越清晰,模型调用得越准确,这点不能省。

初始化模型和 Agent

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 闭环。


小结

这篇做了两件事:

  1. 借 Anthropic 的定义说清楚了 Agent 和 Workflow 的区别——关键在于谁来决定下一步
  2. 用 LangChain 写了一个最小的工具调用 Agent,把"说"和"做"的闭环跑通了

下一篇会深入工具这个话题,看看在tool调用上Agent内部实际做了什么,以及除了自定义函数,还能给 Agent 装上哪些更强的手脚。


参考资料:Building Effective Agents — Anthropic

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com