一个 Skill 教遍所有技术栈?不靠预置课程,靠"元协议"+ 四份范例
你想做一个"AI 私教"Agent。第一个设计决策就卡住你:
教学内容写死吗?
写死:质量可控,但它这辈子只会教这一门课,学员说"我想学 Kafka"你就得重写一遍。 不写死:什么都能教,但生成质量听天由命,每次问出一张不同的学习路线。
这是所有"通用型 Agent"都要面对的两难:能力与确定性不可兼得——除非,你预置的不是"内容",而是"生成内容的协议"。
这篇拆解开源项目 tech-stack-architect-coach 的核心创新:一个技术栈无关的动态模块池协议。它让同一个 Skill 能教 Redis、Kafka、MySQL、Vue、ES、Nginx…… 同时实测同一输入两次生成的模块池 100% 一致(R7 一致性测试,14/14 模块名与分层完全相同)。
📌 TL;DR 速览
- 讲什么:不预置课程内容,而是预置"生成课程的协议"——通用型 Agent 的设计五件套
- 核心结论:通用性的答案不是"什么都预置",而是"把生成方法本身协议化";范例质量 = 生成质量
- 三个关键数字:L1–L4 四层判定 | 每池 8–14 个模块 | 跨会话一致性 100%(门槛 70%)
- 适合谁:做"动态生成"类 Agent,被生成质量不稳定折磨的人
目录
- 一、预置内容 vs 动态生成:先看清两难
- 二、解法:元协议——预置"生成方法",不预置"内容"
- 三、模块的 4 条铁标准
- 四、L1–L4 分层:给任意技术栈"对号入座"
- 五、五步法:从知识地图到质量自检
- 六、模块元数据:让路线可以"按目标重排"
- 七、通过标准:验"做出来",不验"听懂了"
- 八、质量自检清单:生成器的单元测试
- 九、四份范例:小样本撬动大确定性
- 十、与诊断结论联动:同一份模块池,三种学员
- 十一、可复用清单
- 十二、总结
一、预置内容 vs 动态生成:先看清两难
| 覆盖面 | 一门课一份内容 | 任意技术栈 |
| 质量 | 人工打磨,可控 | 依赖模型当场发挥 |
| 一致性 | 稳定 | 同输入可能出不同结果 |
| 维护成本 | 加一门课写一份 | 改协议一处,全域生效 |
| 个性化 | 千人一面 | 可按学员基础/目标/时间调整 |
直觉上"动态生成"全是优点,但它的死穴是中间两行:质量没保障、结果不稳定。大多数项目倒在"每次生成都不一样"上——学习路线这种东西,今天一张明天一张,用户凭什么信你?
所以这个设计要回答的真问题是:怎么让"动态生成"拥有接近"预置内容"的确定性和质量?
二、解法:元协议——预置"生成方法",不预置"内容"
答案是把预置对象从"内容"换成"生成内容的协议":
#mermaid-svg-UQcJGqax8fRTnMdy{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UQcJGqax8fRTnMdy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UQcJGqax8fRTnMdy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UQcJGqax8fRTnMdy .error-icon{fill:#552222;}#mermaid-svg-UQcJGqax8fRTnMdy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UQcJGqax8fRTnMdy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UQcJGqax8fRTnMdy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UQcJGqax8fRTnMdy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UQcJGqax8fRTnMdy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UQcJGqax8fRTnMdy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UQcJGqax8fRTnMdy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UQcJGqax8fRTnMdy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UQcJGqax8fRTnMdy .marker.cross{stroke:#333333;}#mermaid-svg-UQcJGqax8fRTnMdy svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UQcJGqax8fRTnMdy p{margin:0;}#mermaid-svg-UQcJGqax8fRTnMdy .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-UQcJGqax8fRTnMdy .cluster-label text{fill:#333;}#mermaid-svg-UQcJGqax8fRTnMdy .cluster-label span{color:#333;}#mermaid-svg-UQcJGqax8fRTnMdy .cluster-label span p{background-color:transparent;}#mermaid-svg-UQcJGqax8fRTnMdy .label text,#mermaid-svg-UQcJGqax8fRTnMdy span{fill:#333;color:#333;}#mermaid-svg-UQcJGqax8fRTnMdy .node rect,#mermaid-svg-UQcJGqax8fRTnMdy .node circle,#mermaid-svg-UQcJGqax8fRTnMdy .node ellipse,#mermaid-svg-UQcJGqax8fRTnMdy .node polygon,#mermaid-svg-UQcJGqax8fRTnMdy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UQcJGqax8fRTnMdy .rough-node .label text,#mermaid-svg-UQcJGqax8fRTnMdy .node .label text,#mermaid-svg-UQcJGqax8fRTnMdy .image-shape .label,#mermaid-svg-UQcJGqax8fRTnMdy .icon-shape .label{text-anchor:middle;}#mermaid-svg-UQcJGqax8fRTnMdy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UQcJGqax8fRTnMdy .rough-node .label,#mermaid-svg-UQcJGqax8fRTnMdy .node .label,#mermaid-svg-UQcJGqax8fRTnMdy .image-shape .label,#mermaid-svg-UQcJGqax8fRTnMdy .icon-shape .label{text-align:center;}#mermaid-svg-UQcJGqax8fRTnMdy .node.clickable{cursor:pointer;}#mermaid-svg-UQcJGqax8fRTnMdy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UQcJGqax8fRTnMdy .arrowheadPath{fill:#333333;}#mermaid-svg-UQcJGqax8fRTnMdy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UQcJGqax8fRTnMdy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UQcJGqax8fRTnMdy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UQcJGqax8fRTnMdy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UQcJGqax8fRTnMdy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UQcJGqax8fRTnMdy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UQcJGqax8fRTnMdy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UQcJGqax8fRTnMdy .cluster text{fill:#333;}#mermaid-svg-UQcJGqax8fRTnMdy .cluster span{color:#333;}#mermaid-svg-UQcJGqax8fRTnMdy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UQcJGqax8fRTnMdy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UQcJGqax8fRTnMdy rect.text{fill:none;stroke-width:0;}#mermaid-svg-UQcJGqax8fRTnMdy .icon-shape,#mermaid-svg-UQcJGqax8fRTnMdy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UQcJGqax8fRTnMdy .icon-shape p,#mermaid-svg-UQcJGqax8fRTnMdy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UQcJGqax8fRTnMdy .icon-shape .label rect,#mermaid-svg-UQcJGqax8fRTnMdy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UQcJGqax8fRTnMdy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UQcJGqax8fRTnMdy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UQcJGqax8fRTnMdy :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
每个技术栈一份写不完
什么技术栈都能生成
预置内容方案Redis 课.md + Kafka 课.md + …
通用 Skill
元协议方案模块池生成协议.md+ 四份风格范例
协议文件(module-pool-generation.md)里没有任何具体技术的教学内容,只有:
README 里有一句贡献指南,把这个原则说得很死:
改进协议文件:直接提 PR,注意保持"通用框架"定位——不要往 Skill 里加具体技术栈的预置教学内容(模块池是运行时生成的)。 新增技术栈的生成效果不佳时,优先改进分层规则与范例,而不是加特例。
“改规则,不加特例”——这句就是整个设计的定海神针。
三、模块的 4 条铁标准
生成的最小单位是"模块",协议给模块定了 4 条必须同时满足的标准:
协议还给了反例,直接点名禁止形态:
反例(禁止):“Redis 高级篇”(不可验收)、“数据结构与持久化”(两个知识点混装)、“消息队列原理”(超过 2 天上限)。
为什么反例重要?LLM 生成的典型毛病恰恰是"XX 高级篇"这种又大又虚的模块——把禁止形态写出来,比写 10 句正面要求都管用(上一篇"硬约束解剖学"里的"违规形态枚举"在这里复现了)。
四、L1–L4 分层:给任意技术栈"对号入座"
任何技术栈的知识体系都按四层组织。注意设计精髓:分层名是逻辑角色,不是固定栏目——非后端载体可以把层名换成同义词(前端 L3 叫"性能与工程化层"),但判定标准不变,且 layer 字段必须保留 L1–L4 前缀。
| L1 基础层 | 使用该技术的最小必要知识,后续一切的前置 | 核心数据结构、连接与序列化、线程模型 | 组件模型、响应式数据流、路由与状态管理入门 |
| L2 核心机制层 | 该技术赖以工作的内部机制,生产必配 | 持久化、索引、事务、副本与一致性协议 | 渲染机制、更新调度、响应式依赖追踪 |
| L3 高可用与治理层 | 生产环境的坑与稳定性保障,面试最高频 | 高可用、集群、限流降级、容量规划、监控 | 性能优化、内存泄漏治理、错误监控、工程化 |
| L4 实战层 | 用该技术解决真实业务问题的组合打法 | 分布式锁/幂等/延迟任务、典型架构落地 | 复杂组件抽象、中台方案、大型应用架构 |
四份真实分层映射(协议原文):
- Redis:L1=数据结构/序列化/线程模型;L2=RDB/AOF/主从;L3=哨兵/Cluster/缓存三坑/大Key;L4=分布式锁/Lua/监控
- Kafka:L1=Topic/Partition/生产者消费者;L2=存储机制/副本与 ISR/位移管理;L3=重平衡/exactly-once/积压治理;L4=延迟队列/事务消息/压测调优
- MySQL:L1=索引与执行计划;L2=事务与 MVCC/日志体系;L3=锁/主从/分库分表;L4=慢查询治理/线上故障复盘
- Vue:L1=组件与响应式基础;L2=渲染与更新机制/编译优化;L3=性能优化/内存泄漏/错误监控;L4=复杂状态方案/组件库封装
判定标准与载体无关,是这套协议能跨技术栈复用的根基。 这也是项目留给贡献者的扩展点:生成新载体效果不好,优先打磨的是这张判定标准表。
五、五步法:从知识地图到质量自检
#mermaid-svg-wFq6yYgCRoBeue0M{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wFq6yYgCRoBeue0M .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wFq6yYgCRoBeue0M .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wFq6yYgCRoBeue0M .error-icon{fill:#552222;}#mermaid-svg-wFq6yYgCRoBeue0M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wFq6yYgCRoBeue0M .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wFq6yYgCRoBeue0M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wFq6yYgCRoBeue0M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wFq6yYgCRoBeue0M .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wFq6yYgCRoBeue0M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wFq6yYgCRoBeue0M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wFq6yYgCRoBeue0M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wFq6yYgCRoBeue0M .marker.cross{stroke:#333333;}#mermaid-svg-wFq6yYgCRoBeue0M svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wFq6yYgCRoBeue0M p{margin:0;}#mermaid-svg-wFq6yYgCRoBeue0M .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wFq6yYgCRoBeue0M .cluster-label text{fill:#333;}#mermaid-svg-wFq6yYgCRoBeue0M .cluster-label span{color:#333;}#mermaid-svg-wFq6yYgCRoBeue0M .cluster-label span p{background-color:transparent;}#mermaid-svg-wFq6yYgCRoBeue0M .label text,#mermaid-svg-wFq6yYgCRoBeue0M span{fill:#333;color:#333;}#mermaid-svg-wFq6yYgCRoBeue0M .node rect,#mermaid-svg-wFq6yYgCRoBeue0M .node circle,#mermaid-svg-wFq6yYgCRoBeue0M .node ellipse,#mermaid-svg-wFq6yYgCRoBeue0M .node polygon,#mermaid-svg-wFq6yYgCRoBeue0M .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wFq6yYgCRoBeue0M .rough-node .label text,#mermaid-svg-wFq6yYgCRoBeue0M .node .label text,#mermaid-svg-wFq6yYgCRoBeue0M .image-shape .label,#mermaid-svg-wFq6yYgCRoBeue0M .icon-shape .label{text-anchor:middle;}#mermaid-svg-wFq6yYgCRoBeue0M .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wFq6yYgCRoBeue0M .rough-node .label,#mermaid-svg-wFq6yYgCRoBeue0M .node .label,#mermaid-svg-wFq6yYgCRoBeue0M .image-shape .label,#mermaid-svg-wFq6yYgCRoBeue0M .icon-shape .label{text-align:center;}#mermaid-svg-wFq6yYgCRoBeue0M .node.clickable{cursor:pointer;}#mermaid-svg-wFq6yYgCRoBeue0M .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wFq6yYgCRoBeue0M .arrowheadPath{fill:#333333;}#mermaid-svg-wFq6yYgCRoBeue0M .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wFq6yYgCRoBeue0M .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wFq6yYgCRoBeue0M .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wFq6yYgCRoBeue0M .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wFq6yYgCRoBeue0M .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wFq6yYgCRoBeue0M .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wFq6yYgCRoBeue0M .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wFq6yYgCRoBeue0M .cluster text{fill:#333;}#mermaid-svg-wFq6yYgCRoBeue0M .cluster span{color:#333;}#mermaid-svg-wFq6yYgCRoBeue0M div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wFq6yYgCRoBeue0M .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wFq6yYgCRoBeue0M rect.text{fill:none;stroke-width:0;}#mermaid-svg-wFq6yYgCRoBeue0M .icon-shape,#mermaid-svg-wFq6yYgCRoBeue0M .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wFq6yYgCRoBeue0M .icon-shape p,#mermaid-svg-wFq6yYgCRoBeue0M .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wFq6yYgCRoBeue0M .icon-shape .label rect,#mermaid-svg-wFq6yYgCRoBeue0M .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wFq6yYgCRoBeue0M .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wFq6yYgCRoBeue0M .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wFq6yYgCRoBeue0M :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
第1步 建立知识地图列 10-16 个候选知识点对照官方文档章节 × 主流面试考点交叉验证
第2步 知识点归层按 L1-L4 判定标准对号入座
第3步 拆分与合并超 2 天拆,不足 0.5 天合并目标规模 8-14 个模块
第4步 标注元数据依赖 / 难度 / 时长 / 按目标优先级
第5步 质量自检逐条过 7 项检查清单不过则回到对应步修改
第 1 步"知识地图怎么列"给了可操作的口径:
- 依据训练知识,列出该技术栈"一个高级开发者必须掌握"的知识点清单;
- 对照官方文档章节结构 × 主流面试考点清单交叉验证,防结构性遗漏;
- 规模参考:最终 8–14 个模块。少于 8 个通常是粒度太粗,多于 14 个通常是切得太碎——数字本身就是质量的代理指标。
六、模块元数据:让路线可以"按目标重排"
每个模块强制携带元数据:
—
id: 05
title: 缓存三大坑治理(穿透 / 击穿 / 雪崩)
layer: L3 高可用与治理层
difficulty: 进阶
prerequisites: [01]
goals: [面试冲刺, 项目落地, 系统学习]
duration: 0.5
priority_by_goal: {面试冲刺: 10, 项目落地: 9, 系统学习: 7}
—
priority_by_goal 的填写规则写得非常具体:
- 面试最最高频的考点模块打 9–10(一般全池只有 2–3 个);
- 高频 7–8;中等 5–6;冷门但成体系必需的 3–4;边角知识 1–2。
这套打分的意义:同一份模块池,按不同目标列降序,就是三条不同的推荐路线——面试冲刺走考点优先,项目落地走实战优先,不必为每种目标维护一份独立内容。元数据是"一次生成、多路复用"的关键。
七、通过标准:验"做出来",不验"听懂了"
协议对"通过标准"的写法提出了 4 条硬要求,这一条最能体现工程品味:
① 可执行——“做一件事 + 看到什么结果”,不是"理解某概念":
❌ “理解 RDB 和 AOF 的区别” ✅ “在项目中同时开启 RDB 和 AOF,制造一次宕机,用日志证明数据恢复到了哪个时间点;并能口述两种持久化各自的取舍”
② 量化或可视化,且按载体类型选指标:
| 后端服务 | 压测 / 集成测试 / 日志分析 | P99 延迟、QPS、错误率、恢复时间 |
| 前端应用 | Lighthouse / 构建产物分析 / 单元测试 | LCP、性能分、包体积、覆盖率 |
| 移动端 | 真机调试 / Profiler | 冷启动时间、帧率、内存峰值、崩溃率 |
| 大数据 | 任务跑批 / 数据校验 | 吞吐、延迟、一致性抽查通过率 |
| SRE 工具链 | 故障注入 / SLI/SLO 观测 | 可用性、MTTR、告警覆盖率 |
③ 与教学流程对齐:通过标准落在六步走的第 ⑤ 步(验证环节),第 ⑥ 步面试追问另附 2–3 道连环题。
④ 最重要的一条——验"做出来" ≠ 验"理解":
通过标准验的是动手结果(压测达标/测试通过/口述成因不混淆);知识点是否"已完成"还需学员确认理解。模块完成 = 通过标准达成 且 所含知识点均已确认理解。
这一句把上一篇讲的"讲解 ≠ 完成"红线直接接进了模块的完成定义里——协议文件之间是相互咬合的,不是各自为战。
八、质量自检清单:生成器的单元测试
模块池生成后,逐条自检、全部通过才允许进入下一阶段:
- 模块数在 8–14 之间
- 每个模块都有明确的 layer、prerequisites、duration、priority_by_goal
- 依赖图无环;L1 模块无前置;每个模块的前置都在它之前
- 每个模块都有可执行的、量化的通过标准
- 覆盖了该技术栈"面试最高频"的至少 80% 考点
- 有一个贯穿全课程的统一项目载体,每个模块的实战都能在其中落类
- 难度曲线平滑:不存在"前一模块入门、后一模块突然实战"的无铺垫跳跃
这份清单就是生成器的单元测试:模型自己产出、自己核对,不通过就回到对应步骤修改。它和上一篇的门禁、第一篇的量规,是同一种思想的三个应用场景——不要让关键质量依赖模型的自觉,要让检查成为流程的一部分。
九、四份范例:小样本撬动大确定性
协议的最后一部分,也是整个设计里最"贵"的资产:Redis(14 模块完整版)、Kafka(12)、MySQL(10)、Vue(10)四份模块池范例,外加一个"缓存三大坑"模块的完整详卡(元数据 + 六段式:场景引入→概念解释→原理简述→实战落地→通过标准→面试连环追问)。
协议对范例的定位写得很清楚:
以下示例供你模仿风格与粒度,不是让你背诵内容。为其他技术栈生成时,结构、元数据齐全程度、通过标准的具体程度都要对齐这些范例。
四份范例 × 四种载体(后端 ×3 + 前端 ×1),恰好覆盖"教会模型什么叫合格的粒度"所需的最小样本集。
这份投入的直接回报就是 R7 一致性测试(详见专栏第 1 篇):两个独立会话、逐字相同的学员剧本,各自生成 Redis 模块池——14/14 模块名一致、层归属一致、元数据全同、自检清单两次全过,综合相似度 100%(门槛 ≥70%)。报告给出的结论:
协议 §7.1 的少样本范例对生成起到强锚定作用,模块池生成具有高度确定性。
范例质量 = 生成质量。 想提升某个新载体的生成效果,别调 prompt 措辞,去打磨范例。
十、与诊断结论联动:同一份模块池,三种学员
协议最后一节回答了"个性化"问题:模块池生成时必须按诊断结论调整——
| 学员水平 = 深入 | 已掌握知识点所在模块降级为"快速验证模块"(0.25 天,通过标准=入学测);L1 整体降级,省下的时长让给 L3/L4 |
| 学员水平 = 入门 | L1 时长不变但优先级上调;提示总时长可能拉长 20–30% |
| 目标 = 面试冲刺 | 按"面试冲刺"优先级降序推荐;L4 中面试优先级 ≥8 的模块不可裁剪 |
| 目标 = 项目落地 | L4 实战层提前到 L3 之前;通过标准改写为"产出可复用代码 + 验证达标" |
| 目标 = 特定场景 | 以场景反推所需模块链(“订单超时关闭"→ 01→03→08→12),链外标记"可选”,协商阶段由学员决定 |
注意设计边界:个性化不是"生成不同的池子",而是"在同一份池子上做有规则的变换"——池子的确定性保住了,个性化由联动规则承担。
十一、可复用清单
设计你自己的"动态生成"类 Agent 前过一遍:
- 预置的是"生成协议"还是"内容"?加新领域时改规则还是加特例?
- 生成单元有明确的粒度标准吗?禁止形态写出来了吗?
- 有与领域无关的"分层/分类"判定标准吗?
- 生成产物有结构化元数据吗?能按目标重排吗?
- 验收标准是"可执行的做一件事",还是"理解某概念"?
- 有量化指标吗?指标按载体类型区分了吗?
- 有生成后的自检清单吗?不通过有回退路径吗?
- 有几份覆盖不同载体的范例?范例风格就是质量上限吗?
- 做过跨会话一致性测试吗(同输入多次生成比对)?
- 个性化是"变换同一份产物"还是"每次重新生成"?
十二、总结
#mermaid-svg-B9HmCVPO9RPstRWP{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-B9HmCVPO9RPstRWP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-B9HmCVPO9RPstRWP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-B9HmCVPO9RPstRWP .error-icon{fill:#552222;}#mermaid-svg-B9HmCVPO9RPstRWP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-B9HmCVPO9RPstRWP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-B9HmCVPO9RPstRWP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-B9HmCVPO9RPstRWP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-B9HmCVPO9RPstRWP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-B9HmCVPO9RPstRWP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-B9HmCVPO9RPstRWP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-B9HmCVPO9RPstRWP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-B9HmCVPO9RPstRWP .marker.cross{stroke:#333333;}#mermaid-svg-B9HmCVPO9RPstRWP svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-B9HmCVPO9RPstRWP p{margin:0;}#mermaid-svg-B9HmCVPO9RPstRWP .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-B9HmCVPO9RPstRWP .cluster-label text{fill:#333;}#mermaid-svg-B9HmCVPO9RPstRWP .cluster-label span{color:#333;}#mermaid-svg-B9HmCVPO9RPstRWP .cluster-label span p{background-color:transparent;}#mermaid-svg-B9HmCVPO9RPstRWP .label text,#mermaid-svg-B9HmCVPO9RPstRWP span{fill:#333;color:#333;}#mermaid-svg-B9HmCVPO9RPstRWP .node rect,#mermaid-svg-B9HmCVPO9RPstRWP .node circle,#mermaid-svg-B9HmCVPO9RPstRWP .node ellipse,#mermaid-svg-B9HmCVPO9RPstRWP .node polygon,#mermaid-svg-B9HmCVPO9RPstRWP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-B9HmCVPO9RPstRWP .rough-node .label text,#mermaid-svg-B9HmCVPO9RPstRWP .node .label text,#mermaid-svg-B9HmCVPO9RPstRWP .image-shape .label,#mermaid-svg-B9HmCVPO9RPstRWP .icon-shape .label{text-anchor:middle;}#mermaid-svg-B9HmCVPO9RPstRWP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-B9HmCVPO9RPstRWP .rough-node .label,#mermaid-svg-B9HmCVPO9RPstRWP .node .label,#mermaid-svg-B9HmCVPO9RPstRWP .image-shape .label,#mermaid-svg-B9HmCVPO9RPstRWP .icon-shape .label{text-align:center;}#mermaid-svg-B9HmCVPO9RPstRWP .node.clickable{cursor:pointer;}#mermaid-svg-B9HmCVPO9RPstRWP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-B9HmCVPO9RPstRWP .arrowheadPath{fill:#333333;}#mermaid-svg-B9HmCVPO9RPstRWP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-B9HmCVPO9RPstRWP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-B9HmCVPO9RPstRWP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B9HmCVPO9RPstRWP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-B9HmCVPO9RPstRWP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B9HmCVPO9RPstRWP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-B9HmCVPO9RPstRWP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-B9HmCVPO9RPstRWP .cluster text{fill:#333;}#mermaid-svg-B9HmCVPO9RPstRWP .cluster span{color:#333;}#mermaid-svg-B9HmCVPO9RPstRWP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-B9HmCVPO9RPstRWP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-B9HmCVPO9RPstRWP rect.text{fill:none;stroke-width:0;}#mermaid-svg-B9HmCVPO9RPstRWP .icon-shape,#mermaid-svg-B9HmCVPO9RPstRWP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B9HmCVPO9RPstRWP .icon-shape p,#mermaid-svg-B9HmCVPO9RPstRWP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-B9HmCVPO9RPstRWP .icon-shape .label rect,#mermaid-svg-B9HmCVPO9RPstRWP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B9HmCVPO9RPstRWP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-B9HmCVPO9RPstRWP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-B9HmCVPO9RPstRWP :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
动态模块池
元协议预置方法不预置内容 / 改规则不加特例
模块标准单一知识点 / 可验收 0.5-2天
分层 L1-L4判定标准与载体无关
五步法知识地图 8-14个 / 自检清单
通过标准做出来≠听懂 / 量化指标按载体
范例杠杆四份范例 / R7 一致性100%
一句话总结:通用性的答案不是"什么都预置",而是"把生成方法本身协议化"——粒度标准、分层判定、量化验收、自检清单、风格范例五件套,让动态生成拥有预置内容级的确定性。
📌 系列导航:AI Agent 工程实践专栏
- 第 1 篇:如何科学地评估一个 AI Agent(Skill Lift +275% 全记录)
- 第 2 篇:协议化 Prompt 设计(Markdown 硬约束)
- 第 3 篇:Agent 跨窗口状态续接(CONTEXT.md + TRACE.md 双文档模式)
- 本篇:如何设计"通用型"Agent Skill(动态模块池 vs 预置内容)
- 下篇:什么是 Agent Skill?Anthropic Skills 规范拆解(入门)
你在做"通用型 Agent"时怎么保证生成质量的?few-shot 范例你放了几个?评论区交流 👇 觉得"范例质量 = 生成质量"这个洞察值一个点赞 + 收藏,下一篇回到入门视角,聊聊 Agent Skill 这个形态本身。


