简介
本文探讨了MCP协议在AI智能体与工具连接中的应用问题,指出传统直接调用工具方式会导致Token消耗过多。作者提出通过代码执行解决方案,让智能体按需加载工具、高效处理结果并实现复杂控制流,可显著降低Token消耗98.7%。同时详细介绍了代码执行在渐进式工具暴露、数据过滤、隐私保护和状态持久化等方面的优势,为构建高效AI原生应用提供了实用指导。
直接调用工具时,每次工具定义和执行结果都会占用上下文资源。而让智能体通过编写代码来调用工具,能实现更好的扩展性,以下是借助 MCP 实现这一方案的具体原理。
模型上下文协议(Model Context Protocol,简称 MCP)是一套用于连接 AI 智能体与外部系统的开放标准。传统方式中,智能体与工具、数据的对接需要为每一组配对开发定制化集成方案,这会造成系统碎片化和重复开发,难以构建真正可扩展的连接系统。MCP 提供了统一的协议:开发者只需在智能体中实现一次 MCP 集成,就能解锁整个生态的各类工具对接能力。
自 2024 年 11 月 MCP 发布以来,其普及速度迅猛:社区已搭建数千台 MCP 服务器,所有主流编程语言均已推出对应的 SDK,MCP 也已成为行业内智能体对接工具与数据的事实标准。
如今,开发者构建的智能体通常能访问数十台 MCP 服务器上的数百甚至数千个工具。但随着对接工具数量的增加,预先加载所有工具定义以及通过上下文窗口传递中间结果的方式,会导致智能体运行变慢、成本上升。
本文将探讨如何通过代码执行让智能体更高效地与 MCP 服务器交互,在支持更多工具的同时减少 Token 消耗。
一、工具引发的 Token 消耗过量问题降低了智能体效率
随着 MCP 使用规模扩大,两种常见模式会增加智能体的成本和延迟:
第一、工具定义占用过多上下文窗口;
第二、中间工具结果消耗额外 Token。
1.1 工具定义占用过多上下文窗口
大多数 MCP 客户端会预先将所有工具定义直接加载到上下文,并通过直接工具调用语法暴露给模型。这些工具定义可能如下所示:
gdrive.getDocument 描述:从 Google 云端硬盘获取文档 参数: documentId(必填,字符串类型):待获取文档的 ID fields(可选,字符串类型):需返回的特定字段 返回值:包含标题、正文内容、元数据、权限等信息的文档对象salesforce.updateRecord 描述:更新 Salesforce 中的记录 参数: objectType(必填,字符串类型):Salesforce 对象类型(潜在客户、联系人、客户等) recordId(必填,字符串类型):待更新记录的 ID data(必填,对象类型):需更新的字段及对应新值 返回值:包含确认信息的更新后记录对象工具描述会占用大量上下文窗口空间,导致响应时间延长、成本增加。当智能体对接数千个工具时,模型在处理用户请求前,需要先处理数十万个 Token。
1.2 中间工具结果消耗额外 Token
大多数 MCP 客户端允许模型直接调用 MCP 工具。例如,你可能会向智能体发起请求:“从 Google 云端硬盘下载我的会议记录,并将其附加到 Salesforce 潜在客户信息中”。
模型会执行如下调用:
工具调用:gdrive.getDocument(documentId: "abc123") → 返回结果:"讨论了第四季度目标...\n[完整会议记录文本]" (该结果会加载到模型上下文) 工具调用:salesforce.updateRecord( objectType: "SalesMeeting", recordId: "00Q5f000001abcXYZ", data: { "备注": "讨论了第四季度目标...\n[完整会议记录文本]" } ) (模型需再次将完整会议记录写入上下文)每一个中间结果都必须经过模型传递。在上述示例中,完整的会议记录会两次流经上下文。对于一场 2 小时的销售会议,这可能意味着额外处理 5 万个 Token。而对于更大的文档,甚至可能超出上下文窗口限制,导致工作流程中断。当处理大型文档或复杂数据结构时,模型在工具调用之间复制数据时更容易出错。
| 模型 | Claude 3.5 Sonnet(新版) | Claude 3.5 Haiku | Claude 3.5 Sonnet | GPT-4o* | GPT-4o mini* | Gemini 1.5 Pro | Gemini 1.5 Flash |
|---|---|---|---|---|---|---|---|
| 研究生水平推理(GPQA 钻石级) | 65.0%(零样本思维链) | 41.6%(零样本思维链) | 59.4%(零样本思维链) | 53.6%(零样本思维链) | 40.2%(零样本思维链) | 59.1%(零样本思维链) | 51.0%(零样本思维链) |
| 本科水平知识(MMLU Pro) | 78.0%(零样本思维链) | 65.0%(零样本思维链) | 75.1%(零样本思维链) | - | - | 75.8%(零样本思维链) | 67.3%(零样本思维链) |
| 代码能力(HumanEval) | 93.7%(零样本) | 88.1%(零样本) | 92.0%(零样本) | 90.2%(零样本) | 87.2%(零样本) | - | - |
| 数学解题(MATH) | 78.3%(零样本思维链) | 69.2%(零样本思维链) | 71.1%(零样本思维链) | 76.6%(零样本思维链) | 70.2%(零样本思维链) | 86.5%(四样本思维链) | 77.9%(四样本思维链) |
| 高中数学竞赛(AIME2024) | 16.0%(零样本思维链) | 5.3%(零样本思维链) | 9.6%(零样本思维链) | 9.3%(零样本思维链) | - | - | - |
| 视觉问答(MMMU) | 70.4%(零样本思维链) | - | 68.3%(零样本思维链) | 69.1%(零样本思维链) | 59.4%(零样本思维链) | 65.9%(零样本思维链) | 62.3%(零样本思维链) |
| 智能体编码(SWE-bench 验证集) | 49.0% | 40.6% | 33.4% | - | - | - | - |
| 智能体工具使用(TAU-bench) | 零售行业 69.2% / 航空行业 46.0% | 零售行业 51.0% / 航空行业 22.8% | 零售行业 62.6% / 航空行业 36.0% | - | - | - | - |
- 注:我们的评估表格未纳入 OpenAI 的 o1 模型系列,因其依赖大量响应前计算时间,与常规模型存在本质差异,难以进行公平的性能对比。
MCP 客户端会将工具定义加载到模型的上下文窗口,并编排一个消息循环,使得每次工具调用和结果都需在操作之间经过模型传递。
二、借助 MCP 实现代码执行,提升上下文效率
随着代码执行环境在智能体中的普及,一种解决方案是将 MCP 服务器呈现为代码 API,而非直接的工具调用。智能体可通过编写代码与 MCP 服务器交互,这种方式能同时解决上述两个问题:智能体仅加载所需工具,并在执行环境中处理数据后,再将结果返回给模型。
实现方式有多种。其中一种是为所有已连接的 MCP 服务器生成工具文件目录,以下是 TypeScript 实现示例:
servers├── google-drive │ ├── getDocument.ts │ ├── ...(其他工具) │ └── index.ts ├── salesforce │ ├── updateRecord.ts │ ├── ...(其他工具) │ └── index.ts └── ...(其他服务器)
每个工具对应一个文件,示例如下:
// ./servers/google-drive/getDocument.ts import { callMCPTool } from "../../../client.js"; interface GetDocumentInput { documentId: string; } interface GetDocumentResponse { content: string; } /* 从 Google 云端硬盘读取文档 */ export async function getDocument(input: GetDocumentInput): Promise<GetDocumentResponse> { return callMCPTool<GetDocumentResponse>('google_drive__get_document', input); }前文提到的 “从 Google 云端硬盘到 Salesforce” 的示例,可转化为如下代码:
// 从 Google 文档读取会议记录,并添加到 Salesforce 潜在客户信息中 import * as gdrive from './servers/google-drive'; import * as salesforce from './servers/salesforce'; const transcript = (await gdrive.getDocument({ documentId: 'abc123' })).content; await salesforce.updateRecord({ objectType: 'SalesMeeting', recordId: '00Q5f000001abcXYZ', data: { Notes: transcript } });智能体通过浏览文件系统发现工具:列出./servers/目录找到可用服务器(如google-drive和salesforce),再读取所需的特定工具文件(如getDocument.ts和updateRecord.ts),以理解每个工具的接口。这种方式让智能体仅加载当前任务所需的工具定义,将 Token 消耗量从 15 万个降至 2000 个,时间和成本节省达 98.7%。
Cloudflare 也发布了类似研究结果,并将这种 MCP 代码执行方式称为 “代码模式(Code Mode)”。核心思路一致:大语言模型擅长编写代码,开发者应利用这一优势,构建更高效与 MCP 服务器交互的智能体。
三、借助 MCP 实现代码执行的优势
通过 MCP 代码执行,智能体可按需加载工具、在数据到达模型前进行过滤、一步执行复杂逻辑,从而更高效地利用上下文。此外,这种方式还具备安全和状态管理方面的优势。
3.1 渐进式暴露工具
模型擅长导航文件系统。将工具以代码形式呈现于文件系统,允许模型按需读取工具定义,而非一次性加载全部。
此外,还可在服务器中添加search_tools工具以查找相关定义。例如,在使用前文假设的 Salesforce 服务器时,智能体搜索 “salesforce” 并仅加载当前任务所需的工具。在search_tools工具中加入细节级别参数,允许智能体选择所需的信息详细程度(例如:仅名称、名称和描述、或包含模式的完整定义),也有助于智能体节省上下文并高效查找工具。
3.2 上下文高效的工具结果
处理大型数据集时,智能体可在代码中对结果进行过滤和转换后再返回。例如,获取包含 1 万行数据的电子表格:
// 无代码执行场景 - 所有行均流经上下文 工具调用:gdrive.getSheet(sheetId: 'abc123') → 1 万行数据加载到上下文,需手动过滤 // 代码执行场景 - 在执行环境中过滤 const allRows = await gdrive.getSheet({ sheetId: 'abc123' }); const pendingOrders = allRows.filter(row => row["状态"] === '待处理' ); console.log(`找到 ${pendingOrders.length} 个待处理订单`); console.log(pendingOrders.slice(0, 5)); // 仅输出前 5 条供查看智能体仅需查看 5 行数据,而非 1 万行。类似模式适用于数据聚合、多数据源关联查询或特定字段提取 —— 所有操作均不会占用过多上下文窗口。
3.3 更强大且上下文高效的控制流
循环、条件判断和错误处理可通过熟悉的代码模式实现,而非串联多个独立工具调用。例如,若需在 Slack 中接收部署通知,智能体可编写如下代码:
let found = false; while (!found) { const messages = await slack.getChannelHistory({ channel: 'C123456' }); found = messages.some(m => m.text.includes('部署完成')); if (!found) await new Promise(r => setTimeout(r, 5000)); } console.log('已收到部署通知');这种方式比在智能体循环中交替执行 MCP 工具调用和睡眠命令更高效。
此外,编写可执行的条件分支树还能减少 “首 Token 响应时间” 延迟:无需等待模型评估条件语句,可直接让代码执行环境处理。
3.4 隐私保护操作
当智能体通过代码执行使用 MCP 时,中间结果默认保留在执行环境中。这样一来,智能体仅能看到明确日志或返回的数据,意味着不希望与模型共享的数据可在工作流程中传递,而无需进入模型上下文。
对于更敏感的工作负载,智能体框架可自动对敏感数据进行令牌化处理。例如,需将电子表格中的客户联系信息导入 Salesforce 时,智能体编写如下代码:
const sheet = await gdrive.getSheet({ sheetId: 'abc123' }); for (const row of sheet.rows) { await salesforce.updateRecord({ objectType: 'Lead', recordId: row.salesforceId, data: { Email: row.email, Phone: row.phone, Name: row.name } }); } console.log(`已更新 ${sheet.rows.length} 条潜在客户记录`);MCP 客户端会拦截数据,并在其到达模型前对个人身份信息(PII)进行令牌化处理:
// 若智能体日志输出 sheet.rows,将看到以下内容: [ { salesforceId: '00Q...', email: '[邮箱_1]', phone: '[电话_1]', name: '[姓名_1]' }, { salesforceId: '00Q...', email: '[邮箱_2]', phone: '[电话_2]', name: '[姓名_2]' }, ... ]之后,当该数据在另一个 MCP 工具调用中共享时,MCP 客户端会通过查找表还原令牌化数据。真实的邮箱地址、电话号码和姓名会从 Google 表格流转至 Salesforce,但全程不会经过模型。这能防止智能体意外记录或处理敏感数据,也可通过这种方式定义确定性安全规则,指定数据的流转范围。
3.5 状态持久化与技能沉淀
支持文件系统访问的代码执行,允许智能体在多个操作间维持状态。智能体可将中间结果写入文件,以便恢复工作和跟踪进度:
const leads = await salesforce.query({ query: 'SELECT Id, Email FROM Lead LIMIT 1000' }); const csvData = leads.map(l => `${l.Id},${l.Email}`).join('\n'); await fs.writeFile('./workspace/leads.csv', csvData); // 后续执行可从断点继续 const saved = await fs.readFile('./workspace/leads.csv', 'utf-8');智能体还可将自身代码保存为可复用函数。当智能体开发出某一任务的可用代码后,可将其保存供未来使用:
// ./skills/save-sheet-as-csv.ts import * as gdrive from './servers/google-drive'; export async function saveSheetAsCsv(sheetId: string) { const data = await gdrive.getSheet({ sheetId }); const csv = data.map(row => row.join(',')).join('\n'); await fs.writeFile(`./workspace/sheet-${sheetId}.csv`, csv); return `./workspace/sheet-${sheetId}.csv`; } // 后续任何智能体执行过程中均可调用: import { saveSheetAsCsv } from './skills/save-sheet-as-csv'; const csvPath = await saveSheetAsCsv('abc123');这与 “技能(Skills)” 概念密切相关 ——“技能” 是包含可复用指令、脚本和资源的文件夹,帮助模型提升特定任务的执行性能。在这些保存的函数中添加 SKILL.md 文件,可创建结构化技能供模型参考和使用。久而久之,智能体将构建起一套高阶能力工具箱,不断优化自身工作所需的支撑架构。
需注意的是,代码执行也会带来额外复杂性。运行智能体生成的代码需要安全的执行环境,包括适当的沙箱隔离、资源限制和监控机制。这些基础设施要求会增加运营开销和安全考量,而直接工具调用则可避免这些问题。因此,在采用代码执行方式时,需权衡其带来的优势(降低 Token 成本、减少延迟、提升工具组合能力)与实现成本。
四、总结
MCP 为智能体连接各类工具和系统提供了基础协议。但当连接的服务器过多时,工具定义和结果会消耗过量 Token,降低智能体效率。
尽管文中提到的许多问题(上下文管理、工具组合、状态持久化)看似新颖,但在软件工程领域已有成熟解决方案。代码执行将这些既定模式应用于智能体,让智能体能够通过熟悉的编程结构更高效地与 MCP 服务器交互。若你采用了这种方案,欢迎与 MCP 社区分享你的实践成果。
五、在大模型时代,我们如何有效的去学习大模型?
现如今大模型岗位需求越来越大,但是相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
掌握大模型技术你还能拥有更多可能性:
• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;
• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;
• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;
• 更优质的项目可以为未来创新创业提供基石。
可能大家都想学习AI大模型技术,也_想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把都打包整理好,希望能够真正帮助到大家_。
一、AGI大模型系统学习路线
很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,下面是我整理好的一套完整的学习路线,希望能够帮助到你们学习AI大模型。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF书籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型各大场景实战案例
结语
【一一AGI大模型学习 所有资源获取处(无偿领取)一一】
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~