[智能体-41]:智能体识别调用外部工具:原理 + 判定手段 + Python 最简代码示例
一、核心识别逻辑
大模型本身无工具调用能力,智能体靠三类判定手段判断是否要调工具:
- 意图语义识别:用户问题超出模型静态知识库(实时数据、计算、联网、硬件操作!!!)
- 格式规则匹配:关键词、指令、参数触发工具调用,这是最初的方式。
- 函数调用 Prompt 约束:大模型按指定JSON 格式输出调用指令,智能体解析执行。MCP就采用的这种方式。
二、通用识别判定手段
- 知识库边界判断:时间、价格、天气、数学计算、外部接口类问题必调用
- 关键词触发:计算、查询、搜索、打开、获取、运行等词触发
- Prompt 强制约定:只在无法回答时输出工具调用结构体
- 输出解析器:正则 / JSON 解析模型返回,区分普通回答和工具指令
三、完整可运行代码示例(轻量 Agent 工具调用)
python
运行
import json import re # 1. 模拟外部工具库 tools = { "calculator": lambda a,b: a + b, "weather_query": lambda city: f"{city}今日晴天,25℃" } # 2. 工具调用识别解析器 def parse_tool_call(llm_response): # 匹配模型输出的工具调用JSON格式 pattern = r"\{.*?\"tool_name\".*?\}" match = re.search(pattern, llm_response, re.S) if not match: return None, llm_response try: call_info = json.loads(match.group()) return call_info, None except: return None, llm_response # 3. 模拟大模型:判断是否需要调用工具 def llm_judge_need_tool(user_query): # 简单语义识别规则 if any(word in user_query for word in ["加","计算","求和"]): return json.dumps({"tool_name":"calculator","params":{"a":10,"b":20}}) elif "天气" in user_query: return json.dumps({"tool_name":"weather_query","params":{"city":"北京"}}) else: return f"直接回答:{user_query},无需调用工具" # 4. 智能体主调度 def agent_run(user_input): # 模型判断是否调用工具 resp = llm_judge_need_tool(user_input) # 解析识别工具指令 tool_call, normal_ans = parse_tool_call(resp) if normal_ans: return normal_ans # 执行外部工具 tool_func = tools[tool_call["tool_name"]] res = tool_func(**tool_call["params"]) return f"工具调用结果:{res}" # 测试 if __name__ == "__main__": print(agent_run("10加20等于多少")) print(agent_run("北京天气")) print(agent_run("你好"))四、主流框架底层识别原理
- LangChain:
Pydantic结构化输出 + 解析器识别函数调用 - OpenAI Function Call:模型原生输出函数参数,SDK 自动解析判定
- Coze / 豆包智能体:意图分类 + 槽位填充,命中工具域则调用
五、运行输出
plaintext
工具调用结果:30 工具调用结果:北京今日晴天,25℃ 直接回答:你好,无需调用工具