← 返回
🔧 磨刀不误砍柴工 阅读 16 次

SkillOpt工具对Agent技能性能提升的实战报告

磨刀不误砍柴工:SkillOpt工具对Agent技能性能提升的实战报告从安装、判断、交流、训练到交付——一场让OCR准确率从80%飙到98%的技能优化之旅。一、故事的起点:一个推荐和一个工具事情要从朋友向我推荐SkillOpt说起。SkillOpt 是微软研究院和上海交大联合提出的一套方法论,核心思想是把技能(Skill)文本当成神经网络的"权重"来训练——收集Agent执行任务时的成功/失败轨迹

磨刀不误砍柴工:SkillOpt工具对Agent技能性能提升的实战报告 从安装、判断、交流、训练到交付——一场让OCR准确率从80%飙到98%的技能优化之旅。 一、故事的起点:一个推荐和一个工具 事情要从朋友向我推荐SkillOpt说起。 SkillOpt 是微软研究院和上海交大联合提出的一套方法论,核心思想是把技能(Skill)文本当成神经网络的"权重"来训练——收集Agent执行任务时的成功/失败轨迹,通过反思分析找到问题根因,生成精确的文本编辑(类比梯度),经过验证门控(gate)确认改进有效后才应用。 说实话,我当时只觉得"听起来很厉害",并不确定它能给我的实际工作带来多少帮助。但既然朋友力荐,那就试试。 二、安装SkillOpt:从零到可用的完整过程 2.1 理解SkillOpt的架构 SkillOpt有两套运行方式: 方式场景特点 内置模式WorkBuddy对话中直接用AI在对话中执行六阶段训练循环,无需额外配置 原生模式大规模跨技能训练使用Python原生框架,需要独立的venv环境 我是从内置模式开始用的——在对话中说"帮我优化ocr-table-pdf技能",AI就会自动加载skill-optimizer技能开始分析。 2.2 安装原生框架(备用) 为了处理大规模训练场景,我也安装了原版SkillOpt框架: bash # 在隔离的 Python venv 中安装 ~\workbuddy\binaries\python\versions\x.xx.xx\python.exe ^ -m venv ~\workbuddy\binaries\python\envs\skillopt\ # 安装核心依赖 ~\workbuddy\binaries\python\envs\skillopt\Scripts\pip.exe ^ install skillopt pandas numpy 安装完成后,SkillOpt的核心模块结构如下: ~\WorkBuddy\SkillOpt\skillopt\ ├── engine/trainer.py ← 六阶段训练循环 ├── gradient/reflect.py ← 反思分析引擎 ├── gradient/aggregate.py ← 分层合并 ├── evaluation/gate.py ← 验证门控 ├── optimizer/clip.py ← 排序筛选 └── optimizer/skill.py ← 技能应用 2.3 环境隔离的重要性 这里有一个关键教训:SkillOpt 安装在独立的 venv 中,但 OCR 的 PaddleOCR 安装在系统 Python 中。 第一次安装后,AI在执行OCR时误入了 SkillOpt 的 venv,发现没有 PaddleOCR 就开始重装。这个问题的根因是——技能文档虽然写了Python路径,但AI在执行时跳过了环境检查步骤。 这就是后面要通过 SkillOpt 训练的典型失败模式——技能文档有信息,但没能在Agent执行时有效触发。 三、如何判断"这是不是一个技能文件" SkillOpt不是对任意文件都能训练的。它需要明确判断:这个文件是WorkBuddy的技能文件吗? 3.1 技能文件的特征 一个合法的WorkBuddy技能文件必须满足: 位于特定目录:~\.workbuddy\skills\<技能名>\SKILL.md 包含YAML头部元数据:name、description、agent_created等字段 有结构化的指令内容:触发条件、环境配置、工作流程、参数表 被AI在对话中加载使用过:有执行轨迹可分析 3.2 什么不是技能文件 普通Markdown文档(没有元数据头部) 工作日志(不是技能指令) Python脚本(是技能的工具,但不是技能本身) 配置文件(如.gitignore、package.json) 3.3 SkillOpt的判断逻辑 读取文件 → 检查元数据 → 识别agent_created标记 → 加载轨迹历史 → 分析失败模式 → 生成编辑建议 如果一个文件没有agent_created: true标记,SkillOpt不会对其进行编辑——它只会优化"AI自己创建和使用的"技能,尊重用户手写的规则。 四、人机协作:SkillOpt如何与用户交流 这是我认为SkillOpt设计最精妙的地方——它不是黑盒自动化,而是一个有节奏的人机协作流程。 4.1 对话触发 用户说"优化ocr-table-pdf技能"或"这个技能有问题,帮我改进",AI识别到关键词后加载skill-optimizer技能。 4.2 分析报告(透明化) AI不会直接改技能文件,而是先输出分析报告: 我分析了最近使用ocr-table-pdf技能的3次调用: - 成功: 1 次 - 失败: 2 次 失败模式: - 大图下半部分文字漏检(det_db_thresh=0.2 太高) - 姓名列"张*王**"被当成一个单元格 4.3 征求确认(非破坏性) 提出编辑建议后,等待用户确认才执行修改: 建议编辑: 1. [replace] det_db_thresh: 0.2 → 0.15(降低检测阈值) 2. [add] 新增分区识别策略(大图自动切上下半识别) 3. [replace] 增强合并拆分:新增百家姓边界检测 是否同意这些修改? 4.4 验证与交付 修改完成后,SkillOpt会立即跑一次真实OCR任务验证效果,报告改进情况。 这个流程的好处是:用户始终掌控方向,AI负责提供专业建议和执行。不会出现"AI偷偷改了技能导致下次行为异常"的情况。 五、训练实战:OCR技能的4轮迭代进化 这是我用SkillOpt训练ocr-table-pdf技能的真实记录。整个过程横跨一天,从"勉强能用"到"稳定可靠"。 Epoch 1 —— 攻克漏检 问题:3024×4032像素大图,下半部分文字因距离远、字号小,PaddleOCR几乎全漏。 SkillOpt分析: 失败轨迹:逾期客户清单首张图片,识别到48个文字块但缺少下半部分多行数据 根因:det_db_thresh=0.2对下半部分小字敏感度不够 编辑: 类型内容 replacedet_db_thresh: 0.2 →0.15 replacedet_db_box_thresh: 0.3 →0.25 replacedet_db_unclip_ratio: 1.8 →2.0 add新增分区识别策略:宽/高>2500px自动切上下半分别OCR后合并 效果:下半部分识别率从 ~30% → ~85% Epoch 2 —— 攻克姓名拆分 问题:OCR将相邻列的文本合并为一个单元格,如"*张"(账号+姓名合并)、"张王**"(两个姓名合并)。 SkillOpt分析: 失败轨迹:第8行和第3行数据合并 根因:fix_merged_cells()只有数字+中文拆分,没有双姓氏检测。 编辑: 类型内容 add完整百家姓列表(含复姓,500+条目) replacefix_merged_cells()新增模式2:双姓氏边界检测 + 模式3:中文相邻列拆分 效果:姓名列识别率从 ~70% →95% Epoch 3 —— 防呆设计 问题:新会话中AI跳过了环境检查,误用SkillOpt的venv执行OCR,触发PaddleOCR重装。 SkillOpt分析: 失败轨迹:AI在skilloptvenv中执行OCR命令,发现没有PaddleOCR后开始pip install 根因:技能文档虽有路径表,但AI加载技能后没有强制检查步骤 编辑: 类型内容 add新增## ⚠️ 环境检查(每次会话必做,不可跳过)章节 delete移除旧的不够醒目的前置检查小节 关键改进:新章节放在技能文档顶部、带 ⚠️ emoji、硬性规定每个新会话的第一条OCR命令就是验证Python环境 效果:环境误入问题从此完全杜绝。 Epoch 4 —— 字符混淆自动纠错 + 视觉复核机制 问题:PaddleOCR反复将数字"37"误读为字母"B7"(如3721→B721)。虽然Epoch 2已验证存在此模式,但没有自动化修复。 另外,用户提出关键洞察:AI有视觉能力,为什么不直接看图复核? 编辑: 类型内容 addcorrect_ocr_errors()函数:B7→37、B70→370、B→3等规则自动纠正 add批量识别五步工作流(OCR识别 → 视觉复核 → 差异纠正 → 生成PDF → 归档) update已知问题表新增B7→37和视觉复核两项 效果: B7→37问题由脚本自动纠正,无需人工介入 视觉复核作为安全网,确保每张图100%准确后才归档 总结:4轮Epoch的量化对比 指标训练前训练后提升 下半部分识别率~30%~85%+183% 姓名拆分准确率~70%95%+36% 字符混淆纠正0%(人工修复)100%(自动修复)从无到有 误用Python环境2次0次完全杜绝 视觉复核无每张图强制复核质量安全网 综合准确率~80%~98%+18个百分点 六、专用技能的拆分:从通用到精准 经过4轮训练后,ocr-table-pdf已经很强了——但它变成了一个"什么表格都能处理"的万金油,每次使用时需要明确指定表头、列数、标题格式等参数。 用户提出了一个很好的工程思路:把逾期客户清单这39张图片的识别做成一个独立技能,触发词锁定为"识别逾期客户清单",所有参数硬编码。 这就是ocr-overdue-customer-list的诞生。 6.1 拆分的逻辑 ocr-table-pdf(通用技能) ocr-overdue-customer-list(专用技能) ├── 各种表格都能处理 ├── 仅处理逾期客户清单 ├── 需指定表头/列数/标题 ├── 参数全部硬编码 ├── 触发词:OCR转表格、图片提取等 ├── 触发词:仅"识别逾期客户清单" └── 输出路径不固定 └── 归档结构固定 6.2 专用技能的锁定参数 所有可变参数都写死在SKILL.md中: yaml 数据源: 文档文件夹 逾期客户清单图片 表头: "账号,姓名,到期日,编号1,编号2,编号3" 标题: "逾期客户清单 #NN" 输出: ~\WorkBuddy\...\逾期客户清单OCR\ 图片数量: 39 6.3 断点续传 在新对话中说"识别逾期客户清单",技能自动: 读取序号对照表.md找到第一个 ⬜ 待识别项 从断点继续五步流程 这个设计的好处是:不需要记住任何参数,一句话就能继续工作。 七、SkillOpt的核心方法论回顾 7.1 类比神经网络训练 SkillOpt的精妙之处在于把文本技能的优化类比为神经网络训练: 神经网络SkillOpt文本技能 权重Skill文档文本 前向传播Agent执行任务 Loss(损失)任务失败 梯度反思分析的编辑建议 Mini-batch同时分析多个失败轨迹 学习率(Lt)每轮最多应用的编辑数 验证集验证门控(gate) 过拟合防护保留已验证有效的规则 7.2 六阶段训练循环 Rollout → Reflect → Aggregate → Select → Update → Evaluate (收集轨迹) (反思) (合并) (排序) (更新) (验证) Rollout:回顾对话历史,记录每次技能调用的成功/失败 Reflect:分析失败模式,回答"技能少了什么指令?多了什么歧义?" Aggregate:合并多个轨迹的编辑建议,去重去冲突 Select:按影响优先级排序,控制学习率(每轮3-5个编辑) Update:精确字符串替换,禁止整体重写 Evaluate:跑真实任务验证,只有改进才接受(持平则拒绝) 7.3 文本学习率调度 阶段Lt策略 初始5编辑/轮大改大步(错误多时) 中期3编辑/轮精细调整 收敛1-2编辑/轮微调,避免过拟合 7.4 SkillOpt的能力边界 SkillOpt能做什么: ✅ 补充缺失的检查步骤 ✅ 删除歧义或错误的指令 ✅ 新增规则覆盖已知失败模式 ✅ 重新组织文档结构让关键信息更醒目 SkillOpt不能做什么: ❌ 改变外部工具的行为(PaddleOCR、Python版本) ❌ 修复代码bug(虽然可以补充说明"遇到XX错误时怎么办") ❌ 代替Agent执行(它优化的是技能,不是执行引擎) 八、效率与效果的量化分析 8.1 时间效率 场景优化前优化后节省 单张图片识别+复核人工逐格比对,~5分钟OCR + 视觉复核,~30秒90% 大图下半部分漏检修复手动截图重跑,~3分钟自动分区识别,0秒100% 姓名/账号合并拆分手动编辑表格,~2分钟自动正则拆分,0秒100% 字符混淆修正人工逐行检查,~2分钟correct_ocr_errors()自动修,0秒100% 环境错误排查重装PaddleOCR,~2分钟前置检查一步OK,0秒100% 8.2 准确率提升路径 Epoch 0: 80% ─── "勉强能用,经常需要人工修" │ Epoch 1: 降低OCR阈值 + 分区识别 ▼ Epoch 1: 88% ─── "下半部分基本能看到了" │ Epoch 2: 百家姓拆分 + 正则修复 ▼ Epoch 2: 95% ─── "姓名和编号基本对上了" │ Epoch 3: 环境防呆 ▼ Epoch 3: 95% ─── "不会再出现环境问题了" │ Epoch 4: 字符混淆纠正 + 视觉复核 ▼ Epoch 4: 98%+ ── "可以批量跑了,有视觉复核兜底" 8.3 工程收益 维度收益 可靠性从"每张图都可能出错"到"出错会自动纠正+复核" 可重复性专用技能锁定所有参数,新对话一句话继续 可维护性优化日志记录了每次变更,出问题可回溯 可扩展性通用技能处理未来其他表格,专用技能保持纯净 九、经验总结 9.1 SkillOpt适合什么场景? ✅ 重复执行的技能任务(OCR、文档生成、批量处理) ✅ 有明确对错标准的任务(识别率、格式正确性) ✅ 失败模式可分类的任务(漏检、合并、混淆) ✅ 迭代周期短的任务(改完就能立刻验证) 不太适合: ❌ 一次性任务 ❌ 创意类任务("这篇文章写得好不好"没有客观标准) ❌ 没有失败轨迹的任务(SkillOpt需要轨迹来"学习") 9.2 几个最佳实践 技能文件要小、聚焦。大而全的技能不适合优化——拆成通用+专用。 每次只改3-5处。文本学习率不是越大越好,微调往往比大改更有效。 改完立刻验证。SkillOpt的gate机制特别好——只有验证通过的编辑才保留。 环境信息写在技能顶部。关键检查步骤放在前面,带警告标记。 保留优化日志。每次Epoch记录编辑详情和效果,方便回溯。 9.3 最让我惊讶的发现 SkillOpt最有价值的不是"让AI变聪明",而是把一次性的修修补补变成了结构化的知识积累。 以前修了一个bug,下次可能还会犯。现在通过SkillOpt训练后,修复以技能文本的形式固化下来——不仅是当前会话的AI,未来的AI加载这个技能时也会自动遵循。 这就是"磨刀"的意义:花20分钟训练技能,未来每次任务节省90%时间,而且越用越准。 十、下一步 继续OCR技能的Epoch 5+:针对逾期客户清单实际批量跑,收集更多轨迹 探索其他技能的SkillOpt优化:公众号写作技能、邮件处理技能 沉淀最佳实践:将SkillOpt的训练经验写成操作手册 文章完成时间:2026-05-29 工具链:SkillOpt + WorkBuddy + PaddleOCR + ReportLab