给大模型装上计算器,很多简单任务就不用自己硬算了。LangChain 的 Agent 套路是让模型自己判断什么时候该调哪个工具,这样它就不只是个聊天的,还能真的算点东西。下面我们搭一个只做加法和乘法的数学 Agent,顺便看看怎么控制它不乱接话。
两种定义工具的方式
LangChain 里自定义工具基本就两条路:继承 BaseTool 类,或者用 @tool 装饰器。前者适合逻辑复杂、需要状态管理的场景;后者一行注解搞定,适合快速原型。我平常写 Demo 之类的基本全用装饰器,省事。
继承 BaseTool
这种方式需要定义一个输入 Schema(用 Pydantic),然后实现 _run 方法。LLM 会根据 description 和 args_schema 知道什么时候该用什么参数调用你。
from typing import Type, Optional
from langchain_core.tools import BaseTool
from langchain_core.pydantic_v1 import BaseModel, Field
class AddInput(BaseModel):
a: int = Field(description="第一个数字")
b: int = Field(description="第二个数字")
class AddTool(BaseTool):
name = "add"
description = "将两个数字相加"
args_schema: Optional[Type[BaseModel]] = AddInput
return_direct: bool = True
def _run(self, a: int, b: int) -> int:
return a + b
tool_instance = AddTool()
print(tool_instance.name)
print(tool_instance.description)
name 是唯一标识,description 是给 LLM 看的说明书——你可以写得详细点,甚至加几个例子。args_schema 约束了参数格式,能减少模型自己瞎编的几率。


