
LangChain 文档对 Agent 的定义很清晰:一个能够感知环境、对环境采取行动、并基于目标做智能决策的实体。而让这一切在软件里成为可能的,是 LLM 的推理能力——LLM 就是 Agent 的大脑,它负责思考如何完成用户提出的请求。
除了大脑,Agent 还需要「手脚」——也就是 Tool(工具)。Agent 通过工具与环境交互:查股票行情、更新日历事件、跑数据库查询……都可以封装成工具。而一组工具的集合,就叫 Toolkit。实现层面,Toolkit 就是一个工具数组。
所以一个最基础的 Agent 只需要两样东西:
概念好懂,动手才有感觉。我们来做一个「数学 Agent」,支持加、乘、平方三种运算。
mkdir simple-math-agent && cd simple-math-agent
touch math-agent.py
python3 -m venv .venv && source .venv/bin/activate
pip install langchain langchain_openai方式一:继承 BaseTool
最底层的做法是继承 BaseTool,设置 name、description,实现 _run 方法:
from langchain_core.tools import BaseTool
class AddTool(BaseTool):
name = "add"
description = "将两个数相加"
args_schema = AddInput
return_direct = True
def _run(self, a: int, b: int, run_manager=None) -> str:
return a + bargs_schema 需要提供一个 pydantic 模型来声明入参:
class AddInput(BaseModel):
a: int = Field(description="第一个数")
b: int = Field(description="第二个数")方式二:@tool 装饰器(推荐)
LangChain 提供了更简洁的 @tool 装饰器,背后会自动帮你做 BaseTool 的封装:
from langchain.tools import tool
@tool
def add(a: int, b: int) -> int:
"""将两个数相加""" # docstring 会自动成为工具描述
return a + b装饰器版的约定:
可以看到这些属性都暴露了出来:
print(add.name) # add
print(add.description) # 将两个数相加
print(add.args) # {'a': {...}, 'b': {...}}> ⚠️ 工具描述非常重要——这是 LLM 判断「该不该用这个工具」的依据。描述写不好,工具要么该用时不用、要么不该用时乱用。
再补两个工具:
@tool
def multiply(a: int, b: int) -> int:
"""将两个数相乘"""
return a * b
@tool
def square(a) -> int:
"""计算一个数的平方"""
a = int(a)
return a * aToolkit 一点也不神秘,就是把工具放进一个列表:
toolkit = [add, multiply, square]实际项目中,Toolkit 通常是「能协作完成某类任务」的工具组,比如一个 SQL Toolkit 可能包含:生成 SQL 查询、校验 SQL、执行 SQL 三个工具。LangChain 社区还维护了一大批现成的 Toolkit 可以直接用。
LLM 是 Agent 的大脑:它根据问题决定调哪个工具、下一步做什么、什么时候该结束并返回答案。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0)Agent 需要一个 ChatPromptTemplate,核心是 system prompt 部分——告诉它自己是什么角色、该解决什么任务:
prompt = ChatPromptTemplate.from_messages([
("system", """
你是一个数学助手。请使用工具回答问题。
如果没有工具可以回答,请直接说明。
只返回答案本身,例如:
Human: 1 + 1 等于多少?
AI: 2
"""),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
MessagesPlaceholder("agent_scratchpad"),
])示例问答是让 Agent 学会「只输出答案、不要废话」的有效手段。
agent = create_agent(llm=llm, tools=toolkit, prompt=prompt)
print(agent.invoke("3 的平方是多少?")) # 9
print(agent.invoke("12 乘以 8 等于?")) # 96跑起来试试,Agent 会先推理、再调用对应工具、最后用简洁的答案回复你。
1. 工具是能力的边界:Agent 再聪明,也只能用你给它的工具。设计工具时把粒度控制好——太粗则模型不好匹配,太细则调用链过长。
2. 描述决定命中率:工具 description 写清楚「做什么、参数含义」,模型才能准确选工具。
3. 从简单开始:先跑通数学 Agent 这种最小闭环,理解 LLM 决策 → 工具调用 → 结果返回的链路,再去接数据库、外部 API、复杂的业务系统。
LangChain Agent 的构建门槛比想象中低:一个 LLM、几个 Tool、一个 Toolkit、一段 Prompt,就能组装出具备「感知-决策-行动」闭环的 Agent。理解这些基础积木之后,无论是接 SQL、日历还是企业系统,都是同一套模式向外延伸——这也是我推荐任何想入门 Agent 开发的团队先亲手做一个「最小 Agent」的原因。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。