MCP 的性能账被算到了工具调用之前。起点比多数人以为的早一大截。这算账我看完先记那个起点再掂三十二变四那笔实测。记的掂的点在下面一层层摆。摆好了看起点。点在下面摆着,摆好了自己挪。
起点是模型收到工具清单的那一刻。清单里躺着每个工具的名字。描述和参数规格。工具少的时候这套清单是帮手。工具一多清单本身就变成了开销。开销的第二层是选择成本。名字和描述相近的工具一多。
选对和选错之间只隔一层运气。运气的第三层在下面摆着。摆好了别眨眼。眨眼就翻过去了。过去一页少一页。少一页都是损失,损失不起的往下看,看下段。下段是那个最常被照抄的错误。误读完这篇就通了。通了就收工。收工的礼数在下段。下段是最后的门。推开它。推。
最常被照抄的错误是把接口原样镜像进协议。接口为了人类工程学REST 接口把增删改查拆成四个端点。写代码的程序心里早知道自己要去哪个端点。模型面对的却是另一道题。先理解这堆工具。挑一个。
再拼出合法参数。拼参数的第四层是替代方案。方案是别把每个操作做成一个工具。MCP 服务端只留几个通用操作。把资源和动作当作数据递过去。具体规格等真用到时再去取。取的第五层是这笔账的权衡。
权衡是规格不常驻偶尔会填错字段。填错的第六层在我看来是完全可接受的失败。前提是服务端把校验错误说清楚。模型能把调用改对。改对的第七层是我的保留。保留是通用操作的粒度怎么切这份方法论没有给标准答案,按场景记账,记账的第八层是我的收尾,收尾在最后一段。
接着算调用之后的那半笔账。工具数量减下来了。可一次读取把巨大对象塞回上下文。数量的减少就没意义。大结果的第九层解法是骨架先行。先把有用的结构递回来。重的细节等需要时再去取。取的第十层是优化 Opik 那家团队的实测。
实测是把三十个端点形状的工具缩成四个通用工具。一条原本要占十三万词元的追踪记录被压成六千多词元的骨架。细节仍然留在后面可取的位置。位置的第十一层是作者的提醒。提醒是四个不是什么神圣数字。
数字的第十二层是更值钱的那句话。模型根本不需要三十个端点形状的界面才能处理同一批数据。同一批数据的第十三层是我的收尾预告。预告在下段。读完这篇正式结束,结束语不留悬念,悬念是给没看完的人的。
看完的人不需要,不需要的直接收,收在下段,下段见。见了就懂。懂了就散。散会的礼数最后给。给完就收。收工。工收得干净。
再往深处看一层。镜像问题的本质是两套词汇的错位。接口的词汇是资源和动作。模型的词汇是意图和约束。把前者的形状原样套到后者身上。等于让模型先学会人类的路由表再来干活,学会的代价全部记在上下文的账上。
记在账上的每一笔都在挤压真正用来思考的窗口。窗口被挤掉的部分正是长任务最需要的部分。这层账单在工具少的时候看不见,工具一多就会准时上门。上门的那一刻优化工具执行速度就变成了隔靴搔痒。
骨架先行也不是没有代价。第一次读取之后模型心里的图是残缺的。残缺的图要靠第二轮第三轮补齐。补齐的轮次在断网或者超时的环境里会变成新的故障点。故障点的安排是让骨架的字段带上下文指针。指针指向的细节什么时候取由模型自己决定。决定权下放之后服务端反而可以做缓存。缓存命中的时候第二轮的成本几乎归零,归零的那一层才是真正把账算平的地方。
三把尺在实际评审里是有先后的。先看模型要扛多大的界面。这把尺直接对应每一次请求的固定开销。开销是按请求计费的。次数乘以单次就是总账。再看挑对操作有多难,这把尺对应错误率,错误率乘以重试成本是第二笔账。
最后看回来的数据有多重,这把尺对应输出侧的计费,骨架先行治的就是这一笔。三笔账加起来往往比工具本身的执行时间大一个量级,量级摆出来之后再谈毫秒级的优化才有意义。
补一句关于重试的注脚,模型填错字段被服务端打回之后的那轮修正,成本其实很低,低到可以当作正常流程的一部分。真正贵的是填对了字段却把无关的几十万字符一并拖回来。那种成本一次就把省下的全部吃掉还倒贴。倒贴的教训是把校验做厚把返回做薄。做薄的那一端才是账本的正面。
收个尾账,工具的执行速度只是水面上的那截,水面下的界面、选择和回传才是账本的主体。
审查清单是这篇的收官。接口可以压在既有接口之上。但那不意味着模型得像应用程序那样去用它。我的两把尺是模型要扛多大的界面。挑对操作有多难。回来的数据有多重,三把尺的第十四层是我的点评。第一句是为可恢复的错误预付巨额上下文这笔账今年该重算了,算清的回来点赞。第二句是骨架先行这个思路今年该进所有接口的评审表,进表的再点一个赞,句号。