当前位置: 首页 > news >正文

[智能体-41]:智能体识别调用外部工具:原理 + 判定手段 + Python 最简代码示例

一、核心识别逻辑

大模型本身无工具调用能力,智能体靠三类判定手段判断是否要调工具:

  1. 意图语义识别:用户问题超出模型静态知识库实时数据、计算、联网、硬件操作!!!
  2. 格式规则匹配关键词、指令、参数触发工具调用,这是最初的方式。
  3. 函数调用 Prompt 约束:大模型按指定JSON 格式输出调用指令,智能体解析执行。MCP就采用的这种方式。

二、通用识别判定手段

  1. 知识库边界判断时间、价格、天气、数学计算、外部接口类问题必调用
  2. 关键词触发计算、查询、搜索、打开、获取、运行等词触发
  3. Prompt 强制约定:只在无法回答时输出工具调用结构体
  4. 输出解析器:正则 / 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("你好"))

四、主流框架底层识别原理

  1. LangChainPydantic结构化输出 + 解析器识别函数调用
  2. OpenAI Function Call:模型原生输出函数参数,SDK 自动解析判定
  3. Coze / 豆包智能体:意图分类 + 槽位填充,命中工具域则调用

五、运行输出

plaintext

工具调用结果:30 工具调用结果:北京今日晴天,25℃ 直接回答:你好,无需调用工具
http://www.jsqmd.com/news/875070/

相关文章:

  • 对抗性环境下基于分布鲁棒优化的k-次模拦截问题求解
  • 基于树莓派与YOLOv8的铁路道口智能安全系统全栈实践
  • Ubuntu 20.04插上网线没反应?手把手教你搞定RTL8111/8168/8411网卡驱动(附自动加载服务配置)
  • Burp Suite扫描深度配置指南:被动扫描、主动扫描与自定义插入点协同调优
  • 信息论视角下的模型压缩与贝叶斯非参数建模理论边界分析
  • 卷积神经网络频谱分析与LFA-SVD优化方法
  • 当国产欧拉系统遇上VMware ESXi:一次非官方兼容环境的部署实践与思考
  • Pico Neo3 Unity XR开发实战:从黑屏到手柄响应的完整链路
  • LeetCode 724:寻找数组的中心下标 | 前缀和的平衡点
  • [智能体-42]:深度解读:Python 免编译 + 动态执行,支撑智能体落地大模型决策
  • Juno平台TF-A安全调试功能恢复与配置指南
  • 深入解析:浏览器如何“咀嚼”HTML头部——从字节流到渲染树的完整链路与性能优化实战
  • 鸿蒙electron跨端框架PC墨案写作实战:把 Markdown 正文区做成桌面写作的中心
  • LeetCode 1248:统计「优美子数组」 | 前缀和与奇数计数
  • 基于FeFET的动态可重构FPGA:实现亚纳秒级上下文切换的硬件加速新架构
  • 司法AI风险评估:性能与公平性的技术悖论与工程实践
  • 反事实推理:用因果视角评估与缓解AI模型偏见
  • 基于LLM与多智能体的微服务自治运维系统设计与实践
  • 边缘计算融合触觉互联网与数字孪生:构建超低延迟人机交互框架
  • 稀疏结式与动作矩阵:多项式方程组求解的几何代数化方法
  • 鸿蒙electron跨端框架PC片段匣实战:给常用代码片段一个能搜索、复制和整理的桌面仓
  • FPGA加速机器学习在粒子物理触发系统中的应用与实战
  • 计算机视觉模型失败模式自动化发现与自然语言描述技术详解
  • Unity PBR材质工作流:800个开箱即用的工业级材质球
  • SMGI框架:通用人工智能的结构元模型与实现路径解析
  • 前缀和与差分 | 数组区间查询的利器
  • TabularMark表格数据水印:原理、实现与参数调优实战
  • LeetCode 560:和为 K 的子数组 | 前缀和与哈希表
  • 除了Easy App Locker,还有哪些Mac应用加锁方案?横向对比与避坑指南
  • Claude写代码到底靠不靠谱?实测37个真实开发任务后,我删掉了80%的Copilot订阅