简介:为什么在Agent里发一句“你好”会消耗上万Token,而直连模型只需几十?本文对比裸模型调用与Agent调用在上下文构成、成本结构、延迟与适用场景上的差异,拆解系统提示词、工具Schema、Skill说明、工作区文件与历史会话五大消耗来源,并给出异常排查步骤、优化清单与选型建议,帮助开发者把Token预算花在刀刃上。
近期一个在开发者社区流传的真实案例颇具代表性:某开发者在使用一款主流Agent框架时,仅仅发送了一句“你好”,请求统计显示输入Token消耗高达1.6万~1.7万,而输出Token只有几十;即便删减了部分已安装的Skill,消耗依然居高不下。同样的“你好”,如果直接调用大模型的对话接口,输入通常只有几个到十几个Token。
同一句话、同一个模型,输入成本相差三个数量级。这背后的原因并不神秘:两种调用方式交给模型的“上下文”完全不同。本文将围绕这两类调用方式展开系统对比——一类是裸模型调用(直连大模型对话接口的纯文本调用),一类是Agent框架化调用(带系统提示词、工具注册、技能加载与记忆管理的Agent式调用),说清楚Token分别花在了哪里、各自的适用边界,以及出现异常消耗时如何排查与治理。
方案A:裸模型调用。 指应用直接调用大模型服务提供的对话接口,请求体一般只包含系统提示词(可选)、少量历史消息和当前用户输入。它的定位是“单向问答”:模型读入文本、生成文本,不执行工具、不读文件、不做多步规划。常见于问答机器人、翻译摘要、内容生成等单点任务。
方案B:Agent框架化调用。 指通过Agent框架组织大模型能力,让模型在一个“工作环境”中运行:框架会把一份较长的系统提示词(角色设定、行为规范、环境说明)、一批工具的定义(工具Schema)、已安装Skill的说明文档、工作区内的文件内容、以及完整的历史会话,全部组装进上下文后发给模型。模型可在多轮循环中调用工具、读取结果、继续推理,直到完成任务。常见于编码助手、自动化工作流、数据分析等复杂场景。
裸调用的上下文构成非常简单:系统提示词+对话历史+当前输入。而Agent调用的上下文是一个“复合体”,以下因素共同决定了异常消耗的发生:
1. 任务复杂度是基线变量,Agent会放大它。 任务越复杂,Token消耗天然越多。比如“总结一篇文章”与“阅读20篇文章、交叉对比观点、查证资料后写成5000字长文”完全不在一个量级:后者要读更多资料、调更多工具、保留更多上下文、输出更长内容,还可能多轮推理。裸调用的成本随任务复杂度近似线性增长,而Agent因为引入工具循环,复杂任务的成本可能呈超线性放大。
2. 系统提示词的静态占用。 Agent为了规范模型行为,通常内置一份较长的系统提示词,涵盖角色设定、安全规则、输出格式、环境说明等,静态占用从数百到数千Token不等,且每次请求都会重复携带。
3. 工具Schema注册。 Agent每次请求模型时,都要告诉模型“我有哪些工具可用、每个工具的参数如何填写”。工具越多,这段说明越长。当一个Agent内置数十个工具时,仅Schema部分就可能占用数千Token——哪怕你只是问“今天星期几”,这段说明也会被完整带上。
4. Skill说明的预加载。 Skill与工具有类似的成本结构:安装得越多,Agent接到任务时越倾向于把各Skill的说明书读一遍以判断哪些能用,这些说明同样计入输入Token。这也是案例中“删掉部分Skill后消耗有所变化、但依然异常”的原因——真正的大头可能并不在Skill。
5. 工作区文件注入。 让Agent分析本地项目时,框架可能把项目目录下的代码文件、README、需求文档、设计文档、日志报错、历史对话等一并塞进上下文。用户以为自己只提交了一句话,实际上模型已经“读”了几万Token。
6. 历史会话与多轮工具循环。 会话越长,每轮携带的历史越多;而Agent完成任务往往需要多轮“调用工具→回填结果→继续推理”的循环,每一轮的工具返回结果都会追加进上下文,成本呈滚雪球式增长。
| 对比维度 | 裸模型调用 | Agent框架化调用 |
|---|---|---|
| 上下文构成 | 系统提示词+对话历史+当前输入 | 系统提示词+工具Schema+Skill说明+工作区文件+完整历史 |
| 单次请求基础开销 | 极低,通常几十至几百Token | 可达数千至数万Token |
| 能力范围 | 纯文本生成与推理 | 工具调用、文件读写、多步任务执行 |
| 成本可预测性 | 高,与对话长度近似线性 | 低,受工具数量、文件规模、循环轮次影响 |
| 延迟表现 | 首Token延迟低 | 上下文更长且可能多轮循环,整体延迟明显更高 |
| 排障复杂度 | 低 | 高,需拆解上下文构成定位消耗点 |
| 安全边界 | 仅文本交互,边界清晰 | 可触达文件系统与外部工具,需最小权限管控 |
| 适用任务 | 问答、翻译、摘要、单点生成 | 编码、自动化工作流、跨系统操作 |
第一步,看用量明细。 主流大模型服务平台(包括百度智能云提供的大模型服务)通常会在控制台提供Token用量统计,可按请求查看输入/输出构成,先确认异常确实发生在输入侧。
第二步,拆解上下文构成。 把一次请求的上下文按来源分组统计,找到最大消耗项。示意性伪代码如下:
# 示意代码:按来源统计一次Agent请求的上下文Token分布parts = {"system_prompt": system_prompt, # 系统提示词"tool_schemas": dump_tool_schemas(), # 工具定义"skill_docs": load_skill_docs(), # Skill说明"workspace_files": read_workspace(), # 工作区文件"history": history, # 历史会话"user_input": "你好",}for name, text in parts.items():print(name, estimate_tokens(text)) # 定位最大消耗来源
第三步,针对性治理。 常见手段包括:
回到开头的案例:一句“你好”烧掉1.7万Token,本质上不是模型贵,而是Agent把大量与任务无关的信息(工具说明、Skill文档、项目文件、长历史)塞进了每一次请求。两类方案没有绝对优劣:裸调用胜在便宜、快、可控,适合单点任务;Agent调用胜在能自主完成复杂工作,但必须为上下文膨胀付出成本与治理代价。
更务实的做法是混合策略:以任务复杂度为路由依据,让简单请求走裸调用、复杂请求走Agent,并在Agent侧持续做上下文治理。判断的关键问题只有三个:任务是否真的需要工具与文件访问?调用频率与预算能否覆盖Agent的单次成本?团队是否具备对上下文构成的观测与调优能力?想清楚这三点,选型自然清晰。