1. 多 Agent 环境下 Skill 管理的真实困境
1.1 从一个让人抓狂的场景说起
如果你正在维护一套多 Agent 协作系统,大概率遇到过这种局面:同一个“查数据库”的能力,在 Agent A 的目录里有一份,在 Agent B 的配置里又抄了一份,到了 Agent C 那边,因为业务微调,又派生出了第三份。三份代码逻辑大差不差,但参数命名、返回格式、异常处理各走各的路。某天上游数据源改了字段,你改完第一份,忘了第二份,第三份的负责人休假了——线上直接炸锅。
这不是个别现象。多 Agent 系统一旦从 Demo 走向生产,Skill(也就是 Agent 可调用的工具、函数、能力单元)的复制粘贴就会像野草一样蔓延。原因很朴素:每个 Agent 有自己的职责边界、自己的提示词上下文、自己的部署节奏,团队为了快速上线,最省事的做法就是“复制一份改改”。短期看是效率,长期看是技术债。
我见过一个中等规模的客服 Agent 集群,六个 Agent 共享了大约二十个 Skill,实际去重后只有九个。也就是说,超过一半的 Skill 是重复的。维护成本不是线性增长,而是随着 Agent 数量和 Skill 交叉引用关系呈指数上升。这就是标题里说的“同一个 skill 存了三份”背后的真实痛点。
1.2 为什么多 Agent 场景下 Skill 管理格外难
单 Agent 时代,Skill 管理相对简单:一个注册表,一份代码,改了就生效。多 Agent 引入了几层额外的复杂性,我把它拆成四个维度来看。
第一是归属模糊。一个“发送通知”的 Skill,到底属于消息 Agent、任务 Agent 还是公共层?没有明确归属,就没人对它负责,最后每个 Agent 各自实现一遍。
第二是版本漂移。Agent A 用的是 Skill 的 v1.2,Agent B 还在 v1.0,因为 B 的提示词是针对旧返回格式调优的。你升级公共 Skill,可能直接破坏 B 的行为。这种耦合让团队不敢统一,只能继续复制。
第三是上下文差异。同一个 Skill 在不同 Agent 里,期望的输入输出可能不同。比如“搜索”这个 Skill,在问答 Agent 里返回长文本,在摘要 Agent 里只需要标题和链接。为了迁就差异,复制成了最直接的选择。
第四是发现机制缺失。Agent 数量一多,没人清楚全局到底有哪些 Skill、谁在用、用在哪。新来的同学要加一个能力,第一反应是搜代码库,搜不到就自己写,于是又多了一份。
核心矛盾在于:Agent 需要独立演进的自由度,而 Skill 作为共享资产又需要统一治理。这两者天然拉扯,管理方案的本质就是在这中间找平衡点。
1.3 本文要解决什么,适合谁看
这篇内容不打算空谈架构理念,而是围绕“同一个 Skill 存了三份”这个具体问题,讲清楚三件事:怎么设计一套能落地的 Skill 管理机制,让重复可控、版本可追、变更可查;怎么在“统一”和“自治”之间划出合理的边界;以及两款我实际用过的开源工具,它们各自解决什么问题、适合什么阶段、有什么坑。
适合的读者包括:正在搭建或维护多 Agent 系统的工程师、负责 Agent 平台治理的技术负责人、以及被 Skill 重复问题折磨过、想找一套可复现方案的同学。如果你还在单 Agent 阶段,也可以提前了解,避免将来踩同样的坑。全文会给出具体的目录结构、配置示例、参数计算和排查清单,尽量做到能直接抄作业。
2. Skill 管理机制的整体设计与选型考量
2.1 先想清楚:Skill 到底该不该共享
很多人一上来就想搞“大一统”,把所有 Skill 抽到一个公共仓库,所有 Agent 强制引用。我试过,结果很惨:公共仓库变成了瓶颈,任何小改动都要走评审,Agent 团队怨声载道,最后大家绕过公共层,又偷偷复制。
所以第一步不是设计工具,而是做分类决策。我的经验是把 Skill 按“复用度”和“稳定性”两个维度切成四类,不同类走不同策略。
| 类型 | 复用度 | 稳定性 | 策略 | 举例 |
|---|---|---|---|---|
| 公共基础 | 高 | 高 | 强制共享,统一版本 | 日志、鉴权、通用 HTTP 调用 |
| 领域共享 | 中 | 中 | 共享但允许 Agent 覆盖参数 | 搜索、数据库查询 |
| Agent 专属 | 低 | 中 | 各自维护,不进公共层 | 特定业务规则校验 |
| 实验性 | 低 | 低 | 允许复制,定期清理 | 临时数据处理脚本 |
这个分类表是我踩坑后总结的。关键洞察是:不是所有重复都是坏的。实验性 Skill 复制一份快速验证,比强行抽象更高效。真正要治理的是“公共基础”和“领域共享”这两类,它们才是维护成本的大头。
2.2 共享 Skill 的三种组织模式
确定要共享之后,组织方式有三种,各有取舍。
模式一:中心仓库 + 引用。所有共享 Skill 放在一个独立仓库,各 Agent 通过依赖声明引用特定版本。优点是版本清晰、变更可追;缺点是跨仓库调试麻烦,Agent 团队改一个参数要等公共仓库发版。
模式二:Monorepo 单仓多包。所有 Agent 和 Skill 放在同一个大仓库,用工作区(workspace)机制管理。优点是改动能原子提交、跨包重构方便;缺点是仓库膨胀快,权限和 CI 需要精细设计。
模式三:注册中心 + 动态加载。Skill 注册到一个中心服务,Agent 运行时按需拉取。优点是灵活、支持热更新;缺点是引入了运行时依赖,调试和本地开发复杂。
我实际项目里用的是模式二为主、模式一为辅:核心公共 Skill 走独立仓库保证稳定,领域 Skill 放在 Monorepo 里和 Agent 一起演进。这个组合的好处是,高频变更的部分享受单仓便利,低频稳定的部分享受独立版本管理。
2.3 版本策略:语义化版本不够用怎么办
共享 Skill 一上版本管理,马上会遇到语义化版本(SemVer)的局限。SemVer 假设接口稳定,但 Skill 的“接口”不只是函数签名,还包括返回内容的语义、副作用、调用时机。一个 Skill 从“同步返回”改成“异步回调”,按 SemVer 算破坏性变更,但对某些 Agent 来说可能完全无感。
我的做法是给每个共享 Skill 维护一份契约文件,显式声明四件事:输入 schema、输出 schema、副作用说明、兼容性等级。兼容性等级分三档:compatible(可直接替换)、behavioral(行为变化需验证)、breaking(必须改调用方)。版本号只是索引,真正的判断依据是契约文件。
# skill-contract.yaml 示例 name: db-query version: 2.3.0 compatibility: behavioral inputs: sql: { type: string, required: true } timeout_ms: { type: integer, default: 5000 } outputs: rows: { type: array } affected: { type: integer } side_effects: - "只读查询,无写入" - "超时后自动重试一次" breaking_changes_from: "2.0.0"这份契约文件跟着 Skill 一起版本化,Agent 升级依赖前先读契约,判断自己要不要改。实测下来,这比单纯看版本号靠谱得多,尤其是跨团队协作时,契约文件就是沟通的锚点。
2.4 去重与合并的判断标准
发现重复 Skill 后,不是所有都该合并。我总结了一个简单的判断流程:先看输入输出 schema 是否一致,不一致的看能否用参数化统一;能统一的评估合并后的复杂度,如果参数超过五个、分支逻辑超过三层,就放弃合并,改为“共享核心 + Agent 适配层”。
适配层是个好东西。它让共享 Skill 保持干净,Agent 侧写一层薄薄的转换,把公共输出映射成自己需要的格式。这样公共 Skill 只维护一份,适配层各自维护但代码量很小,重复的“重”被消解掉了。
一个反直觉的经验:合并两个相似 Skill 的收益,往往不如给它们加一层适配层。强行合并会制造一个谁都不敢改的“上帝 Skill”,适配层则保留了各自的演进空间。
3. 核心细节解析与实操要点
3.1 目录结构:让重复无处藏身
治理重复的第一步是让重复可见。我用的目录结构是这样的:
skills/ shared/ # 公共基础 Skill,独立版本 auth/ logging/ domain/ # 领域共享 Skill search/ db-query/ agents/ agent-a/ skills/ # Agent 专属 Skill adapters/ # 适配层 agent-b/ skills/ adapters/关键约定有三条。第一,shared和domain下的 Skill 必须有契约文件,没有契约不允许被引用。第二,Agent 专属 Skill 命名必须带 Agent 前缀,比如agent-a-custom-validator,防止和共享 Skill 混淆。第三,适配层统一放在adapters目录,命名规则是{skill名}-adapter,一眼能看出它适配的是哪个共享 Skill。
这套结构配合一个简单的静态检查脚本,就能在 CI 阶段发现“同一个 Skill 被复制到多个 Agent 目录”的问题。脚本逻辑很朴素:扫描所有 Skill 的输入输出 schema 哈希,哈希相同但路径不同的,标记为疑似重复,人工确认。
3.2 契约文件怎么写才有用
契约文件最容易写成形式主义,填一堆字段没人看。我的原则是:只写会影响调用方决策的信息。具体来说,四个字段必须有,其余可选。
compatibility字段是核心,它直接决定调用方要不要行动。side_effects字段经常被忽略,但极其重要——一个 Skill 如果会写数据库、发消息、扣费用,调用方必须知道,否则重试逻辑会出大问题。breaking_changes_from记录从哪个版本开始不兼容,方便调用方判断自己的版本跨度。
写契约时有个技巧:把“调用方需要做什么”写进去。比如“升级到本版本需要同步更新 timeout 参数默认值”,这种操作性提示比干巴巴的 schema 有用得多。我见过团队把契约写成 API 文档,结果没人维护,最后和代码脱节。契约要短、要准、要能指导行动。
3.3 参数化统一的边界在哪里
把多个相似 Skill 合并成一个参数化 Skill,是去重的主要手段。但参数化有边界,越过边界就得不偿失。
我的经验边界是:参数数量不超过五个,且参数之间相互独立。如果参数之间有依赖关系(比如 A 为真时 B 才生效),说明这本质上是两个不同的 Skill,硬合并会让调用方困惑。举个例子,“搜索”Skill 支持mode参数(快速/精确),这两个模式内部逻辑完全不同,合并后代码里全是 if-else,维护性反而下降。这种情况我倾向于拆成search-fast和search-precise两个 Skill,共享底层实现,但对外是两个清晰的能力。
参数默认值的设计也很关键。默认值应该覆盖 80% 的调用场景,让大多数调用方不用传参。剩下 20% 的特殊场景,通过显式传参覆盖。这样既统一了接口,又不牺牲灵活性。
3.4 变更影响分析怎么做
共享 Skill 一改,影响面可能横跨多个 Agent。变更前必须做影响分析,我的做法分三步。
第一步,静态扫描。用脚本扫描所有 Agent 的依赖声明,找出引用了待变更 Skill 的 Agent 列表,以及它们引用的版本。这一步能给出“谁受影响”的全景。
第二步,契约比对。把新旧版本的契约文件 diff 出来,重点看compatibility和side_effects的变化。如果兼容性等级是breaking,那所有引用方都必须人工确认。
第三步,灰度验证。先在测试环境跑一遍受影响 Agent 的核心用例,观察行为差异。我习惯准备一组“黄金用例”,覆盖每个 Agent 对共享 Skill 的典型调用,变更后自动跑一遍,对比输出。
这三步走下来,变更的风险基本可控。最怕的是跳过第一步,凭印象判断“应该没几个 Agent 用”,结果上线后才发现漏了一个关键 Agent。
4. 实操过程与核心环节实现
4.1 从零搭建共享 Skill 仓库
假设你现在有六个 Agent,Skill 重复严重,想开始治理。第一步是建共享仓库。我用的是 Monorepo 加工作区的方式,具体步骤如下。
首先初始化仓库结构,创建packages/shared-skills和packages/agents两个工作区。共享 Skill 放在shared-skills下,每个 Skill 一个子目录,包含实现文件、契约文件、测试文件三件套。
mkdir -p packages/shared-skills/src mkdir -p packages/agents然后配置工作区,让 Agent 能通过包名引用共享 Skill。以 Node.js 生态为例,在根package.json里声明 workspaces,共享 Skill 包名统一用@skills/前缀。
{ "name": "agent-platform", "private": true, "workspaces": [ "packages/shared-skills", "packages/agents/*" ] }接着写第一个共享 Skill。以db-query为例,实现文件只做一件事:执行只读查询并返回结构化结果。契约文件按前面说的四字段写。测试文件覆盖正常查询、超时、空结果三种情况。
最后在 Agent 侧引用。Agent 的package.json里加一行"@skills/db-query": "workspace:*",代码里直接 import。这样 Agent 用的是同一份实现,改一处全局生效。
4.2 迁移已有重复 Skill 的步骤
仓库建好后,要把散落在各 Agent 里的重复 Skill 迁进来。这个过程不能一刀切,我分四批走。
第一批,选一个复用度最高、逻辑最简单的 Skill 试点,比如日志上报。把它抽到共享仓库,改两个 Agent 引用,跑通全流程,验证工具链没问题。
第二批,处理领域共享 Skill。这类 Skill 各 Agent 有细微差异,迁移时先合并公共逻辑,差异部分用参数或适配层处理。每迁一个,记录下差异点和处理方式,形成迁移日志。
第三批,处理有副作用的 Skill。这类最危险,迁移前必须确认所有调用方的重试逻辑、幂等性假设。我一般会先加一层包装,保持旧接口不变,内部转发到新实现,观察一段时间再切换。
第四批,清理 Agent 专属 Skill 里的“伪专属”。有些 Skill 看着是某个 Agent 专用,其实别的 Agent 也在偷偷用。这类要么提升为领域共享,要么明确标记为专属并加访问限制。
整个迁移过程我用了大约三周,六个 Agent、二十个 Skill,最终收敛到九个共享 Skill 加若干适配层。迁移期间保持新旧并存,用开关控制走哪条路径,确认稳定后再删旧代码。
4.3 参数计算:超时与重试怎么定
共享 Skill 的参数里,超时和重试最容易拍脑袋。我给一个可复现的计算方法。
先确定单次调用的 P99 延迟。从监控里拉最近一周的数据,取 P99 值,比如 800ms。超时设为 P99 的 1.5 到 2 倍,即 1200ms 到 1600ms,取整 1500ms。这个倍数的理由是:留出余量应对偶发慢请求,又不至于让调用方等太久。
重试次数用可用性目标反推。假设单次调用成功率 99%,要达成整体 99.9%,需要重试。公式是1 - (1 - p)^(n+1) >= target,其中 p 是单次成功率,n 是重试次数。代入 p=0.99,target=0.999,解得 n 约等于 2。所以重试两次,总尝试三次。
重试间隔用指数退避,初始 200ms,每次翻倍,加随机抖动。抖动范围取间隔的 20%,防止多个调用方同时重试造成尖峰。
import random def retry_delay(attempt, base=200, max_delay=2000): delay = min(base * (2 ** attempt), max_delay) jitter = delay * 0.2 * random.random() return delay + jitter这套参数不是拍脑袋,是从监控数据和可用性目标推出来的。实际用下来,超时误报和重试风暴都明显减少。
4.4 用静态检查守住重复底线
机制建好后,靠人自觉是不够的,得有工具守底线。我写了一个静态检查脚本,集成到 CI 里,每次提交都跑。
脚本做三件事。第一,扫描所有 Skill 的输入输出 schema,计算哈希,哈希相同但路径不同的报“疑似重复”。第二,检查共享 Skill 是否有契约文件,没有的报错。第三,检查 Agent 是否直接复制了共享 Skill 的代码(通过代码相似度比对),相似度超过阈值的报“疑似复制”。
import hashlib import json from pathlib import Path def schema_hash(skill_path): contract = json.loads((skill_path / "skill-contract.yaml").read_text()) schema = {"inputs": contract["inputs"], "outputs": contract["outputs"]} return hashlib.sha256(json.dumps(schema, sort_keys=True).encode()).hexdigest() def scan_duplicates(root): seen = {} for contract in Path(root).rglob("skill-contract.yaml"): h = schema_hash(contract.parent) seen.setdefault(h, []).append(str(contract.parent)) return {h: paths for h, paths in seen.items() if len(paths) > 1}这个脚本跑下来,能拦住大部分无意识的复制。有意识的复制(比如实验性 Skill)可以在配置里加白名单,但必须写明理由和清理期限。
5. 两款开源工具的实战评测
5.1 工具一:面向 Agent 的 Skill 注册与发现框架
第一款工具是一个轻量级的 Skill 注册与发现框架,核心思路是“注册中心 + 客户端缓存”。每个 Skill 启动时向中心注册自己的元数据(名称、版本、契约、健康检查地址),Agent 启动时拉取全量列表并缓存,运行时按名称查找。
我实际用下来的感受是:适合 Agent 数量多、Skill 变更频繁的场景。它的优势在于发现机制,新 Skill 注册后,Agent 不用改配置就能感知到。健康检查也很实用,某个 Skill 实例挂了,中心会自动摘除,Agent 侧拿到的是可用列表。
但它有几个坑要注意。第一,中心服务本身是单点,虽然支持多实例,但配置复杂,小团队容易配错。第二,客户端缓存有延迟,Skill 刚注册时 Agent 可能还看不到,需要等缓存刷新。第三,元数据格式有强约定,迁移已有 Skill 时要写转换脚本。
我的建议是:Agent 超过十个、Skill 变更每周都有,值得上这套。否则用静态配置加 CI 检查就够了,引入注册中心反而增加运维负担。
5.2 工具二:Skill 契约校验与兼容性检查工具
第二款工具专注契约校验,它读取契约文件,对比两个版本,自动判断兼容性等级,并生成影响报告。核心能力是 schema diff 和兼容性规则引擎。
这个工具解决了我前面说的“语义化版本不够用”的问题。它不只看版本号,而是实际比对输入输出 schema、副作用声明、默认值变化,给出比 SemVer 更细的判断。比如某个字段从必填改成可选,它判定为compatible;某个字段类型从 string 改成 integer,判定为breaking。
实测下来,它的规则引擎覆盖了大部分常见变更,但有两类情况需要人工介入。一类是语义变化但 schema 不变,比如同一个字段的含义从“用户 ID”变成“会话 ID”,工具看不出来。另一类是副作用变化,工具只能比对声明文本,无法验证实际行为。所以它是辅助,不是替代人工评审。
集成方式很简单,在 CI 里加一步,对比当前分支和主分支的契约文件,输出兼容性报告。如果是breaking,CI 直接失败,强制人工确认。这个卡点很有效,拦住了好几次想偷偷改接口的提交。
5.3 两款工具怎么选、怎么配合
这两款工具不是二选一,而是解决不同层次的问题。注册发现框架解决“Skill 在哪、谁在用”,契约校验工具解决“改了会不会出事”。我的组合用法是:用注册框架做运行时发现,用契约工具做变更管控,两者通过契约文件这个共同的数据结构衔接。
如果只能选一个,我建议先上契约校验工具。原因是:重复和版本漂移的根源是变更失控,先把变更管住,重复问题会自然缓解。注册发现框架更适合规模上来之后的优化,早期投入产出比不高。
选型时还要看团队技术栈。注册框架通常有语言绑定,选和主力语言一致的,集成成本低。契约工具一般是语言无关的,读 YAML 或 JSON,适配性更好。
6. 常见问题与排查技巧实录
6.1 高频问题速查表
| 问题现象 | 可能原因 | 排查方向 | 解决手段 |
|---|---|---|---|
| Agent 调用 Skill 报“未找到” | 注册中心缓存未刷新 | 查中心注册时间与缓存 TTL | 手动刷新缓存或缩短 TTL |
| 升级共享 Skill 后某 Agent 行为异常 | 兼容性判断遗漏 | 对比新旧契约的副作用声明 | 回滚并补充契约字段 |
| CI 报疑似重复但确认不是 | schema 哈希碰撞或误判 | 查看哈希计算范围 | 调整哈希字段或加白名单 |
| 重试导致重复写入 | Skill 非幂等但被重试 | 检查副作用声明 | 加幂等键或禁用重试 |
| 适配层越写越厚 | 共享 Skill 参数化不足 | 统计适配层代码行数 | 评估是否提升为共享参数 |
| 注册中心单点故障 | 未做多实例 | 查中心部署拓扑 | 部署多实例加负载均衡 |
这张表是我从实际排查记录里整理的,覆盖了八成以上的常见问题。遇到新问题先查表,查不到再深入分析。
6.2 三个容易踩的坑
坑一:契约文件写了不维护。契约和代码脱节是常态,解决办法是把契约校验放进 CI,代码改了契约没改就报错。我试过靠人工 review,坚持不了两周就松懈了。
坑二:适配层变成新的重复源。适配层本意是消解重复,但如果每个 Agent 的适配层都抄来抄去,又制造了新的重复。我的做法是给适配层也建共享库,常见转换逻辑抽出来,Agent 只写真正特有的部分。
坑三:注册中心元数据过期。Skill 下线了但注册信息还在,Agent 拿到失效地址。解决办法是加心跳和 TTL,超时自动摘除。心跳间隔取健康检查周期的三分之一,TTL 取心跳间隔的三倍,这样容忍两次心跳丢失。
6.3 独家避坑技巧
分享几个文档里不会写、但实际很有用的技巧。
第一,给共享 Skill 加调用计数。每个 Skill 记录被哪些 Agent 调用了多少次,数据回流到治理看板。这样你能清楚看到哪些 Skill 是热点、哪些没人用可以下线。我靠这个发现了一个“以为很多人用、实际零调用”的僵尸 Skill。
第二,变更前先发预告。共享 Skill 要改,提前在团队频道发一条预告,写明变更内容、影响范围、预计时间。给调用方留出反应时间,比事后救火强得多。预告模板可以固定,降低发送成本。
第三,保留一份“重复白名单”。有些重复是合理的,比如实验性 Skill、性能敏感场景的定制实现。把这些明确列入白名单,写明理由和复查日期,避免每次 CI 都报警,也避免它们被误清理。
第四,用真实调用日志验证契约。契约声明的输入输出,和实际调用是否一致?我定期抽样调用日志,对比契约,发现过好几次“契约说必填、实际没人传”的字段。这些字段要么改成可选,要么删掉,让契约回归真实。
7. 治理效果的度量与持续演进
7.1 用什么指标衡量治理效果
治理不能凭感觉,得有指标。我跟踪四个核心指标。
重复率:去重后的 Skill 数除以去重前的总数。目标是把公共和领域 Skill 的重复率降到 10% 以下。这个指标直接反映治理成效。
变更影响面:一次共享 Skill 变更平均影响多少个 Agent。这个指标反映耦合程度,理想状态是影响面可控、可预测。
契约覆盖率:有契约文件的共享 Skill 占比。目标是 100%,没有契约的不允许共享。
适配层厚度:适配层代码行数除以共享 Skill 代码行数。这个比值过高说明参数化不足,需要重新评估合并策略。
这四个指标我放在一个简单看板上,每周更新。数据不用很精确,趋势比绝对值重要。
7.2 从治理到自治的演进路径
治理的终局不是管得更严,而是让团队自治。我的演进路径分三个阶段。
第一阶段是集中治理,由平台团队统一管理共享 Skill,制定规范,跑 CI 检查。这个阶段必要,但不能停太久,否则平台团队成为瓶颈。
第二阶段是联邦治理,各 Agent 团队派代表组成虚拟小组,共同评审共享 Skill 的变更。平台团队退居幕后,提供工具和规范。
第三阶段是自治加审计,各团队自主管理自己领域的共享 Skill,平台只做定期审计和异常告警。契约文件和 CI 检查成为自治的基础设施,不依赖人工监督。
我现在带的项目处在第二阶段向第三阶段过渡。感受是:工具越完善,人工干预越少,团队越愿意遵守规范。治理的本质是降低遵守规范的成本,而不是增加违反规范的成本。
7.3 后续可以扩展的方向
这套机制跑顺之后,有几个方向可以继续深挖。
一是Skill 的自动发现与推荐。基于调用日志和 Agent 行为,自动推荐“你可能需要的 Skill”,减少重复造轮子。这个需要一定的数据积累,早期做不了。
二是契约的自动生成。从代码和测试里自动提取输入输出 schema,生成契约初稿,人工确认。能大幅降低写契约的成本,提高覆盖率。
三是跨平台的 Skill 互操作。不同 Agent 框架之间的 Skill 格式不统一,如果能有一套中间表示,Skill 就能跨框架复用。这个方向还在早期,标准未定,但值得关注。
四是Skill 的性能画像。记录每个 Skill 的延迟、成功率、资源消耗,为参数调优和容量规划提供依据。这个和监控系统结合,落地难度不大。
这些方向不用一次全上,挑和当前痛点最匹配的先做。我的原则是:治理机制先跑通,再谈智能化。基础不牢,再花哨的功能都是空中楼阁。
最后分享一个我在实际操作中的体会:Skill 管理的核心不是技术,是共识。工具能发现重复,但消除重复需要团队认同“共享比复制更划算”。这个认同不会自动产生,得靠一次次成功的共享体验积累。所以早期宁可少共享、共享好,也不要为了指标强行合并,把共享做成了负担。