[智能体-138]:LangChain 智能体自动识别并调用工具:原理、方案、实战、调优
2026/5/29 1:10:20 网站建设 项目流程

一、核心原理

大模型本身不会直接执行代码 / 工具,智能体(Agent)的核心工作流是:工具元数据注入 → 模型决策 → 框架解析指令 → 工具执行 → 结果回传,循环直到任务完成。

完整执行链路

  1. 工具元数据封装每个预定义工具(BaseTool)自带namedescription、入参结构,这是模型识别工具的唯一依据。
  2. 元数据灌入提示词Agent 会自动把「工具列表 + 功能说明 + 调用规则」拼接进 Prompt,告知模型:当前有哪些工具、分别能做什么、怎么传参。
  3. 模型推理决策模型结合用户问题,判断:是否需要工具、调用哪个工具、构造入参。
  4. 结构化输出指令模型输出标准格式的工具调用指令(Function Call / 思维链格式)。
  5. 框架解析执行Agent 框架解析指令,调用对应工具,拿到执行结果。
  6. 结果回送模型把工具返回内容再次发给模型,继续推理 / 回答,循环直至任务结束。

关键前提:description描述必须精准,描述模糊是调用失败、错选工具的首要原因。


二、主流实现方案(LangChain 官方四类 Agent)

按技术实现分为两大流派:Function Calling 型(主流、稳定)传统思维链型(兼容老模型),下面分方案讲解、代码、适用场景。

前置环境与公共准备

bash

运行

pip install langchain langchain-community langchain-openai python-dotenv

项目根目录.env配置模型密钥与地址:

env

OPENAI_API_KEY=sk-xxx OPENAI_BASE_URL=https://api.openai.com OPENAI_MODEL_NAME=gpt-4o

公共初始化代码(下文通用):

python

运行

from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain_community.agent_toolkits import load_tools # 加载环境变量 load_dotenv() # 初始化对话模型(优先支持 Function Calling 的模型) llm = ChatOpenAI(temperature=0) # 批量加载预定义工具:计算器、搜索、Python代码、维基百科 tool_names = ["llm-math", "duckduckgo_search", "python_repl", "wikipedia"] tools = load_tools(tool_names, llm=llm)

方案一:Tool Calling Agent(函数调用智能体,首选推荐

特点

  • 基于模型原生Function Calling能力,业界主流,调用准确率最高、稳定性最强
  • 模型直接输出结构化 JSON 调用指令,框架解析简单
  • 支持 OpenAI、通义、文心、DeepSeek 等绝大多数现代大模型
  • 推荐用于生产、复杂工具调用、多轮任务

完整代码实现

python

运行

from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_core.prompts import ChatPromptTemplate # 1. 构造 Agent 提示词模板 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个全能助手,可以根据用户问题选择合适的工具完成任务。"), ("user", "{input}"), # 固定占位符:存放 Agent 思考与工具调用中间过程 ("placeholder", "{agent_scratchpad}") ]) # 2. 创建 Tool Calling 智能体 agent = create_tool_calling_agent(llm, tools, prompt) # 3. 实例化执行器(核心运行入口) agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, # 开启日志,查看思考+调用全过程 handle_parsing_errors=True # 自动解析错误容错 ) # 4. 测试:自动识别并调用对应工具 if __name__ == "__main__": # 测试1:数学计算 → 自动调用 llm-math print("===== 测试数学计算 =====") agent_executor.invoke({"input": "计算 (36 + 44) * 18 / 2"}) # 测试2:联网搜索 → 自动调用 duckduckgo_search print("\n===== 测试联网搜索 =====") agent_executor.invoke({"input": "介绍一下 LangChain Tool 工具"}) # 测试3:综合任务(搜索+计算)→ 多工具连续调用 print("\n===== 测试多工具联动 =====") agent_executor.invoke({"input": "搜索什么是圆周率,并计算圆周率乘以 100"})

关键参数说明

  • verbose=True打印完整链路(思考、工具选择、入参、返回结果),调试必备
  • handle_parsing_errors=True捕获模型输出格式异常,自动重试,提升稳定性
  • 无需手动编写工具调用规则,框架自动封装工具元数据。

方案二:OpenAI Functions Agent(旧版函数调用)

Tool Calling的前身,仅适配 OpenAI 系列模型,用法接近,新项目优先用方案一。

python

运行

from langchain.agents import AgentExecutor, create_openai_tools_agent prompt = ChatPromptTemplate.from_messages([ ("system", "按需使用工具完成用户请求"), ("user", "{input}"), ("placeholder", "{agent_scratchpad}") ]) agent = create_openai_tools_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) agent_executor.invoke({"input": "计算 123 * 456"})

方案三:ReAct Agent(思维链型,无原生函数调用模型适配)

特点

  • 不依赖模型原生 Function Calling,靠自然语言思维链实现工具选择
  • 模型输出文本格式:思考 → 行动 → 入参,框架通过正则解析
  • 适配所有大模型(包括开源本地模型、老旧模型)
  • 缺点:调用准确率略低,复杂多工具场景容易解析出错

完整代码实现

python

运行

