LangChain Agent 从入门到精通:从核心原理到生产级落地
大家好我是深耕大模型应用开发的技术博主。如果说大模型是智能体的 “大脑”那Tool工具就是智能体的 “双手”—— 它解决了大模型知识滞后、不会精确计算、无法操作外部系统的核心痛点是 Agent 能力落地的关键基石。很多同学对 Tool 的理解停留在 “写个函数加个装饰器”但实际生产中工具的定义规范、调用机制、错误处理、安全管控才是决定 Agent 稳定性的核心。本文从底层原理、定义方式、调用机制、高级用法、踩坑优化五个维度系统拆解 LangChain 中的 Tool 技术体系所有代码适配 LangChain 0.2 新版本。一、Tool 核心概念大模型的外部能力接口1.1 什么是 Tool本质上Tool 就是大模型可调用的外部能力函数。大模型通过自然语言理解用户需求后自主判断是否需要调用工具、调用哪个工具、传入什么参数拿到工具执行结果后再整合生成最终答案。工具的核心价值弥补大模型的固有缺陷实时信息获取、精确数学计算、结构化数据操作扩展大模型的能力边界操作数据库、调用 API、执行代码、控制硬件实现业务闭环从 “问答” 升级为 “执行任务”1.2 LangChain 中 Tool 的核心抽象层级LangChain 对工具做了多层抽象从底层到上层依次是表格抽象类定位适用场景BaseTool所有工具的基类定义了_run、_arun核心方法需要完全自定义逻辑、维护内部状态的复杂工具StructuredTool支持结构化多参数输入的工具基类多参数、有严格入参校验的业务工具Tool/tool装饰器最简工具封装默认单字符串入参简单功能、快速原型开发新手最容易踩的坑默认tool装饰器只接收一个字符串参数多参数场景必须用结构化工具定义否则会出现参数传递错乱。1.3 工具调用的两种底层模式LangChain 的工具调用本质分两大流派直接决定了 Agent 的稳定性ReAct 提示词模式通过提示词引导大模型用固定格式输出工具名和参数靠正则解析提取。优点是兼容所有大模型缺点是格式容易出错、稳定性差。原生 Function Calling 模式依赖大模型本身的函数调用能力如 GPT 系列、文心一言、通义千问等模型原生输出结构化的工具调用指令。优点是准确率高、格式稳定是当前生产环境的主流方案。LangChain 0.1 之后主推的create_tool_calling_agent就是基于原生函数调用实现的。二、三种工具定义方式从简单到复杂2.1 最简方式tool 装饰器最常用这是最便捷的工具定义方式适合单参数、逻辑简单的工具。只需要给函数加上tool装饰器函数名会成为工具名函数文档字符串会成为工具描述。from langchain_core.tools import tool # 定义一个简单的计算器工具 tool def simple_calculate(expression: str) - str: 执行基础算术表达式计算仅支持加减乘除和括号运算。 输入必须是合法的Python算术表达式字符串例如 123 456 * 2 try: result eval(expression) return f计算结果{result} except Exception as e: return f计算失败{str(e)} # 查看工具信息 print(f工具名{simple_calculate.name}) print(f工具描述{simple_calculate.description}) print(f入参Schema{simple_calculate.args})常用参数说明name手动指定工具名默认取函数名description手动指定工具描述优先级高于函数文档return_direct设为 True 时工具执行结果直接返回给用户不再经过大模型二次处理适合结果确定的场景2.2 结构化输入Pydantic StructuredTool当工具需要多个参数、且有严格的类型校验时必须用 Pydantic 定义入参模型配合StructuredTool使用。这是生产环境的标准写法。from langchain_core.tools import StructuredTool from langchain_core.pydantic_v1 import BaseModel, Field # 1. 定义入参Schema带字段说明 class WeatherQueryInput(BaseModel): city: str Field(description要查询的城市名称必须是中文城市名例如北京、上海) date: str Field(description查询日期格式为YYYY-MM-DD例如2024-05-20, default今天) # 2. 实现工具核心逻辑 def get_weather(city: str, date: str) - str: 查询指定城市指定日期的天气信息 # 这里模拟调用天气API return f{date} {city}的天气晴温度22~28℃风力3级空气质量优 # 3. 创建结构化工具 weather_tool StructuredTool.from_function( funcget_weather, namequery_weather, description查询国内城市的天气信息支持指定日期, args_schemaWeatherQueryInput )这种方式的优势大模型能清晰识别每个参数的含义和格式要求调用准确率大幅提升自带参数类型校验非法参数会直接拦截避免工具执行报错支持默认值、枚举值、参数约束适配复杂业务场景2.3 完全自定义继承 BaseTool当工具需要维护内部状态、初始化配置、实现异步逻辑时直接继承BaseTool是最灵活的方式。from langchain_core.tools import BaseTool from typing import Optional, Type from langchain_core.pydantic_v1 import BaseModel class DatabaseQueryTool(BaseTool): # 工具基础信息 name database_query description 执行业务数据库的只读SQL查询仅支持SELECT语句返回查询结果 args_schema: Type[BaseModel] WeatherQueryInput # 自定义入参Schema # 自定义属性数据库连接 db_config: dict {} def __init__(self, db_config: dict): super().__init__() self.db_config db_config # 初始化数据库连接... def _run(self, sql: str) - str: 同步执行逻辑必须实现 # 执行SQL查询返回结果 return fSQL执行结果xxx async def _arun(self, sql: str) - str: 异步执行逻辑可选实现 # 异步执行SQL return f异步执行结果xxx三、工具调用核心机制让大模型精准调用3.1 工具描述的黄金法则工具调用准确率 90% 取决于描述写得好不好。写工具描述请遵循三个原则明确适用场景说清楚 “什么时候该用这个工具”比如 “当用户问天气相关问题时使用”明确输入要求说明参数格式、约束条件比如 “城市名必须是中文SQL 必须是 SELECT 语句”明确输出内容说明工具返回什么结果避免大模型对返回值产生误解反面教材计算工具—— 大模型完全不知道什么时候用、怎么传参 正面教材执行精确的数学算术计算当用户需要计算数值、公式运算时使用。输入为合法的算术表达式字符串不支持文字描述的计算需求3.2 bind_tools给大模型绑定工具LangChain 提供了bind_tools方法一键把工具列表转换成大模型支持的函数调用格式自动处理不同厂商的格式差异。from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 给大模型绑定工具 llm_with_tools llm.bind_tools([simple_calculate, weather_tool]) # 调用大模型它会自主判断是否调用工具 response llm_with_tools.invoke(北京明天天气怎么样) print(response.tool_calls) # 查看大模型生成的工具调用指令输出的tool_calls包含工具名、参数、调用 ID是结构化的标准格式不会出现格式错乱。3.3 工具调用的完整执行流程一次完整的 Agent 工具调用分为 5 步推理大模型接收用户问题结合工具列表判断是否需要调用工具解析提取工具名称、调用参数生成工具调用指令执行调用对应工具函数传入参数获取执行结果回填把工具执行结果回填到对话上下文中生成大模型结合工具结果生成最终回答这个流程在AgentExecutor中被自动循环执行直到大模型认为任务完成。四、常用内置与第三方工具盘点LangChain 生态内置了大量现成工具不用重复造轮子重点介绍几个高频使用的4.1 代码执行工具from langchain_community.tools.python.tool import PythonREPLTool # Python代码执行工具可以执行任意Python代码 python_tool PythonREPLTool() # 注意生产环境慎用存在代码注入风险必须加沙箱和权限控制4.2 搜索引擎工具最常用的实时信息获取工具推荐 Tavily专为大模型优化的搜索 APIfrom langchain_community.tools.tavily_search import TavilySearchResults # 需先安装pip install tavily-python配置TAVILY_API_KEY search_tool TavilySearchResults(max_results3)4.3 文件系统工具from langchain_community.tools.file_management import ReadFileTool, WriteFileTool # 文件读写工具可指定工作目录 read_tool ReadFileTool() write_tool WriteFileTool()五、高级进阶生产级工具的必备能力5.1 工具错误处理与重试工具执行失败是常态原生 Agent 遇到错误直接中断生产环境必须做异常兜底。from langchain_core.tools import tool import functools import time def tool_retry(max_retries3, delay1): 工具重试装饰器 def decorator(func): functools.wraps(func) def wrapper(*args, **kwargs): for i in range(max_retries): try: return func(*args, **kwargs) except Exception as e: if i max_retries - 1: return f工具执行失败错误信息{str(e)} time.sleep(delay) return wrapper return decorator tool tool_retry(max_retries3) def stable_api_call(param: str) - str: 带重试机制的外部API调用工具 # 调用外部API return 调用成功5.2 return_direct 直接返回结果对于结果确定、不需要大模型二次加工的工具开启return_direct可以减少一次大模型调用降低延迟和成本。tool(return_directTrue) def get_system_status(query: str) - str: 查询系统运行状态结果直接返回给用户 return 系统当前运行正常CPU使用率30%内存使用率45%5.3 带状态的工具工具可以维护内部状态比如会话级别的用户信息、连接池等通过自定义类工具实现。 典型场景数据库连接池、用户身份校验、会话级缓存。5.4 工具权限管控生产环境必须对工具做权限分级不是所有用户都能调用所有工具。可以在工具执行前加入权限校验逻辑根据用户角色判断是否允许调用。六、完整实战搭建多工具智能 Agent下面给出一个可直接运行的完整示例整合自定义工具 Agent 执行器from langchain_core.tools import tool from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain.agents import create_tool_calling_agent, AgentExecutor # 1. 定义工具 tool def calculate(expression: str) - str: 执行精确的数学计算输入为合法的算术表达式字符串 try: return str(eval(expression)) except: return 计算表达式错误 tool def get_current_time(format: str) - str: 获取当前系统时间 参数format: 时间格式可选值为 12小时制 或 24小时制 from datetime import datetime if format 12小时制: return datetime.now().strftime(%Y-%m-%d %I:%M:%S %p) return datetime.now().strftime(%Y-%m-%d %H:%M:%S) tools [calculate, get_current_time] # 2. 初始化大模型 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 3. 定义Agent提示词 prompt ChatPromptTemplate.from_messages([ (system, 你是一个可靠的智能助手遇到计算和时间相关问题请调用工具不要自己编造结果。), (human, {input}), (agent_scratchpad, {agent_scratchpad}) ]) # 4. 创建Agent并执行 agent create_tool_calling_agent(llm, tools, prompt) agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 打印执行过程调试用 max_iterations5, # 最大迭代次数防止死循环 handle_parsing_errorsTrue # 自动处理解析错误 ) # 5. 运行测试 result agent_executor.invoke({input: 现在的时间用24小时制是多少再帮我算一下1234 * 5678等于多少}) print(最终答案, result[output])七、高频踩坑与优化指南7.1 工具调用准确率低多半是描述写废了工具名要见名知意不要用缩写和模糊命名描述里必须写清楚 “适用场景 输入要求 返回内容” 三要素相似功能的工具不要定义太多会让大模型混淆优先合并成一个多参数工具7.2 参数传递错误结构化输入是解药超过 1 个参数的工具必须用 Pydantic 定义入参 Schema每个字段都要加Field描述说明参数含义和格式复杂参数如日期、JSON要明确指定格式示例7.3 工具执行超时加超时控制外部 API、代码执行类工具必须加超时限制避免阻塞整个 Agent可以用timeout-decorator库给工具函数加超时装饰器7.4 安全红线避免任意代码执行PythonREPLTool这类代码执行工具生产环境绝对不能直接暴露给用户所有用户输入的参数都要做校验和过滤防止注入攻击敏感操作类工具必须加二次确认机制7.5 性能优化减少无效工具调用给 Agent 增加任务分类前置判断简单问题直接回答不进入工具调用流程结果确定的工具开启return_direct节省 Token 和延迟批量任务优先合并成一次工具调用减少大模型交互次数写在最后Tool 是大模型从 “对话” 走向 “执行” 的核心载体看似简单的函数封装背后涉及语义理解、参数解析、错误处理、安全管控等一系列工程问题。原型开发可以靠tool快速起步但生产落地一定要做好结构化定义、异常兜底和权限管控。

