粮草机器人 Hermes Skill Runtime 架构拆解:三层加载如何压住 Agent 上下文成本
大模型Agent落地的核心痛点从来不是大模型本身,而是上下文成本失控:随便挂载十几个技能,Agent的System Prompt就膨胀到几万Token,每次调用都要花几块钱,性能还慢到没法用。字节跳动开源的Hermes Skill Runtime,靠一套三层分层加载架构,直接把Agent的平均上下文Token占用压到传统方案的1/10以内,完美解决了多技能Agent的成本爆炸问题。
一、先搞懂传统Agent技能加载的致命痛点
现在绝大多数Agent框架用的都是"全量加载"模式:Agent启动的时候,把所有技能的描述、参数、示例代码全部塞进System Prompt里,不管当前任务用不用得到,全部堆进上下文。
这种模式下,挂载20个技能,上下文Token直接破万;挂载50个技能,Token数能冲到3万以上,不仅每次调用的Token成本飙升,大模型还很容易在一堆技能里迷路,出现选不对工具、乱调用技能的问题,完全没法落地到生产环境。Hermes Skill Runtime的三层加载架构,就是专门为了干掉这个痛点设计的。
二、三层加载架构核心拆解
Hermes的核心思路是技能分层可见、按需加载,把所有技能的信息拆成"索引层-描述层-执行层"三个完全隔离的层级,只有当前任务可能用到的部分,才会被加载进上下文,从根源上避免全量信息占用Token。
第一层:轻量技能索引层(常驻上下文,Token占比<5%)
这一层是唯一常驻Agent上下文的部分,不会随便卸载。它不会存任何技能的详细用法、参数说明,只给每个技能生成一个几十字的极简索引标签,包含技能名称、1句话核心能力描述、3个最核心的适用场景关键词。
比如"文件读取"技能,索引层里只会存:[技能ID:001, 名称:read_file, 能力:读取本地文件内容, 关键词:文件、读取、本地路径],几十个技能的全部索引加起来,总Token数也不会超过500,只占整个上下文的不到5%,完全不会出现膨胀问题。
这一层的作用就是让大模型快速判断:当前用户的问题大概需要用到哪几个技能,不用在一堆详细说明里翻找。
第二层:动态描述加载层(按需注入,用完即卸载)
当大模型通过索引层判断出当前任务可能需要用到某几个技能时,Hermes Runtime才会把这几个技能的完整描述、参数定义、调用示例,从本地技能库里动态加载出来,临时注入当前会话的上下文里。
比如用户说"帮我读取桌面上的Excel文件,统计里面的销售额",大模型从索引层匹配到read_file和excel_stat两个技能,Runtime才会把这两个技能的完整参数说明、调用格式临时加进上下文,其他几十和当前任务无关的技能,全程不会出现在上下文里。
任务执行完成之后,这部分临时注入的技能描述会立刻从上下文中卸载,不会残留占用后续会话的Token,从机制上避免了无关信息堆积。
第三层:执行层本地沙箱隔离(完全不进上下文)
所有技能的实际执行逻辑、代码片段、依赖库,全部放在本地的隔离沙箱里运行,完全不会进入大模型的上下文。
传统Agent框架会把技能的示例代码、执行逻辑全部塞进Prompt里,让大模型生成调用代码,这部分经常占掉几千Token。而Hermes的执行层里,每个技能都是提前封装好的可执行单元,大模型只需要输出技能ID和参数,Runtime直接在本地沙箱里调用对应的技能执行,完全不用把代码逻辑、依赖说明传给大模型,这部分直接砍掉了80%以上的冗余Token占用。
而且沙箱隔离还能避免大模型生成恶意代码执行,从安全层面也做了一层防护。
三、压低成本的核心配套机制
除了三层分层加载,Hermes Runtime还做了两个关键优化,进一步把上下文成本压到最低:
技能热度淘汰机制:Runtime会自动统计每个技能的调用频率,把高频常用技能的索引权重调高,放在索引层最靠前的位置,低频冷门技能的索引甚至可以临时移出常驻上下文,需要的时候再从远端技能库拉取,进一步压缩常驻Token的体积。
上下文碎片自动清理:每次技能执行完成之后,Runtime会自动把技能调用过程中产生的冗余中间信息清理掉,只保留最终的执行结果,不会让无效的中间日志占用后续会话的上下文窗口,避免长会话的上下文成本持续膨胀。
四、生产环境落地效果
这套架构在字节内部大规模落地之后,拿到的数据非常亮眼:
挂载100+技能的Agent,平均单次调用的上下文Token数从传统方案的25000+,直接降到了2000以内,Token成本直接降低90%。
大模型选对技能的准确率从传统全量加载的65%,提升到了92%,因为上下文里没有大量无关技能的干扰,大模型不会再出现乱选工具的问题。
长会话场景下,连续交互20轮,上下文Token的增长速度只有传统方案的1/8,完全不会出现跑几轮就超出上下文窗口的问题。
Hermes Skill Runtime的三层加载架构,本质上是跳出了"把所有东西都塞给大模型"的传统Agent思路,用分层隔离的思路把大模型的上下文当成稀缺资源来精细化运营,这也是现在多技能Agent从Demo走向大规模生产落地的核心思路。
需要我给你一份三层加载架构的最简可运行Demo代码,用Python就能快速搭出一个轻量版的分层技能加载器吗?