from langchain.agents import AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate # ReAct 专用提示词模板(内置工具描述、思考规则) prompt = PromptTemplate.from_template(""" 你可以使用以下工具: {tools} 工具名称列表:{tool_names} 按照这个格式思考和行动: Question: 用户的问题 Thought: 我应该做什么 Action: 工具名称 Action Input: 工具入参 Observation: 工具返回结果 ...(重复多轮) Thought: 我已经得到答案 Final Answer: 最终回答用户的内容 Question: {input} {agent_scratchpad} """) # 创建 ReAct 智能体 agent = create_react_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # 测试调用 agent_executor.invoke({"input": "用代码生成 1~10 的累加和"})

方案四:Structured Chat Agent(结构化对话智能体)

面向多参数、复杂入参的工具场景,支持结构化入参解析,适合企业级复杂工具。

python

运行

from langchain.agents import AgentExecutor, create_structured_chat_agent from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "使用工具协助回答问题,严格按照指定格式输出"), ("user", "{input}"), ("placeholder", "{agent_scratchpad}") ]) agent = create_structured_chat_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) agent_executor.invoke({"input": "查询大语言模型的百科信息"})

三、自定义工具 + 自动调用(拓展场景)

除了官方预定义工具,自定义BaseTool也能被 Agent 自动识别调用,原理完全一致。

示例:自定义工具并接入 Agent

python

运行

from langchain.tools import BaseTool from typing import Optional, Type from langchain.callbacks.manager import CallbackManagerForToolRun # 1. 自定义工具 class WeatherTool(BaseTool): # 工具名称(Agent 识别标识) name = "city_weather" # 工具描述【重中之重】:模型靠这段文字判断是否调用 description = "用于查询指定城市的天气,入参为城市名称" def _run(self, city: str, run_manager: Optional[CallbackManagerForToolRun] = None) -> str: """同步执行逻辑""" return f"{city} 当前天气:晴,25℃" # 2. 组装工具列表 custom_tools = [WeatherTool()] # 3. 创建 Tool Calling Agent from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "按需调用工具回答问题"), ("user", "{input}"), ("placeholder", "{agent_scratchpad}") ]) agent = create_tool_calling_agent(llm, custom_tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=custom_tools, verbose=True) # 4. 自动调用自定义天气工具 agent_executor.invoke({"input": "查询北京的天气"})

四、核心调优:提升工具识别 & 调用成功率

1. 优化工具description(最关键)

  1. 描述简洁、精准、无歧义,写明:用途 + 入参要求 + 适用场景
  2. 多个工具功能相近时,明确区分差异,避免模型选错
  3. 禁止过长、模糊、口语化描述

✅ 好示例:计算数学表达式,入参为标准四则运算字符串❌ 差示例:可以算东西

2. 工具数量控制

  • 单轮 Agent 工具数量建议≤5 个
  • 工具过多会增加模型决策难度,出现乱选、漏选;多工具场景拆分多个 Agent 或使用路由分发。

3. 提示词约束增强

在 System Prompt 增加强制规则:

plaintext

优先使用工具获取外部信息,不要凭空猜测; 如果问题需要计算,必须使用计算器工具; 严格按照格式调用工具,不要编造内容。

4. 模型选型

  • 优先选用支持原生 Function Calling的模型(GPT 系列、DeepSeek、通义、文心等),调用稳定性远高于纯 ReAct。
  • 本地开源模型:优先使用 ReAct 方案,并精简工具数量。

5. 容错配置

python

运行

agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, handle_parsing_errors=True, # 解析异常自动处理 max_iterations=5 # 限制最大调用轮次,防止死循环 )
  • max_iterations:限制工具最大调用次数,避免无限循环。

6. 入参格式约束

复杂工具使用args_schema(Pydantic 模型)强制校验入参格式,减少参数错误。


五、常见问题与排查

问题 1:模型不调用工具,直接回答

原因:

  1. 工具description描述不清,模型不知道该用工具;
  2. 问题语义模糊,模型认为不需要工具;
  3. System Prompt 未强调工具使用规则。

解决:优化描述 + 补充强制使用规则。

问题 2:选错工具(比如该搜索却调用计算器)

原因:多个工具描述区分度低。解决:强化描述,明确每个工具的专属使用场景。

问题 3:输出格式解析失败(Parsing Error)

原因:模型未按要求输出调用格式(ReAct 方案高发)。

解决:

  1. 开启handle_parsing_errors=True
  2. 更换支持 Function Calling 的模型;
  3. 简化提示词,减少格式要求。

问题 4:工具调用死循环

原因:工具返回结果无法解决问题,模型反复调用同一工具

解决:设置max_iterations限制轮次。


六、方案选型总结

表格

智能体类型依赖能力准确率适用场景
Tool Calling Agent模型原生 Function Calling★★★★★生产环境、绝大多数业务、多工具联动(首选)
ReAct Agent无特殊依赖★★★☆☆开源本地模型、老旧模型、简单工具场景
Structured Chat Agent基础函数调用★★★★☆多参数、复杂结构化入参工具

七、极简落地流程(快速复盘)

  1. 加载 / 定义工具(官方预定义 / 自定义BaseTool);
  2. 编写精准的工具description
  3. 选择对应 Agent 类型(优先create_tool_calling_agent);
  4. 配置AgentExecutor,开启容错、限制轮次;
  5. 调用执行,框架自动完成「识别→选工具→传参→执行→返回」全流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询