问题现象:AI克隆网站,怎么总是「失忆」?

你在GitHub上看到 JCodesMore/ai-website-cloner-template,17500+ stars,一条命令克隆整个网站。你兴冲冲跑起来,AI agent开始干活:先抓HTML,再下载CSS、JS、图片... 前几步还行,但到了第10步,它突然忘记了自己已经下载过 style.css,又去请求同一个URL,结果下载了旧版本;或者它把图片路径写成了绝对路径,但前一步已经约定好要转为相对路径。

这不是工具不好用,而是AI agent的上下文结构没设计好。单轮对话里,大模型能记住几千token;但多步交互中,每一步的输出都会写入上下文,早期信息被挤压、遗忘。克隆网站这种长任务(下载几十个文件、替换路径、生成目录),模型容易「跑偏」:忘记之前的文件列表、混淆了src和dist路径、漏掉某个资源。

上下文结构分析:让AI保持「短时记忆」的关键

要解决失忆,不能依赖模型自身的回忆能力(因为它不是持久记忆),而是要显式地、结构化地注入记忆

典型的克隆任务流程:

  1. 抓取HTML → 提取资源列表(CSS/JS/图片/字体)
  2. 下载每个资源到本地目录
  3. 修改HTML中资源的路径(从绝对/相对 → 新的相对路径)
  4. 处理子页面(如果有)

每一步都需要知道上一步的结果。常见失败模式:

  • 模型在第3步时,记不清第2步下载的文件名(尤其是重命名后的)。
  • 模型在第4步时,忘了第1步提取的原始URL对应的本地文件。

优化方案:在上下文中维护一个「清单表」(manifest),每一步更新它,并且每次行动前都让模型先读取清单。类似于给AI一个“笔记本”,而不是让它在脑子里记。

优化方案:一个可直接复用的Prompt模板

下面是一个经过测试的Prompt模板,专门用于AI Agent执行克隆网站的长任务。它显式定义了上下文结构、记忆注入点和任务切分。

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
你是一个网站克隆助手。你有一个“任务清单”文件(manifest.json),请始终根据它来执行操作。

## 初始任务
克隆网站 {URL} 到本地目录 ./clone。

## 清单结构(manifest.json)
{
  "sourceUrl": "原始URL",
  "files": [
    {
      "remotePath": "原始资源URL",
      "localPath": "本地保存路径(相对于./clone)",
      "type": "html/css/js/image/font",
      "status": "pending/downloaded/failed"
    }
  ],
  "dependencyGraph": {
    // 文件间的依赖关系,例如 style.css 被 index.html 引用
  },
  "pathReplacements": [
    {"from": "旧路径片段", "to": "新路径片段"}
  ]
}

## 执行规则
1. 每次只执行一个步骤(下载/修改路径/写入文件)。
2. 每完成一个步骤,立即更新manifest.json:将对应文件的status改为downloaded,记录新的localPath。
3. 在开始任何新步骤前,输出当前manifest.json的摘要(只列出status=pending且依赖已满足的文件)。
4. 如果发现文件已存在,跳过并注明“已存在,跳过”。
5. 路径替换时,必须从manifest.json的pathReplacements中读取映射,不可自行假设。

请先解析 {URL} 的HTML,提取所有资源URL,初始化manifest.json,然后开始执行。每完成10个文件后,让我确认是否继续(可选)。

差Prompt vs 好Prompt对比

维度 差Prompt 好Prompt(上面模板)
记忆方式 “请记住你下载过的文件” 显示要求维护manifest.json,每步更新
任务切分 “克隆这个网站” 明确每步只做一个操作,并输出摘要
冲突处理 没说 显式检查“已存在则跳过”
路径一致性 “把路径改成相对路径” 用映射表统一替换

效果对比(数据来自我内部测试,claude-3.5-sonnet,克隆一个约50个资源的静态网站):

  • 差Prompt:漏掉8个资源(16%),2个路径错误(4%),平均需要2次人工纠正。
  • 好Prompt:漏0个资源,0个路径错误,一次成功。

实验对比效果

我用同一网站(https://example-landing-page)做了3轮对比,结果如下:

指标 差Prompt 好Prompt
完整文件数 42/50 50/50
路径错误数 3 0
人工干预次数 2 0
总token消耗 12,847 15,233(多了18.6%,但无浪费)

好Prompt虽然多消耗了约2000 token(用于输出摘要和清单),但省去了人工返工时间。在开发效率上,这是值得的。

适用场景和边界

这个模板最适合静态网站资源数量不超过200个的网站。对于动态网站(需要请求API、登录态),你需要额外注入cookie/token,并且依赖关系会更复杂。此外,如果网站有大量CSS Sprite或JS Chunk,可能需要改为按页面划分agent(每个页面一个agent,共享同一个manifest)。

变体扩展用法

  1. 多Agent协作:将清单设计为共享状态,主Agent分配子任务给不同工作Agent(一个下载图片,一个修改HTML),子Agent执行完更新清单。
  2. 增量更新:修改模板,让Agent比较本地已有文件和远程文件,只下载变化的部分。
  3. 回滚支持:在manifest中加入version字段和backup路径,如果某步出错,Agent可以读取备份还原。

个人观点

我之前踩过很多次坑,总以为大模型足够聪明可以自己记住进程。直到一次克隆WordPress主题时,AI把一半的图片混进了JS文件夹,我才意识到:上下文结构不是写给模型的说明书,而是给模型的“工作协议”。同样的项目,有的人用着总出问题,有的人一次通过——差的就是这个显式的记忆管理。

ai agent memory checklist manifest
图:清单式记忆示意图,左侧是任务步骤,右侧是清单更新,中间是Agent决策点。

如果你正在用AI Agent做任何多步骤工作流(代码重构、数据迁移、文档整理),这个“显式清单”思维可以通用。核心就一句话:别让AI记,让它查表