当前位置: 首页 > news >正文

Curator 如何判断技能「有用」与「该淘汰」?小白程序员必看!

本文深入解析了 Hermes 框架中技能溯源与使用追踪系统,阐述 Curator 如何通过遥测数据而非文件系统判断技能有效性。文章介绍了技能分类、显式标记机制、三类计数器设计以及原子写策略,并分析了 Curator 的决策流程和常见坑。对于想要了解大模型技能管理机制的小白和程序员,本文提供了实用的技术细节和优化建议。

Curator 怎么判断一个技能「有用」还是「该淘汰」?它靠什么信号做决策?

答案就在今天这篇。

很多 Agent 框架写技能、用技能,但从不记录「谁用过、用了多少次、最后一次用是什么时候」。结果 Curator 看着一堆技能,完全不知道哪些在工作、哪些已经是僵尸——只能盲猜,要么什么都不动,要么误删有用的。

这个坑的根源是:把技能当静态文件,忘了它们是活的资产。

Hermes 的解法是一套完整的技能溯源 + 使用追踪系统:每个 Agent 创建的技能从诞生起就被打上「溯源标签」,每一次被查看、被使用、被修改都会更新遥测计数器,Curator 靠这些信号做出准确的留/删决策。今天从源码层逐层解剖这套系统。


01 为什么不能靠「文件存在」推断技能是否有用

先想一个场景:你的~/.hermes/skills/目录里有 50 个技能文件夹。Curator 该怎么判断哪些该留、哪些该删?

最朴素的想法:按时间戳排序,超过 30 天没改动的归档掉。

但这个方法至少有三个致命问题:

问题一:创建时间不等于最后活跃时间。 一个技能在 3 个月前写好,但每天都在用——按时间戳会误删。

问题二:bundled 技能和 agent 创建的技能长一模一样。 如果靠文件系统推断,你不知道这个技能是官方出厂的还是 Agent 昨天写的。官方技能不能动,Agent 写的才是 Curator 的管辖范围。

问题三:「从没用过」和「刚创建」在文件系统上没有区别。 一个 2 分钟前生成的技能和一个「已创建 90 天但从没被调用过」的僵尸技能,文件目录结构完全相同。

Hermes 的设计结论:不能靠文件系统推断使用状态,必须有独立的遥测数据层。


02 溯源系统:三类技能,两道防线

Hermes 把所有技能分成三类,只有第三类才是 Curator 的管辖范围:

技能类型来源Curator 能动它吗标记位置
Bundled 技能随 Hermes 出厂❌ 绝对不能.bundled_manifest
Hub 安装技能用户通过 Skills Hub 安装❌ 绝对不能.hub/lock.json
Agent 创建技能skill_manage(action="create")✅ 才能管辖.usage.jsoncreated_by="agent"

两道防线取并集,只要命中任一防线就排除在外:

# tools/skill_usage.py — 两道防线合并判断 def is_agent_created(skill_name: str) -> bool: """两道防线取并集:既不是 bundled 也不是 hub 安装的才是 agent 创建的""" off_limits = _read_bundled_manifest_names() | _read_hub_installed_names() return skill_name not in off_limits # 第一道防线:读取 .bundled_manifest(格式:name:hash 每行一条) def _read_bundled_manifest_names() -> Set[str]: manifest = _skills_dir() / ".bundled_manifest" if not manifest.exists(): return set() return {line.split(":", 1)[0].strip() for line in manifest.read_text().splitlines() if line.strip()}

关键 opt-in 设计:即使是 Agent 创建的技能,如果没有在.usage.json里写过created_by = "agent",也不会进入 Curator 管辖范围。这个「显式标记」设计防止了手动写的技能被误删:

def _is_curator_managed_record(record: Any) -> bool: if not isinstance(record, dict): return False # 必须显式标记,不靠文件系统推断 return record.get("created_by") == "agent" or record.get("agent_created") is True def mark_agent_created(skill_name: str) -> None: """skill_manage(action='create') 自动调用,将技能纳入 Curator 管辖""" def _apply(rec: Dict[str, Any]) -> None: rec["created_by"] = "agent" _mutate(skill_name, _apply)


03 使用遥测:sidecar 设计,三类计数器

Hermes 用一个叫.usage.json的旁路文件(sidecar)记录所有使用数据,而不是写进 SKILL.md 本身。

为什么 sidecar 而不是 frontmatter?

方案优点缺点
写入 SKILL.md frontmatter数据和技能在一起,直观污染用户内容;bundled 技能 git pull 会冲突;频繁写导致 git diff 噪音
独立 sidecar.usage.json不污染技能内容;原子写;独立读写数据和内容分离,需要两次文件操作

每个技能的 usage record 结构——每个字段都有精确语义:

