动手做一个会调用工具的 AI Agent:多模型路由与工具编排实战
📅 2026/7/15 2:53:13
👁️ 次浏览
2026 年被称为「智能体落地元年」但真正能稳定干活的 Agent难点往往不在模型本身而在「怎么把模型、工具、上下文编排到一起」。本文用一个可运行的例子讲清楚 Agent 的工程骨架以及为什么在真实项目里我们通常不直接裸连单个模型而是加一层模型路由。一、为什么 Agent 需要「多模型路由」很多初学 Agent 的同学会默认一个 Agent 一个模型 一堆 prompt。这在 demo 阶段没问题一上生产就暴露问题长任务推理用旗舰模型更稳但成本高海量短问答 / 分类 / 抽取用轻量模型就够了硬上旗舰是浪费钱中文长文档摘要某些模型表现更好代码生成又是另一批模型领先单一供应商有可用率风险需要故障转移。所以真实项目里Agent 内部通常不是「一个模型打到死」而是有一层模型路由model routing根据任务类型、输入长度、预算把请求派给最合适的模型。# agent/router.py # 根据任务特征选择后端模型统一通过接入层发出请求 # 接入层负责密钥管理、限流、故障转移业务代码不关心具体供应商 # 注册一个统一接入层示例https://www.moyu.info/register?affCRB8 from enum import Enum class TaskKind(Enum): REASONING reasoning # 复杂推理用旗舰模型 CODEGEN codegen # 代码生成用代码强的模型 EXTRACT extract # 短文本抽取用轻量模型 SUMMARY_CN summary_cn # 中文长文摘要 ROUTING_TABLE { TaskKind.REASONING: gpt-5, TaskKind.CODEGEN: claude-4-sonnet, TaskKind.EXTRACT: gpt-5-mini, TaskKind.SUMMARY_CN: deepseek-v4, } def select_model(task: TaskKind) - str: return ROUTING_TABLE[task]路由表本身很简单麻烦的是后端怎么接。下面展开。二、Agent 的核心骨架循环 工具一个最小可用的 Agent本质是「模型调用 ↔ 工具执行」的循环。这里用 OpenAI 兼容的接口格式主流接入层都支持这套协议换供应商不用改业务代码# agent/run.py import json from agent.router import select_model, TaskKind def call_chat(model: str, messages: list, tools: list None) - dict: # 统一走接入层base_url 指向你的接入网关 # 业务侧只传 model 名 messages密钥在接入层统一管理 return gateway_chat(modelmodel, messagesmessages, toolstools) def run_agent(user_input: str, tools: list): messages [{role: user, content: user_input}] for _ in range(8): # 最多 8 轮工具调用 task classify(user_input) # 简单场景可直接指定 model select_model(task) resp call_chat(model, messages, tools) if resp.get(tool_calls): for call in resp[tool_calls]: result execute_tool(call, tools) messages.append({role: tool, content: result}) else: return resp[content] return 超过最大轮次关键点model字段是动态的。同一个 Agent推理用gpt-5抽字段用gpt-5-mini代码用claude-4-sonnet中文摘要用deepseek-v4。如果每次都去各家官网申请密钥、拼不同 SDK代码会很快腐烂。这就是为什么工程上会引入一层统一接入业务代码只认model字符串密钥、配额、限流、重试、故障转移都在接入层做换模型、加模型、切供应商业务零改动。三、工具怎么定义才不踩坑工具function calling是 Agent 的「手」。定义工具时三个常见坑1. 参数 schema 太松{ name: query_orders, parameters: { type: object, properties: { status: {type: string, description: 订单状态} } } }status不写枚举模型可能传「已付款」「已支付」「paid」三种东西下游解析崩溃。一定要写enum。2. 工具太多导致模型选错一次性塞 30 个工具弱模型会选错。按场景做工具分组或先让模型「选工具组」再「选具体工具」。3. 工具执行没有超时与兜底模型可能生成无限循环的工具调用。上面run_agent里的range(8)就是兜底生产环境还要加单次执行超时。四、上下文怎么管Agent 跑几轮后messages会爆。常用策略滑动窗口只保留最近 N 条压缩记忆把早期对话 summarize 成一条外部记忆把事实写进向量库 / KV用时再取。简单实现def compress_history(messages: list, threshold: int 12) - list: if len(messages) threshold: return messages early, recent messages[:-6], messages[-6:] summary call_chat(gpt-5-mini, [{role: user, content: f用三句话总结对话: {early}}]) return [{role: system, content: f历史摘要: {summary}}] recent注意这里压缩用的也是轻量模型进一步省钱。五、接入层选型直连 vs 聚合真实项目里「模型接入」有几种做法各有取舍方案优点缺点适合场景各家官网直连最直接密钥散落、无统一限流、供应商绑定只用一个模型自建轻量代理可控、可加审计要自己维护可用性有基础设施团队聚合接入层一套协议接多模型、统一配额多一层依赖多模型 / 成本敏感聚合接入层把多家供应商的接口收敛成统一协议业务侧切换模型只改一个字符串还能集中做限流、计费和故障转移。市面上这类方案不少从开源自建到托管服务都有选的时候看清楚是否支持你需要的模型、是否支持自定义模型服务地址、计费是否透明。六、小结一个能稳定干活的 Agent技术含量有一半在「编排」而不是「模型」用模型路由按任务分流别让旗舰模型干抽字段的活业务代码只认model字符串密钥与故障转移交给接入层工具 schema 写死枚举、控制数量、加超时上下文用滑动窗口 摘要压缩别让messages无限涨。把这几件事做对Agent 从 demo 到生产的距离会短很多。
终极ncmdump解密指南:3种方案彻底释放你的NCM音乐 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump
你是否曾为网易云音乐下载的VIP歌曲只能在特定设备播放而烦恼?ncmdump工具正是解决这一困境的专业解决方案&a…
📅 2026/7/15 2:52:13
1. 若依Vue国际化需求与方案概述企业级应用走向国际市场时,多语言支持成为刚需。若依(RuoYi)作为流行的快速开发框架,结合Vue的前后端分离架构,实现国际化(i18n)需要前后端协同工作。我曾主导过多个类似项目,发现完整的国际化方案…
📅 2026/7/15 2:52:13
在Blender中构建跨平台MMD工作流:MMD Tools插件的深度实践 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …
📅 2026/7/15 2:52:13
从传统 Web 安全到 AI 安全,漏洞的形式正在发生变化,但安全本质并未改变。 本篇将基于 Dreadnode AIRT 靶场,对 Lab01 Foundations 展开完整实战分析,从源码阅读入手,深入剖析 Flask 调试接口、Ollama 模型接口、历史会…
📅 2026/7/15 3:46:35
1. I2C协议基础与STM32开发环境搭建I2C(Inter-Integrated Circuit)是飞利浦公司开发的一种简单、双向二线制同步串行总线。它只需要两根线就能实现设备间的通信:串行数据线(SDA)和串行时钟线(SCL࿰…
📅 2026/7/15 3:46:35
1. 优先编码器:数字世界的交通警察想象一下早高峰的十字路口,如果没有红绿灯和交警指挥,所有车辆都想同时通过,结果必然是混乱不堪。8-3优先编码器就像数字电路中的交通警察,它能同时接收8个输入信号(比如8…
📅 2026/7/15 3:46:35
1. 雅可比矩阵是什么?想象一下你正在用手机导航,系统需要实时计算你的位置变化。这个过程中涉及多个变量(如经度、纬度、速度)的相互影响。雅可比矩阵就是用来描述这种多变量变化关系的数学工具——它把一个复杂系统中所有变量之间…
📅 2026/7/15 3:46:35
博主介绍:✨ 专业背景
专注Java企业级开发与小程序生态,全网影响力10万开发者,CSDN特邀作者、技术专家、新星计划导师。 🎯 核心服务 📚
毕业设计智库
微信小程序方向:100个前沿选题 Java企业级方向&#x…
📅 2026/7/15 3:46:35
1. Embedded Python Block:信号处理原型的瑞士军刀第一次接触GNU Radio时,我被它复杂的C模块编译流程劝退了好几次。直到发现Embedded Python Block这个神器,才真正体会到快速原型设计的快感。这就像突然从手工锻造铁器的时代,进化…
📅 2026/7/15 3:45:34
1. COM线程模型基础与CoInitializeEx核心作用在Windows平台开发中,组件对象模型(COM)的线程处理机制一直是开发者必须掌握的底层知识。作为COM初始化的门户函数,CoInitializeEx不仅决定了对象在何种线程环境下运行,更影响着整个组件的并发性能…
📅 2026/7/15 0:00:17
1. 为什么M芯片Mac用户需要降级到Monterey? 去年刚拿到M2芯片的MacBook Pro时,我第一时间升级到了Ventura系统。结果第三天就遇到了微信闪退、Final Cut Pro渲染卡顿的问题。后来在开发者论坛发现,不少专业软件对Ventura的适配都存在问题。这…
📅 2026/7/15 0:00:17
1. 背景与核心概念在AI大模型快速发展的今天,许多开发者和研究者都面临一个现实问题:如何在有限的硬件预算下实现高效的本地大模型部署。特别是对于个人开发者和小型团队来说,购买最新的高端显卡成本高昂,而利用现有的或二手硬件资…
📅 2026/7/15 0:00:17
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/14 6:35:02
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/14 12:06:52
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/14 7:15:18
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/14 15:11:56
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/15 2:24:18
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/14 15:11:56