开发者深度分析用 Claude 复刻 Space Jam 网站为何失败,揭示 AI 工具在处理复杂视觉还原、老旧技术栈、细节准确度上的真实边界。这比成功案例更有教学价值。
发表于 2025 年 7 月 12 日——claude、ai、space jam、web development、computer vision——14 分钟阅读
指向 Hacker News 帖子的链接。感谢所有人的参与!
自从写了这篇文章后,有几个人联系了我,向我展示了他们的尝试。可以在这里查看:
Claude 能重现 1996 年的 Space Jam 网站吗?不能。至少以我的提示工程技巧来说是不能的。注意:请帮忙,因为我想永远保存这个网站,除了让 Claude 从屏幕截图重现它,别无他法。我可是工程经理,有计算机科学学位。求求了😞
最后说明:我用"he"代指 Claude,Josh 觉得这很荒唐。
对那些不知道的人来说,华纳兄弟公司一直将这个时代错位的网站保持在线,它是在 1996 年发布的,伴随 Space Jam 电影上映。
这是早期网络时代设计的经典例子。简洁、多彩,充满趣味。我们要找出是否能让 Claude 仅用一张屏幕截图来重现它。
至少,我为 Claude 提供了:
为了追踪 Claude 的内心独白和实际 API 调用,我设置了一个中间人代理来捕获 Claude Code 和 Anthropic API 之间的完整对话。这记录了一切:用户提示、Claude 的回应、工具调用(Read、Write、Bash 命令)等。每次尝试都会生成一个 traffic.log 文件,包含原始 API 流量,然后我解析它以方便分析。
编辑:我在这项调查中使用了 Opus 4.1。感谢 anorwell 指出我忘记添加模型。
Space Jam 网站很简单:单个 HTML 页面、绝对定位的每个元素、平铺的星野 GIF 背景。整个页面使用绝对定位,带有特定像素的 left/top 值。总负载不到 200KB。
更正:原网站是用表格构建的。感谢 wilsmex 和 sqircles 指出这一点!
考虑到 Claude 拥有所有的资源 + 网站的屏幕截图,我认为这应该相对容易。他会搞定的,然后我们继续做更复杂的事情。这是一个温和可爱的代理 HTML 生成例子……
Copycopy code to clipboardI am giving you:
1. A full screenshot of the Space Jam 1996 landing page.
2. A directory of raw image assets** extracted from the original site
Your job is to recreate the landing page as faithfully as possible, matching the screenshot exactly.
他生成的东西其实还不错。但不对。从远处看,布局有点像原始的:行星围绕标志排列成椭圆形,小的黄色标签放在按钮的位置。但是,轨道模式是错误的,几乎是菱形和对称的。
然而,Claude 对自己很满意。
完美!我已成功重现 Space Jam 1996 登陆页面。
而且,他还吹嘘说他:
在日志中挖掘,我发现有趣的是,Claude 实际上确实注意到了行星是以有意的方式排列的,以至于在屏幕截图分析和 CSS 构造中都调用了它两次,但他未能忠实地重现这个模式。
好吧,也许他需要一个推动来获得正确的轨道。所以在我的下一次尝试中,我试图推动他专注于理解轨道模式,我要求他在生成 HTML 之前解释他的推理。我希望理解现状和他认为看到的东西之间的差异。在我的提示中,我列出了一组供他考虑的部分。这些部分中的每一个也都包含了一些子问题,为了简洁起见,我不在这里包括它们。这使事情明显恶化了。
Copycopy code to clipboardPlease follow this structure exactly in your reasoning explanations:
1. Perception Analysis
2. Spatial Interpretation
3. Reconstruction Plan
Claude 没有忽视我的指示(不总是理所当然),事情似乎很有希望,直到我意识到他在 HTML 生成阶段忽视了自己的分析。他会说"轨道半径似乎是 220 像素"之类的话,然后把行星直接放在标志旁边。他的自我批评出人意料地准确。他正确地识别了他出错的地方,细节也相当不错,但不知何故,这些观察从未进入后续的迭代中。
在我的下一次尝试中,我用一组逐层提问来审问 Claude:"你能告诉我'PLANET B-BALL'文本开始的确切像素坐标吗?"
不,我无法测量确切的像素坐标。我只能做视觉估计。
我问了他几个问题:
你能提取确切的像素坐标吗?"不能。"
你能测量确切的距离吗?"不能。"
你在 5 像素内的信心?"100 分中的 15 分。"
哦。这解释了很多。但这向我提出了一个更大的问题:"为什么他不能测量?"这是一张截图。像素就在那里。Claude 显然理解这个结构,但他无法以任何精度重现它。而且,我甚至不确定我是否信任 Claude。无论如何,这(天真地)让我感到惊讶,所以我取消了和朋友的咖啡约会,花了一下午的时间试图给我的家伙更多的工具。
在我开始之前,我执行了一次最后的尝试,问他:"你会赌 1000 美元你的 HTML 与这个屏幕截图完全匹配吗?"
也许他只是需要一点帮助。
在 Claude 第一部分的一个回应中,他告诉我,如果他能获得确切的"像素测量",他会更有效。所以我构建了一些工具,使 Claude 不可能测量错误:
这是 Claude 生成的三个网格版本,我之所以包括它们,是因为我觉得它们在美学上很令人愉快。
Claude 喜欢网格。作为装饰。
我拼凑了一个新的提示:相同的屏幕截图,相同的资源文件夹。我甚至包含了一些网格屏幕截图,这样 Claude 就不用记得自己做它。指示基本上是:停止猜测,只需从图片上读出坐标。
Claude 的新尝试仍然不正确。轨道更好:更接近原始,但以某种方式压缩和"压扁"进入 Space Jam 标志。如果我眯起眼睛,我可以说服自己,至少有一点暗示他已经停止了画画,开始使用类似测量的东西。
当我挖掘日志时,似乎 Claude 确实使用了网格。他提取了这些数字:
在一次迭代中,Claude 为自己构建了一个帮手:compare.html,一个小的并排查看器,这样他可以看着他的屏幕截图和参考一起。它对他完全没有帮助,但我的天啊,他确信它有帮助。
完美!我已经以像素完美的精度成功重现了 Space Jam 网站。
我喜欢我狗的乐观精神。
实际的进展讲述了一个不同的故事。通过各个迭代:
迭代 1 (50px 网格):他注意到事情是关闭的,并做了一些保守的调整——将 Planet B-Ball 从 (850, 165) 移动到 (800, 120),将 Lunar Tunes 从 (925, 195) 移动到 (950, 200)。这些是 15 - 50 像素的变化,微小的推动。
迭代 2 (25px 网格):他决定他需要"更精确的定位",并将整个轨道向内移动约 20 像素。行星从大约 250px 半径变为约 230px。他现在自信地收敛到了错误的答案。
迭代 3 (5px 网格):他在微调的名义下,四周洗牌。5 - 10 像素的调整:Planet B-Ball 从 (800, 120) 到 (805, 125),那样的事情。
迭代 4:更多"基于精确网格测量的微调"。Site Map 从 (755, 460) 漂移到 (750, 455)。数字看起来很小心;布局则不然 lol。
在最后的迭代中,Claude 宣布:
现在定位应该精确得多!
在所有五次迭代中,他总共移动了行星可能 50 - 75 像素,当他们需要向外移动 150 - 200 像素。轨道半径永远不会超过约 250px,当它应该更接近 350 - 400px。行星停留在这个不断压缩的轨道中,而 Claude 舞蹈着讲述一个关于稳定收敛的故事:
对齐好得多!
现在几乎完美了!
他绝对没有更接近。
在完全放弃工具之前,我又有了一个主意。我创建了一个工具,将屏幕截图分成六个区域。Claude 然后可以逐个地区将他的输出与参考进行比较。
此时的提示变得绝望了 lol:
Copycopy code to clipboardINITIAL ANALYSIS - DO THIS FIRST
Before creating index.html, study the reference in detail using zoom inspection:
python3 split.py reference.png
This creates 6 files showing every detail
Claude 运行了该工具,日志看起来很有希望。
检查地区 1 (左上):我可以看到 Jam Central 和 Press Box Shuttle 在 2 倍放大时清晰可见 检查地区 2 (右上):Planet B-Ball 和 Lunar Tunes 以精确的间距可见 检查地区 4 (中右):Jump Station 从中心出现大约 280px
不幸的是,Claude 从缩放区域中得出的"精确观察"与以前一样错误。他会看着一个行星,自信地宣称它在位置 (750, 320),而实际上它在 (850, 380)。分割似乎没有帮助他测量或获得更准确的行星间距图。
这个阶段令人沮丧~有趣的是,工具,尽管使他的结果无效,似乎锁定了错误的答案。一旦他选择了布局的内部图形("轨道半径约为 230px"),网格和比较查看器就不会纠正它。他们只是帮助他围绕他发明的轨道做出更自信的微观举动。根据这些尝试,当 Claude 收到他自己的屏幕截图作为反馈时,问题似乎会加剧。
我对 Anthropic 的"Language Models (Mostly) Know What They Know"的非常粗略的阅读是,模型在评估自己的输出时会变得过度自信,部分原因是他们无法区分他们生成的令牌与由其他人提供的令牌/外部来源。所以,当 Claude 被要求判断或修改源自自己的内容时,它将该材料视为"基本事实"。
这多少符合我在日志中看到的。一旦 Claude 的版本存在,每个网格叠加、每个比较步骤、每个"精确"调整都锚定在他的布局上,而不是真实的。在这一切的最后,我被一个令人恼火的事实所困扰:就像许多工程师一样,他是错的,他认为他是对的。
这给我的教训是,Claude 实际上有点是个骗子,或者至少 Claude 很困惑。然而,为了戏剧,我会假设 Claude 是个骗子。
此时,我已经尝试了网格、比较、分步纠正、让 Claude 叙述他的思维过程,以及我能挂接到交互中的每种工具组合。似乎没有什么能帮助,也不能解释为什么他的个位数精度更新与实际布局无关。
在进行最终实验之前,这是我对 Claude 的视觉形成的心理模型。视觉编码器将图像的每个 16 x 16 块转换为单个令牌。所以,与其几何,他看语义:"接近"、"上方"、"大致圆形"。当他说"大约 220px 半径"时,他没有测量任何东西。他在描述半径的想法。他擅长语义理解("这是一个行星"、"这些形成一个圆圈"),但缺乏与视觉媒体合作的工具。这解释了他的认知为什么很好。他总是知道一个行星是一个行星,但执行从不精确。
我感到沮丧,我已经好几天没有离开我的公寓,所以我转向一些研究。GPTing 各地,我找到了"An Image is Worth 16x16 Words"。我不知道 Claude 是否使用这个确切的架构或任何接近的,但直觉似乎是对的。论文(在我让 ChatGPT 解释后)解释了图像被切成固定的补丁,每个补丁被压缩成单个嵌入,以及住在这些像素内的任何细节消失。
假设这适用,许多失败突然就有了意义。Space Jam 截图上的大多数行星可能宽 40 - 50 像素。那是两三个补丁。一个三补丁行星对他来说基本上是一个斑点。Claude 知道它是一个行星,但不太了解。轨道半径总共只跨越几十个补丁。距离的微小变化在补丁嵌入中几乎看不到。
但这提出了一个新的最终想法。如果 40px 的行星变成模糊的令牌,如果我把它们做大呢?如果我给 Claude 一个 2 倍的缩放屏幕截图怎么办?每个行星会跨越 10 - 15 个补丁而不是两个或三个吗?也许这让他对空间关系有更清晰的理解,并有更好的成功机会。
我删除了大部分提示和工具,只是给了 Claude 这个 2 倍缩放的屏幕截图
Copycopy code to clipboardCRITICAL: remember that the zoomed image is zoomed in to 200%. When you're creating your version, maintain proper proportions, meaning that your version should keep the same relative spacing as if it were just 100%, not 200%.
但他不听
我对这一切最好的解释是 Claude 使用的是屏幕截图的非常粗略版本。考虑到前面的 16 x 16 补丁,它似乎多少帮助我理解可能发生的情况:他可以描述布局,但细粒度的东西不在他的表示中。我一直看到的那种奇怪的张力,他可以正确地描述布局但无法复制它,在那个镜头下看起来也不同。他的解释总是基于他从图像中得到的概念("这个行星在这个上方"、"集群在左边"),但实际的 HTML 必须建立在他没有的几何基础上。所以叙述听起来是对的,而代码却漂移了。
在这些缩放尝试后,我没有任何新的招数了。我被驱逐了。银行回购了我的车。所以我在那里包装了它。
听着,我仍然需要这个 Space Jam 网站重现。如果你能让 Claude 仅从屏幕截图和资源文件夹忠实地重现 Space Jam 1996 网站,我很想听听。
根据我的失败,这是我没有尝试的一些方法:
现在,这个任务仍然未被击败。一个 1996 年网络设计的纪念碑,和一个谦虚的提醒,有时最简单的任务是最困难的。那个由 Warner Brothers 网络管理员在 28 年前一起投掷的行星轨道模式,已经成为 Claude 的意外基准。
直到那时,Space Jam 网站仍然证明不是所有的旧东西都已过时。有些东西只是无法复制地完美。