Shopify的π的自主实验循环扩展插件 !
Shopify用这个扩展插件加速了Shopify的模板引擎:
- 对 Liquid 代码库运行了 /autoresearch 命令:解析和渲染综合速度提升 53%,对象分配减少 61%。
- https://github.com/Shopify/liquid/pull/2056
最重要的是:我们开源了pi的/autoresearch插件。你只需告诉它你的需求,剩下的就交给它来完成。
pi-autoresearch是受karpathy/autoresearch的启发。适用于任何优化目标:测试速度、软件包大小、LLM 训练、构建时间、Lighthouse 分数。
本插件扩展Extension程序采用与领域无关的基础架构;技能编码了领域知识。
这种分离意味着一个扩展程序可以服务于无限多个领域。
┌──────────────────────┐ ┌──────────────────────────┐ |
1、Extension(全局执行引擎)
可以理解成一个“通用优化操作系统”,负责:
- 跑实验(run_experiment)
- 记录结果(log_experiment)
- 可视化(dashboard)
- 控制循环(继续 or 停止)
它完全不关心你在优化什么。
2、Skill(领域插件)
Skill 才是灵魂:它定义了一个优化问题:
- command:怎么执行(例如 pnpm test)
- metric:优化目标(时间 / 体积 / 分数)
- scope:允许修改的范围
- ideas:搜索空间(优化策略)
Extension 不需要变:只换 Skill = 换一个行业!
自动化“实验驱动优化”
传统优化是这样的:
- 人猜一个优化点
- 改代码
- 跑测试
- 看结果
- 再猜
这个系统做了什么?
把这个循环彻底自动化:
提出优化想法 |
这本质上是: “工程版强化学习 + A/B 测试 + AutoML 的混合体”
置信度评分
在一次实验中完成 3 次以上实验后,pi-autoresearch 会计算一个置信度分数——衡量最佳改进与该次实验噪声基底的对比情况。这有助于区分真正的性能提升和基准测试的波动,尤其是在机器学习训练、Lighthouse 评分或不稳定的基准测试等噪声信号上。
工作原理:
- 使用当前段中所有指标值的中位数绝对偏差 (MAD)作为稳健的噪声估计器。
- 置信度 = |best_improvement| / MAD。得分 2.0× 表示最佳改进效果是噪声基底的两倍。
- 显示在小部件、展开的仪表板和log_experiment输出中。
- 对autoresearch.jsonl每个结果进行事后分析。
- 仅提供建议——绝不会自动丢弃。当置信度较低时,系统会引导智能体重新运行实验,但最终的保留/丢弃决定权仍掌握在智能体手中。
最关键的创新:记忆系统
1、autoresearch.jsonl(事实日志)
这是: 不可篡改的实验历史,每一条记录:
- metric(指标)
- status(成功/失败)
- commit(代码版本)
- description(改了什么)
2、autoresearch.md(认知层)
这是: AI 的“思考笔记”
记录:
- 目标是什么
- 尝试过什么
- 哪些是死路
- 哪些有效
传统 AI:上下文一断 → 全忘
这个系统:
- 新智能体进来
- 读 jsonl(事实)
- 读 md(经验)
- 直接接管
Shopify用这个扩展插件加速了Shopify的模板引擎:
- 对 Liquid 代码库运行了 /autoresearch 命令:解析和渲染综合速度提升 53%,对象分配减少 61%。
- https://github.com/Shopify/liquid/pull/2056:Shopify Liquid性能优化报告,揭示通过分配驱动、字节扫描等策略,实现解析快61%、渲染快20%,且无功能回退的工程奇迹。
整体成果(量化效果)
- Parse + Render 总时间:7,469µs → 3,534µs,-53%
- Parse 时间:6,031µs → 2,353µs,-61%
- Render 时间:1,438µs → 1,146µs,-20%
- 对象分配:62,620 → 24,530,-61%
autoresearch驱动优化(autoresearch loop)
优化流程:
- 修改代码
- 提交 commit
- 自动跑单元测试
- 运行基准
- 保留或回退
- 总共约 120 次自动实验
- allocation-driven:减少对象分配 → 降低 GC 占用
- GC 占 CPU 74%,每减少一次分配对性能收益巨大
核心启示
- Allocation-driven optimization:减少对象分配对 Ruby 性能决定性
- Byte-level scanning:C-level regex + byteindex 提速显著
- Fast-paths:变量解析、渲染、条件判断的快速路径
- 实验循环:autoresearch loop 让大改动可控、可验证