相关新闻

Loop Engineering:从Prompt工程到AI应用开发的循环交互方法论

Loop Engineering:从Prompt工程到AI应用开发的循环交互方法论

1. 先搞清楚 Loop Engineering 到底解决了什么问题如果你最近在接触 AI 应用开发,可能已经发现:单纯靠写 Prompt 让模型干活,越来越像在碰运气。任务简单时还行,一旦涉及多步骤推理、长文本处理、复杂逻辑或需要反复调试的场景&am…

2026/10/10 1:47:23 阅读更多 →
从PWM呼吸灯到嵌入式开发:STM32定时器配置与电机控制应用

从PWM呼吸灯到嵌入式开发:STM32定时器配置与电机控制应用

1. 项目概述:从闪烁到呼吸,PWM的魅力如果你玩过单片机,点亮LED通常是第一个实验。但让LED从“亮”与“灭”的简单切换,变成像生命一样“呼吸”的明暗渐变,这背后离不开一个核心的技术——PWM,也就是脉冲宽度…

2026/9/25 15:05:30 阅读更多 →
英雄联盟智能战绩查询工具:基于LCU API的数据驱动决策助手

英雄联盟智能战绩查询工具:基于LCU API的数据驱动决策助手

英雄联盟智能战绩查询工具:基于LCU API的数据驱动决策助手 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 您是否在英雄联盟排位赛中为BP阶段的决策感到焦虑?面对有限的准备时间&#…

