跳到主要内容

企业 API 阻抗失配:为什么你的 AI Agent 在做任何有用的事情之前就浪费了 60% 的 Token

· 阅读需 9 分钟
Tian Pan
Software Engineer

你的 AI agent 在推理、规划和生成自然语言方面表现出色。然后你把它指向企业的 SAP 端点,它接下来花了 4,000 个 token 试图理解一个 SOAP 信封。欢迎来到阻抗失配的世界——这个隐性税收把每一次企业 AI 集成都变成了 token 的焚烧炉。

这种失配不仅仅是 XML 与 JSON 的问题。它是 LLM 思维方式(自然语言、扁平的键值结构、简洁的上下文)与企业系统通信方式(深层嵌套的 schema、特定于实现的命名、分页游标以及数十年积累的协议约定)之间的根本冲突。与人类开发者只需阅读一次 WSDL 文档就可以继续工作不同,你的 agent 在每次调用时都要重新解析这种复杂性。

隐藏的 Token 税

当基于 LLM 的 agent 与返回干净 JSON 的现代 REST API 交互时,格式开销是最小的。一条客户记录可能花费 200 个 token。同样的记录来自传统的 SOAP 服务——包裹在 XML 命名空间、信封头和 schema 声明中——在 agent 提取单个有用字段之前,很容易膨胀到 800-1,200 个 token。

这不是四舍五入的误差。在链式调用多个 API 的生产 agent 工作流中,格式开销会累积。一个需要查找客户、检查其订单历史并在三个企业系统中验证库存的 agent,仅在结构解析上就可能消耗 5,000-8,000 个 token。这些 token 没有用在推理、规划或为用户生成有用的输出上。

当涉及工具定义时,问题变得更糟。当团队将整个 API 自动包装为 agent 工具——暴露 ERP 系统的所有 200 个端点时——仅工具 schema 就可能在第一条用户消息到达之前消耗模型上下文窗口的 5-7%。当工具超过 50 个时,模型不会优雅降级,而是直接崩溃。工具选择准确率急剧下降,agent 开始幻觉出不存在的工具名称。

为什么"直接用 API 网关"行不通

平台团队的本能反应是:在所有东西前面放一个 API 网关,把 XML 转换成 JSON,就完事了。这解决了格式问题,却完全忽略了语义问题。

考虑一个典型的企业 CRM。它的 API 暴露了像 get_customer_by_internal_idlist_orders_with_cursor_paginationupdate_account_status_with_audit_trail 这样的端点。这些名称的存在是因为后端架构——数据库规范化选择、微服务边界、合规要求。它们与用户实际想要完成的事情毫无关系。

当你将这些具有实现风味的端点暴露为 agent 工具时,你就将后端架构注入到了 LLM 的推理空间中。agent 必须理解你的内部 ID 方案、游标分页格式和审计跟踪约定。这相当于要求一个新员工在查询客户订单状态之前先学习数据库 schema。

API 网关将 <CustomerRecord> 转换为 {"customer_record": ...}。它不会将"反映我们微服务分解的三个链式 API 调用"转换为"一个回答用户问题的操作"。格式转换是一个已解决的问题。语义转换才是团队真正卡住的地方。

真正有效的适配器层

在生产中成功的模式是面向结果的适配器层——一个位于你的 agent 和企业 API 之间的薄服务层,暴露映射到用户意图而非后端操作的工具。

不再是三个工具(get_customerlist_ordersget_order_status),而是暴露一个:track_latest_order。适配器在服务端处理 API 编排,将响应压缩成 agent 可以推理的紧凑结构,并剥离 LLM 不需要的每个字段。

这种方法带来三个复合收益:

  • Token 效率:agent 看到的是一个具有简单 schema 的工具,而不是三个具有复杂 schema 的工具。响应载荷缩小,因为适配器只过滤相关字段。
  • 可靠性:一次工具调用而非三次意味着一个故障点而非三个。适配器可以在内部处理重试、分页和错误规范化。
  • 推理质量:agent 的上下文保持整洁。它推理的是"追踪客户的订单"而不是"调用端点 A,提取字段 X,将其传递给带有游标参数 Y 的端点 B"。

80/20 法则在这里非常适用。在大多数企业场景中,20% 的 API 能力服务于 80% 的实际用户请求。你的适配器层不需要包装每个端点——只需要那些映射到真实工作流的端点。

动态工具加载:扩展模式

即使有了面向结果的适配器,拥有数百个集成的企业也面临上下文窗口问题。你不能在每次 agent 调用中加载 400 个工具定义并期望连贯的行为。