# tools/skill_usage.py — usage record 完整结构 def _empty_record() -> Dict[str, Any]: return { "created_by": None, # "agent" → Curator 管辖 "use_count": 0, # 被加载进 prompt path 的次数(硬信号) "view_count": 0, # skill_view() 查看次数(软信号) "last_used_at": None, # ISO8601 时间戳 "last_viewed_at": None, "patch_count": 0, # 被 skill_manage patch/edit 修改次数 "last_patched_at": None, "created_at": _now_iso(), # 创建时间(仅用作兜底 anchor) "state": STATE_ACTIVE, # active / stale / archived "pinned": False, # True → 绕过所有自动状态迁移 "archived_at": None, }

三类计数器各自对应不同触发点:

# bump_use:技能真正被 Agent 执行时触发,这是最重要的信号 def bump_use(skill_name: str) -> None: def _apply(rec): rec["use_count"] = int(rec.get("use_count") or 0) + 1 rec["last_used_at"] = _now_iso() _mutate(skill_name, _apply) # bump_view:skill_view() 查看时触发,查看 ≠ 使用 def bump_view(skill_name: str) -> None: def _apply(rec): rec["view_count"] = int(rec.get("view_count") or 0) + 1 rec["last_viewed_at"] = _now_iso() _mutate(skill_name, _apply) # bump_patch:技能内容被修改时触发,代表维护活跃度 def bump_patch(skill_name: str) -> None: def _apply(rec): rec["patch_count"] = int(rec.get("patch_count") or 0) + 1 rec["last_patched_at"] = _now_iso() _mutate(skill_name, _apply)

最关键的细节:latest_activity_at()函数故意排除了created_at

def latest_activity_at(record: Dict[str, Any]) -> Optional[str]: """返回最新真实活动时间——三维时间取最大,刻意不含 created_at""" latest_dt, latest_raw = None, None for key in ("last_used_at", "last_viewed_at", "last_patched_at"): raw = record.get(key) dt = _parse_iso_timestamp(raw) if dt and (latest_dt is None or dt > latest_dt): latest_dt, latest_raw = dt, str(raw) return latest_raw # 返回 None 意味着:从未被使用/查看/修改过 # Curator 遇到 None 时,以 created_at 为 stale 计时起点

这个设计防止了一个反直觉的 bug:刚创建的技能created_at是「今天」,如果拿created_at做活跃判断,它会被当作「今天活跃」——但实际上它从来没被用过。排除created_at之后,latest_activity_at = None就精确地表达了「从未真正活跃过」。


04 原子写:sidecar 的并发安全

.usage.json是多进程共享文件——主对话 Agent、后台 Curator、CLI 命令可能同时读写。Hermes 用两层机制保证安全:

层一:文件锁(Unixfcntl/ Windowsmsvcrt),序列化跨进程读-改-写;
层二:tempfile + os.replace,保证写入要么完整要么不发生,不会出现半写状态。

# 两层并发安全:先加锁再原子替换 @contextmanager def _usage_file_lock(): lock_path = _usage_file().with_suffix(".json.lock") fd = open(lock_path, "a+", encoding="utf-8") try: fcntl.flock(fd, fcntl.LOCK_EX) # 排他锁,其他进程阻塞等待 yield finally: fcntl.flock(fd, fcntl.LOCK_UN) # 释放锁 fd.close() def save_usage(data: Dict) -> None: path = _usage_file() fd, tmp_path = tempfile.mkstemp(dir=str(path.parent), prefix=".usage_", suffix=".tmp") try: with os.fdopen(fd, "w", encoding="utf-8") as f: json.dump(data, f, indent=2, sort_keys=True, ensure_ascii=False) f.flush() os.fsync(f.fileno()) # 强制刷盘 os.replace(tmp_path, path) # 原子替换——要么新文件,要么旧文件,不存在中间态 except BaseException: try: os.unlink(tmp_path) except OSError: pass raise

同样的tempfile + os.replace模式在.curator_state.bundled_manifest中也有使用——这是 Hermes 整个持久化层的统一规范。


05 Curator 如何读信号做决策

Curator 通过agent_created_report()拿到每个技能的聚合状态报告,再渲染成 LLM 可读的候选列表:

# 报告聚合:补全缺失字段 + 计算派生指标 def agent_created_report() -> List[Dict[str, Any]]: data = load_usage() rows = [] for name in list_agent_created_skill_names(): rec = data.get(name) or _empty_record() for k, v in _empty_record().items(): rec.setdefault(k, v) # 向后兼容:补全旧版本缺失字段 row = {"name": name, rec} row["last_activity_at"] = latest_activity_at(row) # 三维时间取最大 row["activity_count"] = activity_count(row) # use+view+patch 总和 rows.append(row) return rows

渲染成 LLM 候选列表的实际效果:

Agent-created skills (12): - pdf-extraction state=active pinned=no activity=23 use=18 view=5 patches=2 last_activity=2026-05-20T14:32:11+00:00 - slack-notifier state=stale pinned=no activity=2 use=1 view=1 patches=0 last_activity=2026-03-01T09:11:22+00:00 - old-debug-helper state=stale pinned=no activity=0 use=0 view=0 patches=0 last_activity=never

