给Agent装上“手脚”:LangChain Tools 定义与使用完全指南

📅 2026/7/10 5:46:29
给Agent装上“手脚”:LangChain Tools 定义与使用完全指南
在前一篇博客中我们认识了AI Agent的核心概念——一个能够自主决策、规划并执行任务的智能体。如果说LLM是Agent的“大脑”负责思考和推理那么Tools工具 就是Agent的“手脚”让它能够真正地与世界互动查询数据库、调用API、执行代码、搜索实时信息。没有工具的Agent只是一个能说会道的“理论家”而装备了工具的Agent则是一个能动手解决问题的“实干家”。本文将深入LangChain框架从Tools的本质出发手把手带你学会如何定义工具、构建Agent并调用它完成实际任务。1. Tools的本质给LLM的“说明书”在LangChain中Tool的本质是一个封装好的可调用函数它拥有明确定义的输入和输出并被传递给聊天模型。模型会根据对话的上下文自主决定何时调用这个工具以及应该提供哪些输入参数。关键在于LLM本身并不执行代码它是一个文本生成模型。Tools的存在充当了LLM与外部世界之间的“桥梁”LLM通过文本生成一个“调用工具”的指令LangChain框架负责解析这个指令执行对应的函数并将执行结果文本形式返回给LLMLLM再根据结果生成最终的回答。为了让LLM这个“大脑”能够准确地理解和使用工具Tools的定义必须遵循两条黄金法则类型提示是必需的函数的参数类型提示Type Hints至关重要它们定义了工具的输入模式SchemaLLM需要根据这个模式来生成正确的参数。文档字符串是核心函数的文档字符串Docstring会成为工具的描述直接帮助LLM理解这个工具是做什么的以及何时应该使用它。描述越清晰、信息越丰富LLM调用工具的准确率就越高。2. 在LangChain中定义Tools从装饰器到PydanticLangChain提供了多种方式来定义工具以适应从简单到复杂的各种需求。2.1 最简单的方式tool装饰器对于大多数场景使用tool装饰器是定义工具最快捷、最优雅的方式。它会自动将函数的名称和文档字符串映射为工具的名称和描述。tooldefget_weather(city:str,date:str)-str: 根据城市以及日期查询该城市的当天的天气情况 returnf该{city}在{date}的天气情况是晴朗注意工具名称建议使用snake_case格式如web_search以兼容不同的模型提供商。一些模型对于包含空格或特殊字符的名称可能会报错。2.2 第三方搜索工具searchTavilySearch(max_result5)2.3 高级模式使用Pydantic定义复杂输入当你的工具需要接收复杂或结构化的输入时比如多个字段或者有校验规则可以借助Pydantic来定义输入模型这能让LLM更准确地理解和生成参数。# Pydantic定义复杂参数classGetWeatherArgs(BaseModel):天气查询参数city:strField(description城市名称如北京、上海)date:strField(description查询日期格式为YYYY-MM-DD)# 内部工具tool(args_schemaGetWeatherArgs)defget_weather(city:str,date:str)-str:获取指定城市在指定日期的天气预报returnf{city}在{date}天气多云有下雨的可能性。通过这种方式你为LLM提供的不仅仅是函数名而是一份完整的、结构化的“API说明书”。3. 构建Agent:让大脑学会用工具定义好工具后下一步就是将它们交给Agent。这就像给一个“大脑”配备了一个“工具箱”。# 需要预先配置好LLM (例如OpenAI, ChatAnthropic等)load_dotenv()# 大模型llmChatOpenAI(modelqwen3.7-max,api_keyos.getenv(QWEN_API_KEY),base_urlos.getenv(QWEN_BASE_URL))# 外部工具searchTavilySearch(max_result5)# 建立好工具之后就可以创建智能体了agentcreate_agent(modelllm,tools[get_weather,search],system_prompt你是一个天气查询助手只能根据城市以及日期查询该城市当天的天气情况。)一个agent的流程定义工具构建agent初始化LLM大模型 modelsllm使用自定义的工具和第三方工具tavily searchtool[]系统提示词 system_promot调用agent:invoke | stream4. 调用Agent:发起任务观察“自主决策”构建完成后调用Agent就和调用一个普通的函数一样简单。你所需要做的就是提出你的目标。respagent.invoke({messages:[(human,2026-7-8的北京的天气)]})print(resp[messages][-1].content)当你运行这段代码时Agent会展示出它强大的自主决策能力思考 (Thought)Agent的“大脑”会首先分析你的问题意识到需要工具get_weather行动 (Action)它会先调用get_weather工具并传入北京和日期两个参数观察 (Observation)它接收get_weather返回的结果通过verboseTrue参数你可以清晰地看到Agent的整个“心路历程”这就是智能代理最迷人的地方——它不再是一个死板的程序而是一个会思考、会规划的自主实体。5. 完整代码importosfromdotenvimportload_dotenvfromlangchain.toolsimporttoolfrompydanticimportBaseModel,Fieldfromlangchain_openaiimportChatOpenAIfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlanggraph.prebuiltimportcreate_react_agent load_dotenv()# 1. 初始化大模型llmChatOpenAI(modelqwen3.7-max,api_keyos.getenv(QWEN_API_KEY),base_urlos.getenv(QWEN_BASE_URL))# 2. 定义工具tooldefget_weather(city:str,date:str)-str:查询指定城市在指定日期的天气情况。returnf{city}在{date}的天气情况是晴朗# 3. 第三方工具searchTavilySearchResults(max_results5)# 4. 构建Agentagentcreate_react_agent(modelllm,tools[get_weather,search],prompt你是一个天气查询助手根据城市和日期查询该城市当天的天气情况。)# 5. 调用Agentrespagent.invoke({messages:[(human,2026-7-8的北京的天气)]})print(resp[messages][-1].content)