LangChain 预定义工具与 Toolkits 详解从单独使用到混合编排一、引言在上一篇博客中我们深入探讨了 LangChain 中自定义工具Custom Tools的实现方式包括如何使用tool装饰器和BaseTool类来封装业务逻辑。然而LangChain 的强大之处不仅在于支持自定义扩展更在于它提供了一套开箱即用的预定义工具Prebuilt Tools和工具集Toolkits能够让我们快速构建具备搜索、计算、数据库操作等能力的智能 Agent。本文将围绕以下几个核心问题展开LangChain 提供了哪些常用的预定义工具如何单独使用预定义工具如何将预定义工具与自定义工具混合使用Toolkit 是什么它如何简化复杂场景的工具管理二、预定义工具 vs 自定义工具在 LangChain 的 Agent 架构中工具是 Agent 执行外部操作的手脚。从来源上看工具可以分为两大类维度预定义工具自定义工具开发成本低开箱即用高需要自行实现逻辑灵活性受限于官方实现完全可控可对接内部系统适用场景通用任务搜索、计算、数据库等特定业务内部 API、私有数据等使用方式load_tools()或直接实例化tool装饰器或继承BaseTool最佳实践先用预定义工具满足通用需求再通过自定义工具补充业务特定能力两者相辅相成。三、预定义工具的分类与典型代表LangChain 的预定义工具覆盖了大量常见场景以下是主要分类3.1 搜索类工具工具名功能说明DuckDuckGoSearchRun通过 DuckDuckGo 进行网页搜索SerpAPI通过 SerpAPI 调用 Google 搜索WikipediaQueryRun查询维基百科词条ArxivQueryRun检索 arXiv 学术论文3.2 数据操作与计算类工具名功能说明PythonREPL/PythonAstREPLTool执行 Python 代码后者使用 AST 更安全MathTool执行数学计算JsonListKeysTool从 JSON 中提取键名3.3 文件与系统类工具名功能说明ReadFileTool读取文件内容WriteFileTool写入文件内容ListDirectoryTool列出目录文件3.4 数据库类工具名功能说明QuerySQLDataBaseTool执行 SQL 查询SQLDatabaseToolkit一整套数据库操作工具集3.5 API 集成类工具名功能说明OpenWeatherMapQueryRun查询天气数据RequestsWrapper发送 HTTP 请求3.6 向量存储类工具名功能说明VectorStoreQATool基于向量存储的问答VectorStoreQAWithSourcesTool带来源信息的向量问答四、预定义工具的使用方式4.1 方式一通过load_tools快速加载传统方式这是最简单的方式适合快速上手和单独使用预定义工具fromlangchain_community.agent_toolkits.load_toolsimportload_tools# 加载单个或多个工具toolsload_tools([arxiv,llm-math],llmllm)# 查看所有可用工具名fromlangchain_community.agent_toolkits.load_toolsimportget_all_tool_namesprint(get_all_tool_names())4.2 方式二直接导入具体工具类推荐混用时必需更灵活可以精细配置参数也是混用自定义工具时的必要方式fromlangchain_community.toolsimportWikipediaQueryRunfromlangchain_community.utilitiesimportWikipediaAPIWrapper# 初始化维基百科工具指定中文、返回1条结果wiki_toolWikipediaQueryRun(api_wrapperWikipediaAPIWrapper(langzh,top_k_results1))# 直接调用resultwiki_tool.invoke(马斯克)print(result[:200])五、核心差异load_toolsvs 直接实例化很多开发者困惑为什么单独使用时可以用load_tools混用时却要实例化对象对比项load_tools直接实例化返回值工具列表黑盒单个工具对象配置灵活性低只能传字符串名高可自定义构造参数混用支持不方便与自定义工具组合可与自定义工具统一放入列表本质封装了 import new 的过程手动 import 类并实例化核心原理load_tools本质上也是根据字符串名字去 import 对应的类然后实例化。混用时跳过这个中介直接拿到对象就能和自定义工具平起平坐了。一句话总结单独用预定义工具 -load_tools一键加载混用自定义预定义 - 预定义工具也要实例化对象统一组装列表六、重点详解Arxiv 工具与科研助理Arxiv 是一个免费的学术论文预印本平台。ArxivQueryRun让 Agent 能够按关键词搜索论文、获取标题摘要等信息是构建科研助理的核心工具。6.1 单独使用 Arxivimportosfromlangchain.chat_modelsimportChatOpenAIfromlangchain.agentsimportload_tools,initialize_agent,AgentType os.environ[OPENAI_API_KEY]Your KeyllmChatOpenAI(temperature0.0)# 单独加载toolsload_tools([arxiv])agent_chaininitialize_agent(tools,llm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,verboseTrue,)agent_chain.run(介绍一下2005.14165这篇论文的创新点)6.2 混用 Arxiv 自定义工具fromlangchain_community.toolsimportArxivQueryRunfromlangchain.toolsimporttoolfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain.chat_modelsimportChatOpenAI llmChatOpenAI(temperature0.0)# 预定义工具实例化对象arxivArxivQueryRun()# 自定义工具论文摘要翻译tooldeftranslate_abstract(text:str,target_lang:strzh)-str:将论文摘要翻译成目标语言。输入英文摘要文本# 实际项目中调用翻译 APIreturnf[翻译结果]{text[:100]}...# 混用统一放入列表all_tools[arxiv,translate_abstract]agentinitialize_agent(all_tools,llm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,verboseTrue,)agent.run(搜索最近关于 LLM Agent 的论文并把摘要翻译成中文)七、Toolkit工具的组合包7.1 什么是 ToolkitToolkit 是 LangChain 中针对特定领域预打包的一组工具集合。与单个工具相比Toolkit 提供了更完整的解决方案。7.2 最经典的 ToolkitSQLDatabaseToolkit当 Agent 需要操作数据库时单个 SQL 执行工具远远不够。Agent 需要查看有哪些表sql_db_list_tables查看表结构sql_db_schema检查 SQL 语法sql_db_query_checker执行 SQL 查询sql_db_querySQLDatabaseToolkit正好打包了这全套能力fromlangchain_community.agent_toolkits.sql.toolkitimportSQLDatabaseToolkitfromlangchain_community.utilities.sql_databaseimportSQLDatabasefromlangchain_openaiimportChatOpenAIfromlanggraph.prebuiltimportcreate_react_agentfromlangchainimporthub# 连接数据库dbSQLDatabase.from_uri(sqlite:///Chinook.db)llmChatOpenAI(temperature0)# 初始化 ToolkittoolkitSQLDatabaseToolkit(dbdb,llmllm)# 获取工具列表包含4个SQL工具toolstoolkit.get_tools()# 创建 Agentprompt_templatehub.pull(langchain-ai/sql-agent-system-prompt)system_messageprompt_template.format(dialectSQLite,top_k5)agent_executorcreate_react_agent(llm,tools,state_modifiersystem_message)# 查询eventsagent_executor.stream({messages:[(user,Which countrys customers spent the most?)]},stream_modevalues,)foreventinevents:event[messages][-1].pretty_print()7.3 SQLDatabaseToolkit 工具清单工具作用sql_db_list_tables列出数据库中所有表sql_db_schema查看指定表的结构字段、类型、关系sql_db_query_checker检查 SQL 语句的语法正确性sql_db_query执行 SQL 查询并返回结果这种组合拳让 Agent 能够自主探索数据库结构、生成并验证 SQL最终完成复杂的数据查询任务。八、完整实战预定义工具与自定义工具混用假设我们要构建一个电商智能助手它需要用ArxivQueryRun查最新的 AI 技术论文用SQLDatabaseToolkit查订单数据库用自定义工具调用公司内部的价格计算 APIimportosfromlangchain.chat_modelsimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain.toolsimporttool,BaseToolfromlangchain_community.toolsimportArxivQueryRunfromlangchain_community.agent_toolkits.sql.toolkitimportSQLDatabaseToolkitfromlangchain_community.utilities.sql_databaseimportSQLDatabasefrompydanticimportBaseModel,Field# 1. 初始化 LLM os.environ[OPENAI_API_KEY]your-api-keyllmChatOpenAI(temperature0,modelgpt-4)# 2. 预定义工具Arxiv 论文搜索 arxiv_toolArxivQueryRun()# 3. 预定义工具SQL 数据库工具集 dbSQLDatabase.from_uri(sqlite:///orders.db)sql_toolkitSQLDatabaseToolkit(dbdb,llmllm)sql_toolssql_toolkit.get_tools()# 4. 自定义工具公司内部价格计算 API classPriceInput(BaseModel):product_id:strField(description商品ID)quantity:intField(description购买数量)coupon_code:strField(description优惠券代码没有则填空字符串)classPriceCalculatorTool(BaseTool):nameprice_calculatordescription计算商品最终价格支持优惠券折扣。输入格式product_id, quantity, coupon_codeargs_schemaPriceInputdef_run(self,product_id:str,quantity:int,coupon_code:str):base_price100discount0.8ifcoupon_codeSAVE20else1.0final_pricebase_price*quantity*discountreturnf商品{product_id}购买{quantity}件使用优惠券{coupon_code}最终价格{final_price}元asyncdef_arun(self,**kwargs):raiseNotImplementedError(不支持异步)price_toolPriceCalculatorTool()# 5. 自定义工具查询物流状态 tooldeflogistics_tracker(order_id:str)-str:查询订单物流状态。输入订单号returnf订单{order_id}当前状态已发货预计明天送达# 6. 混合所有工具核心all_tools[arxiv_tool,# 预定义Arxiv*sql_tools,# 预定义SQL Toolkit展开4个工具price_tool,# 自定义价格计算logistics_tracker,# 自定义物流查询]print(f共加载{len(all_tools)}个工具)fortinall_tools:print(f -{t.name}:{t.description[:50]}...)# 7. 创建 Agent agentinitialize_agent(all_tools,llm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,verboseTrue,handle_parsing_errorsTrue,)# 8. 测试不同场景 # 场景1查论文触发 Arxivagent.run(最近有没有关于大语言模型微调的论文)# 场景2查数据库触发 SQL Toolkitagent.run(上个月销售额最高的商品是什么请查一下数据库)# 场景3算价格触发自定义 price_calculatoragent.run(商品ID为PHONE-001买3个用优惠券SAVE20最终多少钱)# 场景4查物流触发自定义 logistics_trackeragent.run(帮我查一下订单 ORD-2024-001 的物流状态)# 场景5复杂问题可能触发多个工具agent.run(帮我查一下订单 ORD-2024-002 买了什么商品然后算一下如果再加2件用SAVE20优惠券要多少钱)九、混用时的关键要点要点说明统一列表自定义和预定义工具放在同一个tools列表里描述要清晰Agent 靠description决定调用哪个工具描述写不好会选错工具输入规范自定义工具建议用args_schemaPydantic定义参数和预定义工具保持一致命名不冲突确保name唯一不要和预定义工具重名权限控制自定义工具可能涉及敏感操作注意权限和异常处理十、使用 LangGraph 的 ReAct Agent 混用如果你使用新版 LangGraph混用方式完全一致fromlanggraph.prebuiltimportcreate_react_agent# 同样的 all_tools 列表agentcreate_react_agent(llm,all_tools)# 流式输出forchunkinagent.stream({messages:[(user,查一下订单表有哪些字段)]}):print(chunk)LangGraph 的create_react_agent会自动处理工具调用混用逻辑和传统 Agent 完全一致。十一、总结LangChain 的预定义工具和 Toolkits 是 Agent 能力的重要基石预定义工具覆盖搜索、计算、文件、数据库、API 等常见场景通过load_tools()或直接实例化即可使用。单独使用预定义工具时可以用load_tools([arxiv])一键加载。混用自定义预定义工具时预定义工具也需要实例化为对象然后统一放入工具列表。Arxiv 工具是科研类 Agent 的典型代表让 LLM 具备文献检索能力。Toolkit是工具的组合拳如SQLDatabaseToolkit提供完整的数据库操作能力让 Agent 能自主探索 schema、生成 SQL、执行查询。核心心法Agent 不区分工具的来源只关心每个工具是否有name、description和invoke()方法。只要满足这个契约预定义工具和自定义工具就能无缝协作。介绍了自定义工具的完整实现方式。后续还将深入探讨工具调用链的调试与优化敬请期待