新兴的解决方案是动态工具集——一种模式,其中 agent 只从三个元工具开始:搜索可用工具、获取特定工具的 schema 和执行工具。agent 不再预先加载所有工具 schema(在静态配置中通常消耗 60-80% 的 token),而是按需发现和加载工具。

结果是惊人的。实施动态工具集的团队报告,与静态工具加载相比,输入 token 使用量减少了 90-97%,同时在 40 到 400 个工具的范围内保持 100% 的任务成功率。权衡是执行时间——动态发现每个任务增加 2-3 次额外的工具调用,大约使延迟翻倍。对于大多数企业工作流来说,API 调用本身就需要数百毫秒,这种开销是可以接受的。

关键洞察是工具 schema 是 agent 调用中最大的固定成本。一个具有嵌套参数、枚举和描述的复杂工具定义可以消耗 500-1,000 个 token。乘以 200 个工具,你就在与 95% 的请求无关的样板文件上耗尽了上下文窗口的很大一部分。

没人谈论的语义翻译问题

格式适配器和动态工具集解决了机械性问题。更难的挑战是语义的:企业 API 以 LLM 系统性误解的方式编码含义。

日期格式是经典例子。API 在名为 ERDAT 的字段中返回 "20260414"。人类开发者知道(或从文档中了解到)这是 SAP 压缩格式的创建日期。LLM 可能将其解释为 ID、版本号,或尝试将其解析为 ISO 日期并失败。字段名 ERDAT 与其含义"创建日期"之间的语义鸿沟对模型来说是不可见的,除非有明确的映射。

货币字段更糟糕。企业系统通常以最小单位(美分而非美元)存储金额,货币代码在单独的字段中,有时在单独的 API 调用中。一个读取 amount: 150000currency: USD 而不理解最小单位约定的 agent 会自信地报告 150,000,而实际值是150,000,而实际值是 1,500。

这些不是边缘情况——它们是经过数十年演化的企业系统的常态。每个字段名都是某人在 1998 年选择的缩写。每种数据格式都反映了为 COBOL 兼容性而做出的决定。你的适配器层需要具备语义感知能力:不仅仅是转换格式,而是翻译含义。

实际的方法是在你的适配器旁边构建一个元数据层——一个用语义含义、单位和约束来注释企业 API 字段的映射。这个元数据成为 agent 看到的工具描述的一部分,在 LLM 遇到 ERDAT 之前就将其转变为 creation_date (ISO 8601 format)

构建你的集成架构

如果你今天开始企业 agent 集成,以下是决策框架:

  • 1-5 个集成,使用现代 REST API:直接的工具/函数调用就足够了。格式开销最小,维护负担可控。
  • 5-50 个集成或任何遗留系统:构建面向结果的适配器。投入工程时间将后端操作转换为与用户意图对齐的工具,配以干净的 schema 和语义元数据。
  • 50+ 个集成:动态工具集是不可商量的。在这种规模下,静态工具加载要么耗尽你的上下文窗口,要么摧毁你的 agent 推理质量。对于高流量集成,结合面向结果的适配器。
  • 跨组织 agent 协作:关注新兴的 Agent-to-Agent (A2A) 和 Agent Network Protocol (ANP) 标准,但不要在此基础上构建生产系统。协议仍在固化中。

在每种情况下,都要抵制自动包装现有 API 的诱惑。你在集成上节省的五分钟将花费你数千美元的浪费 token 和数小时调试源于语义混淆而非代码错误的 agent 故障。

集成层就是产品

令人不安的事实是,对于企业 AI agent,集成层是大部分工程复杂性所在。agent 本身——LLM、编排框架、提示工程——可以说是简单的部分。困难的部分是构建翻译层,使你 1990 年代的 ERP 系统对以自然语言思考的模型来说是可读的。

将此视为管道工程的团队——用 API 网关和格式转换器就能解决的事情——最终得到的 agent 技术上可以工作,但会烧光 token 预算并产生不可靠的结果。将集成层视为一流产品的团队,通过仔细的语义映射、面向结果的工具设计和动态加载,构建出在企业环境中真正交付价值的 agent。

阻抗失配不会消失。企业系统变化缓慢,SOAP、固定宽度文件和大型机屏幕的安装基数将比我们大多数人都活得长。成功的 agent 不会是那些具有最佳推理能力的 agent,而是那些拥有最佳翻译器的 agent。

References:Let's stay in touch and Follow me for more thoughts and updates