# LangChain 中的工具与工具包
# 01. LangChain 内置工具
前文提到, 函数调用 是可靠地从大语言模型中获取结构化数据的一个功能,要想使用 函数调用 就必须定义好特定的函数或工具,并将工具的相关信息传递给大语言模型,在 LangChain 中封装了大量的 预设工具 ,开箱即用,涵盖了: 搜索、图像生成、百科、视频信息提取、代码执行、数据分析 等。
- LangChain 内置工具列表: https://imooc-langchain.shortvar.com/docs/integrations/tools/
并且在 LangChain 中,所有工具都是 BaseTool 的子类,并且工具也是 Runnable可运行组件 ,支持通过 invoke 、 batch 和 stream 等方法进行调用,使用起来也非常简单,实例化工具后直接调用 invoke 函数即可,除此之外,可以通过 name 、 description 、 args 、 return_direct 属性来获取到工具的相关信息。
例如以 DuckDuckGo搜索 为例,首先安装特定的依赖库:
pip install -U duckduckgo-search
示例代码如下:
from langchain_community.tools import DuckDuckGoSearchRun
search = DuckDuckGoSearchRun()
print("工具名字: ", search.name)
print("工具描述: ", search.description)
print("工具参数:", search.args)
print("是否直接返回: ", search.return_direct)
print(search.run("LangChain目前最新版本是什么?"))
2
3
4
5
6
7
8
9
输出内容:
工具名字: duckduckgo_search
工具描述: A wrapper around DuckDuckGo Search. Useful for when you need to answer questions about current events. Input should be a search query.
工具参数: {'query': {'title': 'Query', 'description': 'search query to look up', 'type': 'string'}}
是否直接返回: False
LangChain 基准是一个 python 包和相关数据集,用于促进不同认知架构的实验和基准测试。. 每个基准任务都针对常见 LLM 应用程序中的关键功能,例如基于检索的问答、提取、代理工具使用等。. 对于我们的第一个基准,我们发布了一个关于 LangChain python 文档的问答 ... 它建立在 LCEL 的基础之上,添加了两个重要的组件:轻松定义循环的能力(这对代理很重要,但对链来说不需要)和内置内存。. 在 langchain v0.2 中,我们保留了旧的 AgentExecutor——但 LangGraph 正在成为构建代理的推荐方式。. 我们添加了一个预构建的 LangGraph 对象 ... 奋战一年,LangChain首个稳定版本终于发布,LangGraph把智能体构建为图. 著名的大模型智能体工具,现在有大版本更新了。. 不知不觉,LangChain 已经问世一年了。. 作为一个开源框架,LangChain 提供了构建基于大模型的 AI 应用所需的模块和工具,大大降低了 AI 应用 ... LangChain 承诺「让开发人员一个下午就能从一个想法变成可运行的代码」,但随着我们的需求变得越来越复杂,问题也开始浮出水面。. LangChain 变成了阻力的根源,而不是生产力的根源。. 随着 LangChain 的不灵活性开始显现,我们开始深入研究 LangChain 的内部结构 ... LangChain 随时间推移的变化. 我们文档中新增的"LangChain 随时间推移的变化"部分可帮助您及时了解变化。其中提供了有关 LangChain 如何变化、如何升级以及如何将旧版本中的先前概念映射到新版本中的指南。这是社区强烈要求的功能,我们也认为它非常必要!
2
3
4
5
6
如果需要将工具转换成 openai 工具形式参数,可以使用 convert_to_openai_tool() 辅助函数,示例如下:
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_core.utils.function_calling import convert_to_openai_tool
search = DuckDuckGoSearchRun()
print(convert_to_openai_tool(search))
2
3
4
5
输出内容:
{'type': 'function', 'function': {'name': 'duckduckgo_search', 'description': 'A wrapper around DuckDuckGo Search. Useful for when you need to answer questions about current events. Input should be a search query.', 'parameters': {'type': 'object', 'properties': {'query': {'description': 'search query to look up', 'type': 'string'}}, 'required': ['query']}}}
# 02. LangChain 内置工具包
在 LangChain 中, 工具包是一组设计用于一起执行特定任务的工具集 ,它们具有便捷加载的方法—— get_tools() ,并且所有工具包都公开了一个 get_tools() 方法,该方法返回一个工具列表,这样就无需一个一个加载特定的工具了。
- LangChain 内置工具包列表: https://imooc-langchain.shortvar.com/docs/integrations/toolkits/
工具包 一般是同一个服务提供商提供的一系列工具,例如在 LangChain 中封装了 Azure AI 的对应工具包,该工具包提供了 5 个工具:
AzureAiServicesImageAnalysisTool :用于从图像中提取标题、对象、标签和文本。
AzureAiServicesDocumentIntelligenceTool :用于从文档中提取文本、表格和键值对。
AzureAiServicesSpeechToTextTool :用于将语音转录为文本。
AzureAiServicesTextToSpeechTool :用于将文本合成语音。
AzureAiServicesTextAnalyticsForHealthTool :用于提取医疗实体。
使用起来也非常简单,首先安装特定的依赖包:
pip install -U azure-ai-formrecognizer azure-cognitiveservices-speech azure-ai-textanalytics azure-ai-vision-imageanalysis
然后配置 Azure 的相关环境变量:
import os
os.environ["OPENAI_API_KEY"] = "sk-"
os.environ["AZURE_AI_SERVICES_KEY"] = ""
os.environ["AZURE_AI_SERVICES_ENDPOINT"] = ""
os.environ["AZURE_AI_SERVICES_REGION"] = ""
2
3
4
5
接下来就可以创建工具包,示例如下:
from langchain_community.agent_toolkits import AzureAiServicesToolkit
toolkit = AzureAiServicesToolkit()
print([tool.name for tool in toolkit.get_tools()])
2
3
4
输出内容如下:
['azure_ai_services_document_intelligence',
'azure_ai_services_image_analysis',
'azure_ai_services_speech_to_text',
'azure_ai_services_text_to_speech',
'azure_ai_services_text_analytics_for_health']
2
3
4
5
不过由于 工具包 包含了多组工具,一般很少单独拆分出来使用,通常用在 Agent 或者 函数调用 中,这样无需一次性实例化多个工具,在实际开发中,往往更多的是手动实例化工具进行组装。
# 最新版 LangChain 用法提示
新版 LangChain 更推荐用 LCEL、
Runnable、ChatModel.bind_tools()、结构化输出和 LangGraph 来组织复杂链路;老式Chain、部分AgentExecutor写法可以读懂,但新项目应优先选择更清晰的图或 Runnable 编排。工具调用相关代码要区分两层:模型是否原生支持 tool/function calling,以及业务侧如何定义工具 schema、参数校验、错误兜底和观测日志。
如果示例中的导入路径和你当前安装版本不同,优先查当前版本包内导出位置;常见迁移方向是从
langchain拆到langchain-core、langchain-community、langchain-openai、langgraph等包。
# 拓展
工具或插件不要只看能不能调通,更要看是否可观测、可限流、可重试、可审计。联网类工具还要处理超时、空结果、搜索噪声和结果时效性。
Agent 场景里,Prompt 只是调度策略的一部分;工具描述、参数 schema、历史状态、错误反馈、停止条件和人工介入点同样会影响最终稳定性。
# 常见问题
为什么模型没有调用工具?常见原因是工具描述不清晰、参数 schema 过宽或过窄、用户问题不需要工具、模型本身不支持工具调用,或者工具绑定位置不对。
为什么工具调用后回答仍然不准?先看工具返回是否正确,再看工具结果是否被放回模型上下文,最后检查输出解析、历史消息和异常兜底是否覆盖了真实错误。
# 面试题
解释函数调用、工具调用和 Agent 的区别。
LangChain 中 tool schema 的作用是什么?为什么参数校验对生产环境很重要?
ReACT Agent 和 tool-calling Agent 的核心差异是什么?分别适合什么场景?
LangGraph 相比 LCEL 更适合解决哪些复杂编排问题?
# 生产问题排查
| 问题 | 常见原因 | 处理方式 |
|---|---|---|
| 工具没有被调用 | 工具描述弱、绑定失败、模型不支持 | 打印绑定后的模型配置,补充工具描述,换用支持工具调用的模型 |
| 参数格式错误 | schema 设计不清晰,模型生成字段不稳定 | 使用 Pydantic/JSON Schema 校验,失败后把错误反馈给模型重试 |
| 联网结果不可用 | 搜索为空、接口超时、命中低质量页面 | 增加超时、重试、结果过滤、来源白名单和降级回答 |
| Agent 循环不停止 | 缺少终止条件或工具返回被误判 | 设置最大迭代次数,记录每轮 thought/action/observation,增加停止规则 |
| 线上难以复现 | 缺少输入、工具请求和模型响应日志 | 给每次调用加 trace id,记录工具入参、出参、耗时和异常 |