V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hamsterbase
V2EX  ›  程序员

🌙 一觉醒来 UI 全自动对齐: AI + E2E 的奇妙实践

  •  
  •   hamsterbase ·
    carytrivett · 15 小时 46 分钟前 · 2898 次点击

    本文为真实经历,使用微信语音口述,然后 chatgpt 协助整理排版。 下面 token 数据是 ccusage 生成。

    1. 原始需求

    我基于 Vue 重新设计了一套页面 UI ,整体页面结构与现有版本基本一致,但在样式上做了较多微调,涉及 6–7 个文件。 这套 UI 只包含渲染逻辑,不包含任务逻辑,可以理解为一份 Vue 版本的“设计稿”。

    而原始项目是用 React 编写的,内部承载了完整的业务逻辑,因此在调整 UI 时,不应该触动业务逻辑。

    我的目标是:在 React 项目中,还原出 Vue 版本的 UI 效果。


    2. 实现思路

    我没有直接手动改 UI ,而是选择让 AI + 测试驱动来完成这件事:

    1. 先让 AI 编写一个 E2E 测试:

      • 分别在本地构建 Vue 和 React 页面
      • 使用 Playwright 打开两个页面
      • 通过 JS 操作页面,让两边展示相同内容(保证“可比性”,即内容一致,仅样式不同)
    2. 对两个页面进行自动截图,并进行图片 diff:

      • 计算视觉相似度
      • 标记像素差异
    3. 写一个 loop ,在我睡觉前启动:

      • AI 根据 diff 结果自动修改 React UI
      • 持续迭代,直到测试通过(即视觉差异收敛到可接受范围)

    3. 最终结果

    早上起床收菜。

    React UI 成功对齐 Vue 设计稿。

    整个过程无需人工干预,最终效果完全达到预期 🚀


    4. 补充说明(成本 & 运行情况)

    这次实验的代价也非常“真实”:

    • ccusage 花费约 200 美元

    根据 /context 输出:

    • 当前 session 使用约 300k tokens(占 1M 上下文窗口的 30%)

    其中:

    • 系统提示:5.8k tokens
    • 系统工具:8.5k tokens
    • 记忆文件:37 tokens
    • Skills:507 tokens
    • 消息内容:284.8k tokens (占绝大部分)

    👉 主要消耗来源: Ralph Loop 的反复迭代

    任务完成后,由于 stop hook 没有正确终止,循环仍然持续触发,累计执行了数百次:

    Stop says: 🔄 Ralph iteration 1466 | No completion promise set - loop runs infinitely
    

    5. 费用明细

    │ Date       │ Models      │ Input  │ Output │ Cache Create │ Cache Read │ Total Tokens │ Cost (USD) │
    │ 2026-03-19 │ - haiku-4-5 │ 10,311 │ 31,789 │ 710,709      │ 422,494,228│ 423,247,037  │ $268.22    │
    │            │ - opus-4-6  │        │        │              │            │              │            │
    

    6. 额外补充

    我使用的是 claude code max 订阅

    其中 Cache Read 是免费的,因此虽然账面上有较高的 token 消耗,但实际成本并没有那么高

    整体来看,大约消耗了 5 小时 token 限额的 5% 左右

    13 条回复    2026-03-19 11:54:24 +08:00
    rocmax
        1
    rocmax  
       15 小时 40 分钟前 via Android
    为什么不用 figma 出设计稿
    hamsterbase
        2
    hamsterbase  
    OP
       15 小时 38 分钟前
    @rocmax 非专业设计师,业余项目。 和 ai 一起,所以用 html 设计项目。
    hamsterbase
        3
    hamsterbase  
    OP
       15 小时 37 分钟前
    @rocmax 之前也试过 figma 和 html 完美对齐,但是没实践成功。figma 渲染和 html 渲染在像素层面有差异, 而且有的设计稿不规范,层级关系很乱。
    sillydaddy
        4
    sillydaddy  
       15 小时 30 分钟前
    感谢分享!

    请问是迭代了 1500 次吗,input 和 cache create 总共才 70 多万。相当于每次 diff 只有差不多 1000 个新 token 提示词输入吗?

    我设想中的这种迭代是多轮次的,每次迭代都重新启动一个 Claude Code 的对话 session 。看样子你是在一轮对话里面完成的吗?
    hamsterbase
        5
    hamsterbase  
    OP
       15 小时 23 分钟前   ❤️ 1
    @sillydaddy

    claude code plugin 商店的 ralph-loop 插件实现的。

    /ralph-loop:ralph-loop PROMPT [--max-iterations N] [--completion-promise TEXT]

    我本人就写了一段提示词而已。


    停止条件。

    1 。npm run test:ui 通过
    2 。 'today-image-diff.spec.ts' 不造假
    bigdogbigpig
        6
    bigdogbigpig  
    PRO
       14 小时 35 分钟前
    很强,cc 真的很强
    Solix
        7
    Solix  
       14 小时 29 分钟前
    timespy
        8
    timespy  
       13 小时 53 分钟前
    好思路,收藏
    duuu
        9
    duuu  
       13 小时 27 分钟前
    这个就是靠大力出奇迹。。
    rm2788
        10
    rm2788  
       12 小时 49 分钟前
    请问博主两个问题:

    > 计算视觉相似度 和 标记像素差异
    这个具体要怎么做?

    > 持续迭代,直到测试通过(即视觉差异收敛到可接受范围)
    这个是根据上面说的相似度小于某个值吗?
    L5411
        11
    L5411  
       12 小时 42 分钟前
    300k tokens 耗费 200$ 吗
    hamsterbase
        12
    hamsterbase  
    OP
       12 小时 25 分钟前
    @L5411 你看后面, 有 422M 的 cache read 。

    我睡觉时候跑的,后面一直死循环请求了 1000 多次,导致 token 爆炸。
    hamsterbase
        13
    hamsterbase  
    OP
       12 小时 22 分钟前
    有现成项目 https://github.com/mapbox/pixelmatch 。 我和 ai 描述了我的需求,它自动安装这个仓库然后编写了对比脚本。

    因为是两个 html 对比,所以我的规则像素完全一样。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1776 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 133ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    ♥ Do have faith in what you're doing.