最近跟几个做 Agent 应用的朋友聊天,发现大家不约而同地都在算一笔账:每次调用模型的 token 费用、编排框架的消耗、调试 Agent 行为花掉的时间。有个朋友特别有意思,他说自己想尽办法压缩 Prompt,把系统提示词从 2000 行砍到 300 行,token 账单确实降下来了,结果 Agent 开始频繁地理解错意图、反复调用错误的工具,最后光是排查和补偿消耗就花了两周。他说了一句让我印象特别深的话:压缩 Prompt 省的是小钱,让 Agent 少踩坑才是真正的大钱。
这个观察其实挺准的。很多团队优化 Agent 成本时,第一反应就是盯着 token 单价,把所有精力都放在“怎么让 Prompt 更短、更省 token”上。但真实情况是,Agent 在生产环境里跑起来之后,钱的去向远不止 Prompt 那点 token。模型调用失败要重试,重试要花钱;工具调用错了要纠正,纠正要重新请求;上下文里塞满了错误日志和冗余信息,后续每次调用都在为前面的错误买单。更不用说开发人员盯着日志一行行排查 Agent 为什么绕圈子的时间成本,那个才是真金白银。
这篇文章我想聊的,就是“让 Agent 少踩坑”这套思路。它不是让你不压缩 Prompt,而是告诉你压缩 Prompt 只是省钱的一个小维度,真正能大幅降低成本的关键,在于从系统设计层面减少 Agent 的无效行为。我会结合一个模拟项目 X 的改造过程,把 Agent 踩坑的成本构成、常见坑点、以及怎么用工程手段让 Agent 变“乖”的具体做法,完整地拆开讲一遍。不管你是刚接触 Agent 开发,还是已经在生产环境里维护着这类系统,这篇内容应该都能给你一些可以直接拿来用的思路。
1. 先把账算清楚:Agent 的“隐性成本”到底花在哪
先说一个很多人没意识到的问题:Agent 的成本不是“一次对话多少钱”,而是一个叠加了重试、失败、纠错、上下文膨胀的综合开销。你以为你在为一个任务付一次费,实际上你可能在为同一个任务付三到五次费。
1.1 Token 账单只是账面成本,真正的开销在调用链路上
假设你有一个简单的客服 Agent,用户问“我的订单什么时候到”。如果一切顺利,Agent 识别意图、调用订单查询工具、返回结果,可能一次模型调用就够了。但现实里常常出现这种情况:Agent 先是把“订单查询”理解成了“物流说明”,调错了工具;模型收到工具返回的错误后,开始重新推理;推理过程可能又产生一次新的工具调用,因为上下文里多了错误信息,Agent 的注意力被分散了,下一步动作又偏了。
我算过一笔类似的账。一次正常的任务,平均消耗可能 1000 到 2000 token。但一次带着错误重试的任务,考虑到额外的推理和上下文累积,通常会消耗 3000 到 5000 token,而且失败率越高的环节,后续调用反而越贵。原因很简单:错误一多,上下文里的无效信息就多,模型需要更大的注意力窗口去分辨哪些信息有用,这直接反映在输出 token 数量和推理稳定性上。换句话说,一次失败带来的成本不是单次调用的成本,而是后续所有关联调用被污染后的累计成本。
所以当你想要优化 Agent 费用时,第一步应该做的不是压缩 Prompt,而是先观察调用链路:有多少调用是第一次就成功的?有多少调用是在重复尝试同一个操作?有多少调用是在“解释错误”?这些数据比 Prompt 字数更能反映真实的成本健康度。
1.2 重试、死循环和超时是成本放大的三个放大器
我在维护 Agent 系统时总结过三种典型的成本放大场景。
第一种是重试风暴。某个下游工具不稳定,偶尔返回超时。Agent 察觉不到这是临时故障,它会认为是自己工具参数不对,于是换个参数继续调。等工具恢复的时候,Agent 可能已经调了五六次,账单上凭空多出一大截。
第二种是行为死循环。Agent 从一个工具跳到另一个工具,发现结果都不满意,然后跳回第一步重新开始。这种循环在长任务场景里特别常见,Agent 像是在原地打转,每次都产生新的 token 消耗,却始终没有产出有效结果。更麻烦的是,这种死循环很难通过日志直接看出来,因为每步调用都合法,只是整体上在做无用功。
第三种是超时补偿。模型层超时后,系统自动重发一次请求。有些重发策略没有做幂等处理,好一点的多花一次钱,糟糕的还会产生重复操作,比如创建订单、发送通知这些非幂等的动作,后果远不止成本问题。
这三种放大效应叠加起来,会让一个名义上单价很低的模型,在实际运营里跑出远超预期的账单。单纯压缩 Prompt 对解决这些问题几乎毫无帮助,因为问题根源不在提示词长度,而在 Agent 的行为控制逻辑。
1.3 时间成本:最容易被忽略的大头
除了模型调用费,还有一笔更大的隐性成本:人。一个 Agent 在生产环境里表现不稳定时,开发人员需要花大量时间去看 trace、复现问题、调整 Prompt、重新验证效果。每次调整 Prompt 后还要经历一轮回归测试,确保之前好的场景没有被改坏。
我用过一个很笨但很真实的方法来统计这个成本:给开发团队记录每次 Agent 行为异常的排查耗时。结果发现,平均下来一次问题从发现到定位到修复,差不多要花掉一个工程师半天到一天的时间。如果一周出现十次问题,那就是两周的人力被吃掉。这两周值多少钱,大家心里都有数。
这么一算你就明白了:Agent 省钱的真功夫,不在怎么省 token,而在怎么让系统不犯错、少犯错,把那些隐性的重试成本和人力成本压下去。这才是“比压缩 Prompt 更省钱”这句话的实质含义。
2. 为什么“压缩 Prompt”解决不了根本问题
不是说压缩 Prompt 不对,而是它解决的问题边界非常有限。如果你把压缩 Prompt 当作优化 Agent 成本的核心手段,大概率会陷入顾此失彼的境地。
2.1 压缩降的是单价,不改变系统的“出错率”
压缩 Prompt 的核心逻辑很简单:减少输入 token 数,每次调用的费用就降下来了。这在直接调用模型的 API 场景里非常有效,因为模型本身没有复杂的工具调用链路,Prompt 短一点、输出稳一点,单价就降下来了。
但 Agent 不一样。Agent 是一个包含模型、工具、编排逻辑、状态管理的完整系统。系统里最贵的部分往往不是模型正常工作的那一次调用,而是模型出错后的连带反应。比如说系统提示词原本有 800 行,你把里面的冗余说明删掉,压缩成 300 行。单次调用确实省了 500 行的 token 钱,但如果这个压缩让 Agent 对某个边界规则的理解产生了歧义,导致它错误地调用了一个数据分析工具去处理用户投诉问题。这一个错误调用产生的后续代价,可能一万行 token 都补不回来。
我在模拟项目 X 中验证过这个现象。压缩前 Agent 对“退款”和“退货”两个流程的边界很清晰,压缩后由于删掉了一些示例,Agent 开始频繁混淆这两个流程,导致用户被引导到错误的处理路径。每次错误处理平均多出四次模型调用,成本反而上升了。后来把示例加了回来,直接调用成本高了一点,但整体系统成本降到原来的六成。
2.2 过度压缩会制造新的语义歧义
Prompt 的本质是给模型传递指令和背景信息。压缩到极致时,很多信息会被简化为关键词或缩写,模型的“理解”就会变得不确定。不是一个系统里所有逻辑都能用一句话说清楚的。特别是那些涉及多步骤、多条件判断的场景,缺少足够示例和约束说明,模型很容易在边界条件下做出令人意外的决策。
我见过一个团队把系统提示词压缩到只剩功能清单,每个工具一句描述。结果 Agent 在“用户要求加急配送”的场景下,把“加急”理解成了“重新下单”,差点产生一笔重复订单。后来翻日志才发现,原版 Prompt 里有一句“加急不是新订单,只能修改原订单的物流属性”,压缩时被当作冗余删掉了。为了省几十个 token,差点引发一次线上事故。
所以压缩 Prompt 的正确姿势,不是追求最短,而是追求最小有效。凡是对模型决策有约束作用的内容,都不能轻易砍。可以砍的是那些背景介绍、重复强调、冗余格式说明。判断标准只有一个:删除后会不会改变 Agent 在边界场景的行为。如果你不确定,那就别删。
2.3 省下来的 token 钱,总会在别的地方加倍花出去
压缩 Prompt 之后,由于语义歧义增加,Agent 需要更多轮次的推理来理解任务。推理轮次一多,上下文里累积的历史变长,后续每次调用的 token 数反而会增加。这就是我前面提到的“上下文膨胀”:为了省一点肉眼可见的 input token,你在不知不觉中增加了大量 output token 和 context token。
在模拟项目 X 中,我侧过一个具体数据:压缩前完成任务的平均总 token 消耗是 4200 左右,压缩后首轮调用降到 3000,但由于经常需要多一轮澄清,整体平均消耗跑到 4800。也就是说,表面上看单次调用便宜了 28%,实际上整个任务的成本涨了 14%。这个现象不亲自跑数据,很难靠猜发现。
这也解释了为什么很多团队在压缩 Prompt 后感觉“效果变差了”,但又说不清差在哪。其实不是模型变笨了,而是系统的容错空间变窄了。之前有冗余信息兜底,模型遇到模糊问题时还能从上下文里找到蛛丝马迹;现在信息少了,模型只能凭“直觉”猜,猜错了,后续流程就跟着错。
3. 让 Agent 少踩坑的四个先手设计
既然成本的核心在“踩坑”,那真正省钱的做法就是主动减少踩坑的概率。根据我的实操经验,有四类设计能起到立竿见影的效果,而且都不需要你花太多额外的开发成本,更多是把思路从“写一个强大 Prompt”转向“设计一个稳定的系统”。
3.1 任务边界划分:别让一个 Agent 干所有事
我见过太多团队试图用一个 Agent 解决所有问题。用户来咨询订单、咨询退款、咨询优惠券、咨询人工客服,全部塞进同一个系统提示词里。这么做在 Demo 阶段没问题,一旦进入生产环境,各种业务规则交织,Agent 很快就会露出疲态。它会为了一个简单问题调用一堆无关工具,或者在两个业务域的边界处犯迷糊。
更好的做法是任务边界前置。在主 Agent 前面加一层轻量级路由,先判断用户的问题属于哪个域,再把请求分发给对应的专用 Agent。每个 Agent 只处理自己域内的任务,Prompt 可以写得特别聚焦,行为也会稳定很多。我从这个角度改造模拟项目 X 后,效果非常直接:那些跨域混淆导致的错误调用,几乎消失了。
路由层的 Prompt 不用长,几百个 token 就够,只需要说明“你是分类器,根据用户问题输出一个类别标签”。任务边界划分的核心价值,是让每个 Agent 的决策空间足够小,小到模型不容易犯错。
3.2 状态机驱动:把 Agent 的行为路径显式化
很多 Agent 系统出现死循环和重复调用,根本原因是行为路径不明确。模型在每一轮都在自由发挥,它不知道“当前处于哪个阶段”,也不知道“这个阶段允许调用哪些工具”。一旦失去约束,就容易在多条路径之间来回试探。
一个有效的解决办法是引入显式的状态机。你定义好 Agent 可能处于的所有状态,例如“待确认用户意图”“查询中”“结果确认中”“已完结”,然后为每个状态配置允许执行的动作集。模型只能在当前状态对应的动作里做选择,不能跳到不该执行的步骤。这样即使模型发挥不稳定,系统的行为主路径依然可控。
这种设计对成本的改善非常明显。原来 Agent 经常会“试图跳过用户体验直接给出结论”,或者“查询完结果后不进入汇总状态,又回去查一次”。加了状态机约束之后,这两类情况基本被堵死了。模型只能在状态允许的范围内行动,状态不允许的就直接拒绝。这相当于给 Agent 装了一组轨道,它可以在轨道上灵活跑,但不能脱轨。
3.3 工具接口的防御式设计:让 Agent 不那么容易犯错
很多 Agent 踩坑,问题并不出在模型,而出在工具接口设计得太随意。比如说,某个查询工具要求传入日期参数,但接口没有做格式校验。Agent 传了一个“昨天”或者“2025/01/01”这样的非标准格式,工具报错,Agent 被迫进入纠错流程。几次反复之后,token 成本就上去了。
防御式工具接口的核心思路是:工具越能容忍输入偏差,Agent 出错越少。最直接的做法是在工具入口做参数标准化。Agent 传日期时,不管它给的是“今天”“明天”还是“2025年1月1日”,工具内部都统一转成标准格式。或者在接口层提供枚举值校验,Agent 传错时,返回的结果不是简单报错,而是提示“该参数可选值为 A、B、C,你传的值 D 不在范围内,请重新选择”。这种提示信息能帮助模型快速纠正行为,而不是陷入长时间自我怀疑。
这种设计还有另一个好处:前模型只需要知道工具能干什么,不需要记住工具内部的一堆参数规则,Prompt 可以做得更简单,token 自然也就降下来了。好的工具接口能有效降低模型调用的难度,而模型调用难度直接影响了它产生的无效 token 数量。
3.4 结果校验:把模型的“自信”当参考而非结论
Agent 经常犯一个毛病:它调用工具拿到结果后,会用自己的“理解”去转述这个结果,有时候会转述错。比如工具返回“物流状态异常,请联系承运商”,Agent 给用户的回答却是“您的物流已送达,请耐心等待”。这种幻觉式转述在模拟项目 X 里遇到过好几次,每次都需要人工介入纠正,成本很高。
要解决这个问题,最稳妥的做法是对关键结果做结构化校验。工具返回的数据先经过一层校验逻辑,如果结果为非正常状态,系统直接使用模板给出回复,不允许模型自由发挥。这个“模板兜底”策略适用于那些结果格式固定、不容出错的场景。
道理跟人一样:模型不擅长精确复述数据,但擅长总结与表达。所以凡是精确信息,就交给代码处理,用模板;凡是开放性的表达,才交给模型自由生成。这样既保留了模型的灵活性,又避免了它在关键信息上的幻觉,成本自然可控。
4. 实操层面怎么落地:一个模拟项目 X 的改造全过程
前面讲了很多思路,听起来可能有点抽象。这节我拆一个实际项目,完整走一遍从“Agent 频繁踩坑”到“成本下降一半以上”的改造流程。为了不涉及具体业务信息,我把项目叫作模拟项目 X,业务流程是“用户咨询→查询库存→给出购买建议”,很典型的一个电商导购类 Agent。
4.1 原系统的运行情况:为什么会花冤枉钱
改造前的模拟项目 X 是典型的单 Agent 结构。系统提示词一千多行,里面写了用户意图识别、库存查询、推荐话术、异常处理、闲聊兜底等一大堆内容。模型面对用户问题时,可以直接调用“库存查询”和“历史订单查询”两个工具。
我们拉取七天的运行数据,发现了一些很扎心的数字:总调用次数两千次,其中第一次调用就正确完成的只有四成;剩下六成里有的是工具传参错误,有的是意图判断偏了,有的是拿到结果后表达阶段幻觉。平均每次任务的 token 消耗高达五千多,比理论预估值高了两倍半。
最棘手的问题有两个。一个是库存查询工具的参数非常死板,必须传精确的商品编码,用户说“那款蓝色耳机”系统完全提取不了,Agent 只能猜一个编码,猜错后工具报错,Agent 再换一个编码继续试。在热门商品上,这种猜编码的行为经常反复三到四次,非常费钱。另一个是推荐话术的自由度太高,Agent 经常基于库存数据自己编理由,给用户推荐的尺码和库存对不上,引发用户投诉后发现推荐并非基于真实库存。
4.2 第一步:加一层意图路由,把单 Agent 拆成多域
改造的第一个动作,是加了一个前置路由层。用户消息先进入一个负责分类的模型调用,输出结果是三个类别之一:商品咨询、订单咨询、其他闲聊。商品咨询进商品 Agent,订单咨询进订单 Agent,闲聊进一个轻量对话 Agent,不需要调用太多工具。
这一步的作用立竿见影。原本商品咨询和订单咨询的规则都在同一个上下文里,模型有时会拿着商品库存规则去回答订单时效问题,或者相反。拆开之后,各 Agent 的 Prompt 大幅缩短,不再需要保留其他域的规则说明,决策空间窄了,行为稳定度明显提升。
路由层本身成本很低。它只接受用户第一句话作为输入,输出一个类别标签,token 消耗不到一百个。但它能防止后面所有环节的消息错位,相当于在入口处拦下一次大坑。
4.3 第二步:给工具调用加“参数理解”中间层
原系统里“库存查询”要求传精确商品编码,这个设计对 Agent 太不友好。改造后,我在模型和库存工具之间加了一个“查询意图翻译层”:Agent 只需要输出用户想找的商品特征,比如“蓝色无线耳机”“iPhone 充电线”,翻译层先把这种自然语言描述转成标准商品编码,再去调库存工具。
这一步正确匹配率从原来的百分之六十提升到百分之九十五以上。最重要的是,匹配失败时,系统不再返回一个冷冰冰的报错,而是返回一组候选商品让 Agent 选择确认。这样即使模型一开始没理解对,后续纠错也只需要一轮,而不会陷入反复猜编码的循环。
token 成本在这一步有了明显下降。原来一次“猜编码—报错—再猜”的循环至少耗掉八百到一千 token,现在正常情况下一次查询只要两百 token 左右。而且用户体感也变好了,不会再说一句话之后被质问“请问您说的是哪个编码”。
4.4 第三步:调整推荐结果生成逻辑,模板兜底
第三步处理“推荐话术”的问题。原系统让 Agent 基于库存结果自由生成推荐文案,结果它经常帮用户推荐一个库存为零的商品。改造后,系统把库存结果先做了一层结构化筛选:库存为零的不进入推荐候选池,只剩两三个正常和优先推荐的商品,然后由代码生成一份标准话术骨架,模型只负责在这个骨架上做润色表达。
这么做相当于把 AI 的发挥空间限制在了“发挥文字能力”的范围内,而不是让它去主观决定推荐哪个商品。推荐准确性大幅提升,同时因为话术骨架固定了核心逻辑,模型的输出 token 数也跟着减少,属于既降成本又提质的一举两得。
4.5 改造后的效果与成本对比
整个改造持续了大概两周,主要是调路由准确率和工具翻译层的匹配逻辑。改造后跑同一批测试集,数据对比很明显:
| 指标 | 改造前 | 改造后 |
|---|---|---|
| 首次调用成功占比 | 约 40% | 约 78% |
| 平均每次任务 token 消耗 | 5200 | 3100 |
| 单任务平均调用次数 | 5.2 | 2.8 |
| 异常任务比例 | 18% | 4% |
| 需要人工介入的事件占比 | 7% | 1.2% |
成本不是线性下降,是接近腰斩。而且节省的大头不是 Prompt 压缩带来的单价下降,而是调用次数减少、失败后纠错链路缩短带来的。后续这一个月里,我们把类似的改造思路复制到了模拟项目 X 的另外几个子任务上,整体成本又往下压了一截。
5. 成本观测与预警:钱要花在明处
改造完系统之后,还有一个环节不能漏:可观测性。如果你不知道钱花在哪里,就很难持续优化。这里我分享几个我一直在用的观测维度。
5.1 追踪每次调用的“真实成本”,而不是只看 token 量
很多平台只提供 token 用量统计,但真正能驱动优化的是“每次任务的完成路径成本”。我会为每个 Agent 任务生成一个 ID,把一次任务相关的所有模型调用、工具调用都串起来,统计这个任务花了多少 token、调了多少次工具、是否一次成功。
有了这个数据之后,就能识别出哪些类型的任务最“烧钱”。我在模拟项目 X 中发现,“商品咨询”类任务的平均成本远低于“订单咨询”,因为订单咨询涉及多步状态确认,模型在每一轮都要重新审视上下文。后来把订单咨询的流程显式化了,每一轮固定只处理一个子问题,成本立刻降下来了。
如果只看全局 token 量,完全发现不了这种差异。只有拆到单任务粒度,才能精准定位浪费点。建议所有 Agent 项目,从第一天就按任务维度记录成本和成功状态。这个习惯越早建立,后面优化越主动。
5.2 失败成本的标签化统计,定位“重灾区”
光知道平均成本还不够,得知道失败任务里哪个环节最费钱。我一般会给失败任务打标签,比如“工具参数错误”“意图识别错误”“上下文长度超限”“输出格式不符合校验”。每周统计一次标签分布,就能看清问题集中在哪。
模拟项目 X 在改造前,失败标签里占比最高的是“工具参数错误”,占了七成。这意味着优化重点应该放在工具层,而不是 Prompt 上。后来加了参数翻译层之后,这个标签的比例降到两成。这个数据指引了我们的优先级,避免了一上来就乱调 Prompt 的盲目。
失败成本标签化的另一个好处是,它能指导你判断当前是不是应该换模型或换框架。如果标签以“上下文长度超限”为主,可能是模型窗口选小了;如果以“意图识别错误”为主,可能是分类模型能力不够。数据会告诉你真相,而不是靠直觉猜。
5.3 预算看板与熔断策略:别等到账单出来才后悔
最后说说告警。Agent 应用最大的风险之一就是费用失控。一个无意的死循环,可能在凌晨没人的时候跑出几千次调用,第二天早上看到账单才傻眼。要避免这种状况,就得做实时看板和熔断。
我给模拟项目 X 配了三道防线。第一道是单任务 token 上限,一个任务累计 token 超过设定值时,强行终止并标记为异常;第二道是单小时调用量突变告警,如果比历史均值高出三倍,立刻通知值班;第三道是月度预算预警,当本月费用达到预算的八成时,自动降级部分非核心 Agent 为人工处理兜底。
这三道防线没有影响正常用户的使用体验,但有效控制了异常支出发散。用一句话概括:Agent 优化省钱的前提,是永远让成本处于可观测、可控的状态,而不是放任系统去猜测飞翔。
6. 常见问题与排查技巧实录
最后整理几个我在实际运维中高频遇到的问题和对应的排查思路。这些都是压过坑之后总结出来的,可以直接当排查手册用。
6.1 模型老是重复调用同一个工具,停不下来
出现这个问题,优先检查工具返回的信息是不是“有效且语义清晰”的。如果工具返回的是一大段原始数据,模型可能没法从中判断出“已经拿到了想要的信息”,于是觉得还要再查一次。解决办法是在工具返回信息里加一个结论字段,明确告诉模型结果是什么、是否可以进入下一步。另外一个常见原因是工具没有做幂等处理,模型反复调用同一个工具,可能是它收到的反馈前后不一致。这个时候查一下工具的返回是否稳定,如果偶发空值,模型很可能误判为失败,从而重试。
6.2 工具明明调用成功了,Agent 却还要继续试探
这类问题的根源通常在工具结果的“表达方式”。模型需要的信息是结构化的、简单直接的结论。如果工具返回一个很长的 JSON 或一份表格,模型需要花更多推理成本去理解。理解到了还好,理解不到,它就会继续从其他地方凑信息。我一般建议在工具返回里直接给出一句人话结论,比如“库存充足,建议推荐蓝色款”,模型拿到这句话,基本一步就能完成。这是把复杂信息提前消化掉,留给模型的只是最简单的判断动作。
6.3 上下文越来越长,费用不受控
这个问题几乎每个 Agent 项目都会遇到。常见原因是把太多的对话历史、工具结果、中间推理全塞进上下文了。解决办法是做好上下文管理:每轮只保留与当前任务相关的关键信息,历史对话按需压缩成摘要,工具结果只保留最近一次的结果和结论。不要指望模型自己会忽略无关信息,它对所有输入都会给予一定权重。无关信息越多,行为越不稳定,费用也越高。上下文管理的本质,就是帮助模型专注于跟当前决策相关的小部分信息,而不是在噪声里费力寻找。
6.4 压缩 Prompt 后效果时好时坏
如果你压缩 Prompt 之后,效果出现波动,多半不是模型变了,而是某部分被压缩的内容里,藏着对决策有约束作用的隐性规则。排查方法很简单:把新旧 Prompt 做一个逐行对比,分别跑一组覆盖各种边界场景的测试集,找出哪些场景下新 Prompt 的行为出现偏差,再把偏差对应的 Prompt 片段加回去。这比我经常遇到的“一把梭式压缩”可靠得多。真正合格的 Prompt 优化,应当在压完之后做回归验证,而不是看单次调用的 token 数顺眼就完事。
这套思路里最核心的一件事,是把 Agent 当作一个分布式系统来看待,而不是当作一个“升级版的问答接口”。分布式系统里出错了,你会去查服务状态、查链路追踪、查依赖边界,Agent 系统也应该这样:维护它的运行状态,约束它的行为边界,观测它的失败模式。我在实际项目中得到的体会是,省钱的最高境界不是把每一项成本都压到最低,而是让整个系统少做无用功。当一个 Agent 调用路径清晰、边界明确、失败可控时,它的费用单自然就会变得好看,这比在 Prompt 上抠几百个 token 要管用得多。