问题现象:AI克隆网站,怎么总是「失忆」?
你在GitHub上看到 JCodesMore/ai-website-cloner-template,17500+ stars,一条命令克隆整个网站。你兴冲冲跑起来,AI agent开始干活:先抓HTML,再下载CSS、JS、图片... 前几步还行,但到了第10步,它突然忘记了自己已经下载过 style.css,又去请求同一个URL,结果下载了旧版本;或者它把图片路径写成了绝对路径,但前一步已经约定好要转为相对路径。
这不是工具不好用,而是AI agent的上下文结构没设计好。单轮对话里,大模型能记住几千token;但多步交互中,每一步的输出都会写入上下文,早期信息被挤压、遗忘。克隆网站这种长任务(下载几十个文件、替换路径、生成目录),模型容易「跑偏」:忘记之前的文件列表、混淆了src和dist路径、漏掉某个资源。
上下文结构分析:让AI保持「短时记忆」的关键
要解决失忆,不能依赖模型自身的回忆能力(因为它不是持久记忆),而是要显式地、结构化地注入记忆。
典型的克隆任务流程:
- 抓取HTML → 提取资源列表(CSS/JS/图片/字体)
- 下载每个资源到本地目录
- 修改HTML中资源的路径(从绝对/相对 → 新的相对路径)
- 处理子页面(如果有)
每一步都需要知道上一步的结果。常见失败模式:
- 模型在第3步时,记不清第2步下载的文件名(尤其是重命名后的)。
- 模型在第4步时,忘了第1步提取的原始URL对应的本地文件。
优化方案:在上下文中维护一个「清单表」(manifest),每一步更新它,并且每次行动前都让模型先读取清单。类似于给AI一个“笔记本”,而不是让它在脑子里记。
优化方案:一个可直接复用的Prompt模板
下面是一个经过测试的Prompt模板,专门用于AI Agent执行克隆网站的长任务。它显式定义了上下文结构、记忆注入点和任务切分。
你是一个网站克隆助手。你有一个“任务清单”文件(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)。
变体扩展用法:
- 多Agent协作:将清单设计为共享状态,主Agent分配子任务给不同工作Agent(一个下载图片,一个修改HTML),子Agent执行完更新清单。
- 增量更新:修改模板,让Agent比较本地已有文件和远程文件,只下载变化的部分。
- 回滚支持:在manifest中加入version字段和backup路径,如果某步出错,Agent可以读取备份还原。
个人观点
我之前踩过很多次坑,总以为大模型足够聪明可以自己记住进程。直到一次克隆WordPress主题时,AI把一半的图片混进了JS文件夹,我才意识到:上下文结构不是写给模型的说明书,而是给模型的“工作协议”。同样的项目,有的人用着总出问题,有的人一次通过——差的就是这个显式的记忆管理。

图:清单式记忆示意图,左侧是任务步骤,右侧是清单更新,中间是Agent决策点。
如果你正在用AI Agent做任何多步骤工作流(代码重构、数据迁移、文档整理),这个“显式清单”思维可以通用。核心就一句话:别让AI记,让它查表。