如果你和我一样天天在 Pi Agent 里维护一堆工具你一定体会过这种崩溃为了让 Agent 正确调用一个查询工具提示词写了好几百字结果它还是偶尔抽风。工具一多提示词越写越长token 成本越来越高Agent 反而越来越不听话。直到我换了一套思路把整套工具提示词从 3200 字符砍到 290 字符调用成功率反而提高了近 10 个百分点。这篇文章就是来交代这笔账怎么算、具体怎么操作、以及给扩展作者的工具注册架构怎么改。无论你是 Pi Agent 的普通用户还是正在给 Pi Agent 写扩展的作者只要你被工具提示词这件事折磨过下面的内容都值得看完。我会先讲清楚长提示词低效的根本原因再给出可量化的削减框架最后分别从用户和扩展作者两个视角给可直接照抄的落地方案。文末还有一套实测数据和几处踩坑记录帮你判断哪些场景下省 91%完全不成立。1. 工具提示词越写越长问题真的出在写得不够多吗先说一个反直觉的结论多数工具提示词写得长不是因为信息不够而是因为噪声太多。我在 Pi Agent 里接一个汇率查询工具时最开始参考的是其他平台上分享的详细提示词模板一个工具 900 多字包含背景说明、使用场景、示例对话、调用流程、常见错误。装上去一测确实能跑通但三个星期后发现三个问题非常明显。1.1 长提示词的三个隐性成本第一个成本是 token 消耗。Pi Agent 的每次工具调用提示词都会带着工具描述一起发给模型。按 900 字一个工具算20 个工具就是 1.8 万字符每次对话请求都在为这些字符付费而其中大量内容模型根本用不上。第二个成本是约束过载。给模型提的限制条件越多模型越容易在限制之间迷失重点。比如你写如果没有找到结果就返回空字符串不要返回错误信息也不要随便给用户建议模型可能因为反复权衡这些条件而行为漂移。我可以负责任地说这类话术在实际调用中经常引发该调用时不调用、不该调用时乱调用的怪问题。第三个成本也是我最痛恨的提示词与工具真实行为脱节。工具 API 参数改了或响应格式变了提示词里对应的描述没同步改Agent 就会按旧描述去调用新接口产生大量莫名其妙的参数校验错误。工具越多这种版本漂移越难治理。1.2 我做过一次把每个工具描述删一半的实验为了验证少写点是不是更好我挑了一个叫汇率查询的工具做过对照实验。原始描述 420 字我删掉示例对话和背景说明保留 115 字只留下当用户提及汇率、外币金额换算时调用输入 from_currency, to_currency, amount 三个参数。结果很意外工具调用准确率没有下降一些之前因为条件互相打架导致的误调用反而消失了。后来我意识到模型在预训练阶段已经见过大量工具场景它不需要你教它汇率是什么、为什么需要换算。它真正缺的只有三件事这个工具在什么场景下用、参数叫什么、什么情况下不要用。这三件事之外的内容都属于模型本来就懂的噪声。这里我可以给你一个判断标准如果一句话删掉后模型调用工具的行为没有任何变化这句话就是噪声请直接删。2. 91% 到底怎么省一套可量化的提示词削减框架既然标题说省 91%就得先把账算清楚。我最终在 Pi Agent 里维护了 20 个常用工具初始提示词总量约 3200 字符优化后压到 290 字符节省率约 90.9%。这不是靠少写废话碰运气而是套了一套固定规则。下面把我用的规则完整写出来。2.1 一个可复制的计算公式先给公式后面每改一个工具都按这个算优化前字符数 T_old优化后字符数 T_new节省率 (T_old - T_new) / T_old × 100以 3200 到 290 为例(3200 - 290) / 3200 ≈ 90.9%约等于 91%。注意这里统计的是实际发给模型的工具描述字符数不是代码里写注释的字符数统计粒度要保持一致才能对比。这套字符统计我建议直接在 Pi Agent 的管理后台导出工具列表把每工具的描述字段按字符统计做个汇总。我习惯每周跑一次这个统计目的不是为了数字好看而是强迫自己审视每个工具是否有新增的冗余描述。2.2 四层提示词结构什么必须写、什么必须删我在实践中把所有工具提示词内容分成四层每次写新工具都对照清单过一遍第一层工具标识与触发条件必须写约占 20% 字符工具名称要语义自解释比如get_weather_now就比tool_001强一百倍。触发条件什么时候调用这个工具一行说清。边界条件什么时候不要调用可选但很重要。第二层参数映射与约束必须写尽量放入 schema约占 30% 字符参数名、类型、必填项、取值范围。这些信息请放进 Pi Agent 的参数 schema不要重复写进描述里后面会详细讲。第三层与模型共用知识的冗余强烈建议删约占 40% 字符工具所在领域的科普解释、使用场景故事、示例对话、语气人格设定。这些内容模型在预训练中已经了解重复写在描述里只会增加噪声。第四层条件分支与异常兜底能删就删约占 10% 字符如果 A 就返回 X如果 B 就返回 Y这种话。模型在调用工具时更依赖实际参数和错误反馈提前在提示词里写一堆分支反而会造成选择困难。我建议你把每个工具的现有描述拿出来按这四层画个表格第一周先把第三层和第四层全部删除观察一周。多数工具不会有任何负面影响但 token 消耗会降一大截。2.3 一个完整案例从 320 字压到 28 字就拿我给 Pi Agent 写的日程冲突检查工具举例。优化前的描述大概是这样的本工具用于检查用户日程表中是否存在时间冲突。日程表由用户提前创建可能存在多个日程在同一时间段重叠的情况。该工具会读取日程数据返回冲突列表。当用户询问我下午有没有空周四的会议会不会撞车帮我看看日程冲突等时应调用此工具。工具内部会使用重叠检测算法对时间区间进行两两比较。如果检测到冲突返回包含冲突事件的数组如果没有冲突返回空数组。注意当用户只是想查看日程详情而没有提及冲突时不应该调用此工具应该使用其他查询工具。一共约 200 字。我用四层结构重新写只保留真正必要的信息当用户询问日程是否冲突/重叠时调用。参数 schedule_id。若用户仅查看日程详情则不要调用。28 字。参数的类型、格式、取值范围全部移到 schema 中由 Pi Agent 运行时自动校验。结果怎样工具调用准确率从 71% 提升到 88%误调用次数明显减少。因为模型终于不用在一堆如果、当、应该里猜重心了。3. Pi Agent 用户直接照抄的四步提示词减法看完上面的原理你可能还是不知道怎么对现有工具动手。这一节给你一套完全可落地的操作顺序按着做就行。3.1 第一步按动词_名词规则重新给工具起名工具名是模型理解工具用途的第一入口却最容易被忽略。我见过太多人给工具起名叫data_check、utils_01然后试图在描述里写清楚这个工具是检查用户输入的日期格式是否合法。其实直接把工具改名为validate_date_format或者更朴素的check_date_validity模型一看到名字就能理解大半。我给 Pi Agent 工具重命名时遵循一条规则动词 名词对象。动词说明动作名词说明作用于什么比如fetch_stock_price获取股票价格send_email_draft发送邮件草稿check_disk_space检查磁盘空间parse_pdf_content解析 PDF 内容这样即使描述只有一句话模型也能通过工具名完成 80% 的理解。反过来如果工具名本身含糊你只能靠写更多描述来补偿字数和理解成本就同时上去了。3.2 第二步把描述压缩成触发条件 禁止条件两句工具描述字段我建议只保留两句话一句说何时调用一句说何时不要调用。这两句话能把模型的行为框得很准也因为简短而几乎不会产生语义干扰。示例一当用户要求创建或修改待办事项时调用。若仅是查看待办列表则调用list_todos。示例二当用户询问服务器运行状态或 CPU 使用率时调用。当用户询问业务数据报表时不要调用此工具。这里有一个我实践出来的小技巧把不要调用什么直接写在描述里比在系统提示词里写不要乱调用工具有效十倍。因为模型决策点就在工具选择的那一瞬间边界条件放在描述里恰好能命中它做选择时的上下文。3.3 第三步把参数规格放进 schema别堆进描述你在 Pi Agent 里给工具定义参数时应该能看到 schema 配置区里面有参数名、类型、是否必填、枚举值、描述等字段。很多人把参数说明也写进工具描述里比如第一个参数是 city表示城市名类型是 string比如 Beijing、Shanghai。这些都是重复信息。正确做法是把这些塞进参数 schema然后工具描述里只留一句话参数见 schema。这样模型在调用前会自行读取并校验参数格式不需要你在提示词里给它讲一遍。我在实测中发现把 12 个工具的 47 个参数说明从描述挪到 schema 后每次请求平均减少约 300 字符而参数校验类错误几乎没有增加。3.4 第四步在 Agent 级设置一条全局工具策略单个工具描述优化完之后还可以在 Agent 的系统提示词或全局设置里加一条策略把所有工具的共同行为约定放进去而不是每个工具重复写。我用的表述类似这样当存在多个工具都能满足用户需求时选择最具体、最不易产生副作用的那一个。工具调用失败时必须告知用户原始错误不得自行编造。这句话只写一次所有工具共享。如果你在每个工具描述里都写一遍失败时不要编造结果等于重复刷 token。全局策略的好处不仅是省字数还方便日后统一修改。改一次生效所有工具而不是逐个调。4. 扩展作者把每工具独写提示词改成公共模板 工具 metadata如果你是给 Pi Agent 写扩展的作者上面那套手工删字不够本质。你要在架构层面设计一套机制让新工具接入时天然就是省提示词的。我自己的扩展源码经历过一次重构核心思路是把工具提示词从自由文本改成结构化 metadata 公共模板。4.1 设计三元 metadata 结构name / trigger / schema我建议每个工具在扩展注册时提供一个三元 metadata 结构name语义化工具名必须符合动词_名词规则。trigger触发条件描述最多两句话句子里必须包含何时用、何时不用。schema参数规格严格遵循平台的 JSON Schema 标准。这就是我前面说的用户在手工操作时沉淀下来的规则扩展作者应通过代码强制化。如果每个新工具都依法炮制平台自动生成的提示词天然就是精简的使用者不需要再大改。我不建议 metadata 里放 description 或 long_description 这类自由文本字段。原因很现实扩展作者一旦有了长描述入口就总想往里面塞示例和背景故事这和我前面说的噪声来源完全一致。4.2 公共提示词模板合并策略多个工具之间通常有共享信息比如所有货币类工具都需要遵循金额格式约定所有查询类工具失败时必须返回可读错误码。如果这些信息在每个工具描述里各写一遍就是一种严重重复。我采用的模式是写一个shared_tool_policy公共模板注册工具时自动合并进每个工具的描述。合并顺序是公共策略在前工具触发条件在后参数说明完全交给 schema。这样单个工具描述变短了整体信息又没有丢。公共模板本身也要保持精简我目前长度在 60 字以内失败时返回可读错误信息。参数必须严格使用 schema 定义的类型。若用户意图不明确可先让用户确认。这段内容会合并进所有工具但因为措辞极简模型不会因为重复而行为漂移。4.3 动态上下文注入把会话变量塞进工具描述这个技巧非常有意思也是省字数的另一种角度与其把用户最新状态写在每个工具描述里不如用模板变量动态注入。比如有一个 OCR 工具描述里原本要写当前用户的默认语言是中文这样的话而用户在会话中途可能切换语言描述就过时了。我的方案是在工具注册时定义一个变量槽位比如{user_preferred_lang}平台在每次请求组装工具描述时动态渲染成当前实际值。这样描述文本本身很短但携带的是实时信息比写死一长串条件分支好用得多。动态注入还有一个好处上下文变化时工具描述自动跟着变不需要你在代码里做任何手动更新。比如用户切换了工作空间或组织相关工具描述中对应的变量随之变化模型始终看到最新状态不会产生提示词与实际上下文不一致的错误。4.4 让工具错误输出成为隐式提示词扩展作者常常忽略一个事实Pi Agent 的调用结果反馈本身也是一份提示词它在任务执行流中会回流给模型。善用这个反馈回路可以减少大量预先需要的错误处理描述。比如一个支付类工具可能在某种情况下返回insufficient_balance错误码。与其在工具描述里写一大段如果发生余额不足请告知用户充值不要重试不要建议其他支付方式不如让工具在错误输出里附带可读提示。Pi Agent 会把这段错误信息原样反馈给模型模型自然可以根据返回文本采取合适行动。这样描述字段可以干净很多错误处理能力反而更强。我在扩展设计时的原则是能放在运行时输出里的信息不放在静态提示词里。静态提示词越短长尾错误越少运行时的结构化错误码越清晰模型纠错能力越强。5. 实测对比同一组工具优化前后的差距这一节展示我在自己 Pi Agent 环境里做的对照测试数据真实可复现。测试工具集是 20 个常用工具覆盖查询、写入、计算、解析四个类型。测试时间是两周第一周用优化前配置第二周用优化后配置。中间没改工具逻辑只改了提示词与 metadata 结构。5.1 测试环境与工具集说明我用的是自建 Pi Agent 实例模型采用同一种推理配置上下文窗口固定。20 个工具包括8 个查询类天气、汇率、股票、日程、文档检索、服务器状态、数据库查询、用户信息6 个写入类创建待办、发送邮件、更新文档、修改日程、记录日志、生成报表4 个计算类日期计算、费用分摊、文本字数、数值统计2 个解析类PDF 提取、链接抓取测试采用同样的 50 条真实用户对话样本包括中文指令、混合中英文、模糊表述和明确指令四种场景。每个样本由人工标注正确工具调用路线再对比模型实际调用结果。5.2 核心测试数据一览我把两周的数据汇总成一张表直接展示优化前后的差异指标优化前优化后变化工具提示词总量字符3200290减少约 90.9%平均单次请求 token 消耗1400980下降 30%工具调用成功率人工判定正确调用78%88%提升 10 个百分点误调用次数每 100 次调用11 次4 次下降 63%人为干预/修正次数每天9 次3 次下降 67%表格里的数字让我印象最深的不是 token 消耗而是误调用次数。优化前模型经常在用户没明确要求的情况下调用工具比如用户问今天天气怎么样模型同时调了天气工具和日程工具。优化后因为触发条件只剩一句当用户询问天气时调用其他场景不要用这种串台现象大幅减少。5.3 参数校验类错误为何不升反降有人会担心描述缩短了参数信息只能靠 schema校验是不是更容易出错我的实测结果恰恰相反参数校验类错误从优化前的 18 次降到 9 次。原因其实不难理解。之前参数说明都写在描述里模型需要从长文本中提取参数名和类型提取过程本身可能出错。移到 schema 后平台在组装调用时会强制做结构化校验模型只能按 schema 的标准格式生成参数对象。无论描述多长模型都不会凭印象编参数因为它看到的是一份机器可读的规范。这也解释了为什么我建议扩展作者必须把参数写成 schema提示词是用来给模型判断决策方向的schema 才是用来给运行时做参数校验的。两者各管一摊效果最稳定。6. 哪些工具一个字都不要删省不下来的六种情况说了这么多优化方法我不能让你误以为所有工具题词都能砍掉 91%。实际工作中有六类工具的提示词一个字都不要删删了必然出问题。6.1 涉及权限与合规的工具如果工具调用前需要鉴权或者操作成功后会产生不可逆的后果比如删除数据、转账、发送消息那么权限边界、审批流程、双确认要求都必须完整写进描述。这类工具误调用的代价极高不能靠精简描述来省 token。6.2 有特殊协议约定的工具有些工具要求调用前先拉 session或者必须带上特定请求头或者说返回格式必须是某种自定义结构。如果这些约定不写清楚模型很容易按照通用 REST 习惯去猜导致一个个无意义的失败调用。我建议这类工具的描述宁可冗余也要把协议流程写完整。6.3 工具输出本身不稳定的场景当工具返回的结果没有固定结构比如 PDF 解析工具遇到扫描件、网页抓取工具遇到动态渲染页面时模型需要提前了解无结果时怎么办、超时时要不要重试。这类情况我会保留一段稳定的兜底描述不加入裁剪范围。6.4 对象识别非常模糊的场景像 OCR 图片识别、语音转写、手写文本识别这类工具用户请求可能非常模糊模型很难凭几句话决定参数。我实测里识别类工具如果描述太短模型容易把参数填错。这类工具需要保留一些判断示例来帮助模型理解调用边界每个示例控制在 20 字内。6.5 全新领域或冷启动工具如果工具涉及的领域是模型预训练中很少见到的比如某个私有行业软件的专业接口模型完全不了解其业务含义。这类工具不仅要写清楚触发条件还要把必要的业务背景和名词解释带上。但注意别写成教材只写决策所必需的最小背景。6.6 用户自定义的私有工具私有工具往往没有公开资料让模型自学所有约定都必须显式写在描述里。如果你做的扩展是给企业内部私有云服务用的建议调用失败时在错误返回里附带详细提示模型会根据返回结果自动更新对工具的理解。这类工具追求的不是最短描述而是在无人指导的情况下模型能正确尝试。这些特例并不影响 91% 这个数字的普遍参考价值。我的 20 个工具里按规则删完的占 18 个另外两个属于上述特殊情况描述基本没动。整体节省率照样拉到了 90% 以上。我现在的习惯是任何新工具上线前都拿第 2 节那张四层清单过一遍写完之后再删一轮能删多少删多少。算下来不仅 token 成本降了最明显的是 Agent 的行为稳定了调用路径不再五花八门该调哪个调哪个边界也踩得准。扩展架构改成公共模板 metadata之后新工具接入从原来的写一段长描述变成填一个 name、两句 trigger、一份 schema整个过程快很多代码也好维护了。最后给你一个动作建议今天从你现有的工具里挑一个低频工具按第 3 节的四步先删一轮跑一周看看数据变化。大多数情况下你删掉的那些万无一失的字符恰恰是 Agent 行为混乱的根源。删完你大概率回不去了。