activity=0last_activity=never的技能,就是 Curator LLM 审查 pass 的重点目标——要么合并进更宽泛的 umbrella skill,要么归档清理。


06 常见坑

坑 1:以为view_count高就代表「有用」

view_count只是被skill_view()查看过——Curator 自己在 LLM 审查时也会触发 view。真正的「有用」信号是use_count:技能被加载进 prompt path,Agent 实际执行了这个技能的指令。两个数字差很大时,说明这个技能「看起来相关,但 Agent 最终没用上」。

坑 2:直接写文件创建技能,没调用mark_agent_created()

如果用skill_manage(action="create")之外的方式(比如直接在磁盘写文件)创建了一个技能,但没有在.usage.json里写created_by = "agent",Curator 永远看不见它——既不优化,也不清理。解决方法:手动调用mark_agent_created(skill_name)补标记。

坑 3:latest_activity_atcreated_at的语义混淆
「一个技能创建了 35 天,但从来没被用过,应该归档吗?」Hermes 的答案是:看latest_activity_at——如果返回None(从没真正活跃),Curator 以created_at为锚点计算时长。创建超 30 天且latest_activity_at=None的技能,会先被标记为stale,再进入归档候选名单。

坑 4:以为 pinned 技能只是「暂时保护」

pinned=True是绕过所有自动状态迁移的永久 opt-out,不是「暂时跳过这次」。常见场景:核心基础设施技能每 7 天才用一次但绝对不能归档——hermes curator pin <skill-name>一次性永久保护。想取消保护:hermes curator unpin <skill-name>


总结

.usage.jsonsidecar 是技能遥测的唯一真相来源——不靠文件系统推断,不写进用户内容,独立存储,原子写。

三类技能,两道防线——bundled manifest + hub lock.json 并集,只有 Agent 显式mark_agent_created()的技能才进入 Curator 管辖,防止误删官方技能。

use_count才是硬信号,view_count是软信号——Curator 优先看「被真正执行了多少次」而不是「被查看了多少次」,两者差距大的技能往往是「候选名字频繁出现但最终没被用上」。

latest_activity_at刻意排除created_at——新技能诞生瞬间不会被误判为「今天活跃」,返回None精确表达「从未真正活跃过」,Curator 才能区分「新技能」和「僵尸技能」。

原子写 + 文件锁双层保护——多进程并发读写.usage.json不会出现数据损坏,任何进程崩溃都不会留下半写状态。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2026 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要《AI大模型入门+进阶学习资源包》下方扫码获取~

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

以上资料如何领取?

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

以上全套大模型资料如何领取?

http://www.jsqmd.com/news/931861/

相关文章:

  • Illustrator脚本效率革命:5分钟掌握智能批量替换技术
  • 【Vue知识点总结】Watch(监听器)
  • 2026国产品牌超声波明渠流量计源头厂家综合实力TOP10排行榜:技术对标国际、国产替代首选品牌深度推荐 - 水质仪表品牌排行榜
  • 深度解析Sunshine开源游戏串流架构:构建高性能自托管游戏云的技术实现
  • AI内容检测原理与人性化改写实战:从统计特征到语义重构
  • 2026汕头卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • 2026济南卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • Promise 与 Async Await 深度解析
  • 2026衡阳卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • 04|精准测试平台的数据存储:MySQL、Redis、Elasticsearch 怎么分工?
  • 收藏!AI时代,这10类工作将越来越香,普通人如何避开内卷安稳立足?
  • 深度解析PanoHead:如何实现360度全头部3D生成的技术突破
  • 如何快速掌握围棋AI分析:LizzieYzy完整使用指南
  • 基于PHP的抖音无水印视频解析技术实现与架构解析
  • 2026柳州卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • ctf-git篇
  • 2026襄阳卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • 机组电涡流传感器TR-81
  • Chinese-LLaMA-2-7B与原始Llama-2对比:中文理解能力提升分析
  • 逆势承压!2026汽车活塞市场分析:行业发展趋势与未来前景预判
  • 2026 时尚家庭选购四件套5大宝藏家纺品牌完整盘点 - qiqi1113
  • 如何将ArcMenu集成到现有项目:迁移与适配完整指南
  • ASP.NET Core .NET 10 错误响应体系全景:从 BadRequest 到编译器基础设施
  • 5倍提速!用Fast-GitHub突破国内访问GitHub的技术瓶颈
  • 外星人将在 2026 年台北电脑展发布多款游戏显示器,7 月及秋季陆续上市
  • Sora 2珠宝展示不卡顿?揭秘底层NeRF-Transformer混合架构与实时LOD调度机制
  • 2026青岛卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • BigBird-Pegasus-large-arxiv常见问题解答:从安装到使用的全面排错指南 [特殊字符]
  • 抖音下载器终极指南:三步实现无水印视频批量下载,免费构建你的内容收藏库
  • 2026广州卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