2026/10/2 4:52:23 阅读更多 →

最新新闻

2024数学建模国赛C题代码与数据:快速求解种植策略

2024数学建模国赛C题代码与数据:快速求解种植策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 3:30:18 阅读更多 →
低功耗MCU与可编程PMIC的组合设计:从硬件到寄存器的电源管理实战

低功耗MCU与可编程PMIC的组合设计:从硬件到寄存器的电源管理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 3:30:18 阅读更多 →
智慧病房APP原型模板:从护士站到床旁终端的交互设计思路

智慧病房APP原型模板:从护士站到床旁终端的交互设计思路

1. 内容整体设计与思路拆解1.1 医疗场景下“画原型”这件事的特殊性智慧病房APP原型模板,说白了就是把病房里护士、患者、医生三方的日常动作,数字化之后沉淀成一套可以直接复用、改改就能用的界面方案。为什么这事儿值得单独做一套模板?因为…

2026/10/10 3:30:18 阅读更多 →
StarGantt 星甘 v3.1.0 工作日/自然日双模式:让甘特图排期不再失真

StarGantt 星甘 v3.1.0 工作日/自然日双模式:让甘特图排期不再失真

1. 为什么 StarGantt 星甘这次更新值得关注做项目管理这些年,工具换了一茬又一茬。从最早的表格排期,到后来的在线协作软件,再到各种专业项目管理平台,我发现自己最离不开的仍然是甘特图,那个横条视图一摆出来&#xf…

2026/10/10 3:30:18 阅读更多 →
Unity New Input System 改键全攻略:从绑定覆盖到存档恢复

Unity New Input System 改键全攻略:从绑定覆盖到存档恢复

1. 改键方案的选型与设计思路1.1 为什么不能直接在Inspector里改Asset不少刚接触Unity NewInputSystem的开发者,第一反应是打开Input Actions编辑器,把W改成别的键位,然后发现运行时完全没变化,或者改了之后所有玩家共用一套键位&…

2026/10/10 3:30:18 阅读更多 →
Fortify SCA 插件实战:从环境搭建到 CI 集成的静态代码扫描避坑指南

Fortify SCA 插件实战:从环境搭建到 CI 集成的静态代码扫描避坑指南

简介:Fortify SCA工具插件是一套面向开发人员与安全团队的白盒安全测试解决方案,可在编码阶段对源代码及依赖项进行静态分析,提前发现SQL注入、跨站脚本、不安全数据存储等常见漏洞。资源包共36个文件,约12.59MB,以30个…

2026/10/10 3:29:18 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →