关于 importing-chatgpt-memory
用于将选定的 ChatGPT 记忆迁移到 Letta 的工作流技能,避免不加筛选地导入整个聊天档案。它引导用户确定范围、预览记忆候选项、写入高置信度内容,并验证最终结构。
主要功能
- 01提取已保存记忆和可编辑上下文
- 02预览活跃与渐进记忆候选项
- 03按范围从聊天档案补充信息
- 04保留选定对话以供参考
- 05使用 /doctor 验证记忆结构
适用场景
- 01将 ChatGPT 记忆迁移到 Letta
- 02整理过往对话中的工作背景
- 03留存选定对话以供审计
- 04避免导入敏感或临时信息
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ letta-ai/ skills --skill importing-chatgpt-memory安装后在 Claude Code 中输入/importing-chatgpt-memory确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/chatgpt-export-notes.mdmemory-import-workflow.mdscripts/build-memory-preview.pyexport-transcripts.pyextract-saved-memory.pylist-conversations.pyrender-conversation.pyrender-range.pysearch-conversations.py详细介绍
将 ChatGPT 记忆克隆到 Letta
当用户希望 Letta 尽可能忠实地继承 ChatGPT 记忆,而不是盲目导入整个导出文件时,使用此技能。
适用场景
- 将我的 ChatGPT 记忆克隆到 Letta
- 检查隐藏的已保存个人资料 / 自定义指令上下文
- 将 ChatGPT 记忆迁移到 Letta 的活跃记忆中
- 从旧聊天中补充工作背景或协作偏好
- 保存选定的对话记录,以便进行高保真审计 / 参考
即使用户只提出了简短请求,此技能也应能很好地发挥作用,例如:
- “我想导入我的 ChatGPT 记忆”
- “可以把我的 ChatGPT 记忆克隆到 Letta 吗?”
- “导入我的 ChatGPT 导出文件”
不要要求用户写出经过优化的提示词。
范围
此技能用于记忆引导,而不仅仅是呈现对话记录。
它应该:
- 首先提取 ChatGPT 已保存的记忆和可编辑上下文区块
- 生成面向 Letta 的预览,说明哪些内容应成为活跃记忆,哪些应成为渐进式记忆
- 在说明进度的同时写入明显且高置信度的条目
- 之后可从更广泛的档案中补充信息
- 可选地导出对话记录,以便进行高保真归档
它不应该:
- 盲目导入整个档案
- 将运行时上下文视为持久记忆
- 默认将历史上下文扁平化为始终可见的记忆
- 未经确认自动存储敏感个人资料
- 将记忆写入格式错误的 MemFS 结构
默认策略
采用先克隆,再补充的工作流。
- 进行简短的结构化信息收集
- 检查导出文件
- 在一个步骤中提取并预览
- 在了解情况的同时写入明显且高置信度的条目
- 若已确定范围,则继续补充档案信息——说明进度,并允许用户随时打断
- 只在重要节点征求意见
- 运行
/doctor验证最终记忆结构
用户应该感觉自己是在引导式引导流程中,而不是被丢进一堆脚本里。
即使用户提供的信息很少,引导流程也应保持稳健。Agent 应提供结构,而不是要求用户完善请求。
此技能是工作流,而非参考资料。 请按顺序遵循编号步骤。执行每一步前都要阅读相应指导,尤其是合并规则和写入目标。快速推进是好事,但不能跳过步骤。“自主”意味着由你推动流程,无须停下来征求许可,而不是跳过说明。
交互风格
从简短对话开始
如有条件,优先使用结构化的 AskUserQuestion 流程,让导入过程更像对话。
适合的问题类型:
- 导出文件的位置(如果不明显)
- 导入范围(仅已保存的记忆、记忆 + 工作背景、挖掘完整历史)
- 主题重点:“你希望我查找哪些特定项目或主题吗?”
- 敏感信息:“有什么内容是我不应存储的吗?”
不要询问用户多久进行一次回顾。大多数用户没有明确偏好,有偏好的人会主动说明。默认继续推进——说明你正在做什么,让用户在想暂停时随时打断。这样可以避免设置一个并无实际意义的检查点,让流程保持顺畅。
避免提出不会实际改变工作流的问题。例如,“你希望如何处理历史上下文?”听起来很重要,但回答很少会改变你运行的脚本。重点询问那些会让流程分支的问题。
设置此信息收集环节,是为了让用户不必在第一条消息中就提供所有这些上下文。
使用:
- 政策决策采用单选
- 范围选择采用多选
完成接收后,主动推进流程
范围明确后,应更加果断地主导流程,而不是一味征求许可。
不要反复用含糊的提示询问:
- “接下来要我做什么?”
- “要继续吗?”
而应:
- 说明已写入的内容
- 说明接下来要检查的内容
- 自动继续
只有遇到以下情况时才暂停:
- 事实相互矛盾
- 敏感或私密内容
- 范围发生重大变化
- 无法确定哪些内容应作为持久记忆
如果用户已明确提出宽泛的范围,也不要因为低风险的流程选择而暂停。
也不要教用户应该如何措辞来提出请求。只需正确执行引导流程。
进度跟踪
大型归档的导入可能需要几分钟。绝不要让用户一直干等。 导入过程应像有引导、持续更新的流程。
记录起始提交
写入任何记忆前,先记录记忆仓库当前的 HEAD:
git -C "$MEMORY_DIR" log --oneline -1
保存此提交哈希,作为回滚点。如果出现问题或用户想撤销导入,可以重置到此提交:
git -C "$MEMORY_DIR" reset --hard <start-commit>
git -C "$MEMORY_DIR" push --force
在导入审计文件和最终摘要中都写明起始和结束提交哈希。明确告诉用户:“如果你想撤销这些更改,我可以将记忆重置到导入前的状态。”
使用 TodoWrite 跟踪阶段
在导入开始时创建待办列表,并在执行过程中更新:
- 记录起始提交
- 定位导出文件并运行清单检查
- 提取并预览已保存的记忆
- 写入活动记忆(
system/human.md) - 写入导入审计和渐进式记忆(
reference/chatgpt/) - 丰富归档内容(如在范围内)
- 使用 /doctor 验证
每个阶段开始前标记为 in_progress,完成后标记为 completed。
在脚本调用之间播报进度
每个脚本运行完毕后,在运行下一个脚本前告诉用户发现了什么:
- “找到 347 条对话,时间跨度为 2023–2026 年。现在提取已保存的记忆……”
- “ChatGPT 在 4 个字段中记住了关于你的 12 条信息。正在生成预览……”
- “正在将 8 条高置信度信息写入活动记忆。接下来:丰富归档内容……”
- “正在调度 4 个挖掘 Agent,处理 200 条对话……”
报告统计数据
有具体数字时,务必告知用户:
- 对话总数
- 已保存记忆的字段数量
- 写入的条目数与留待审核的条目数
- 挖掘进度(已扫描的对话数、每个分块的发现数)
脚本使用 --progress
所有长时间运行的脚本都支持 --progress,会将状态输出到 stderr。处理大型归档时使用它,让用户在脚本运行期间也能看到进度。
工作流程
0. 定位导出文件
ChatGPT 导出文件通常使用较长的哈希值和时间戳命名,例如:
8a8f3ee0...-2026-03-31-18-41-51-e0dc362a....zip
常见位置:
~/Downloads/(最常见,浏览器通常会将文件保存到此处)- 桌面或自定义的导出文件夹
如果用户不知道确切路径,请在 Downloads 中查找 zip 文件:
ls -t ~/Downloads/*.zip | head -20
Downloads 文件夹通常内容繁杂。ChatGPT 导出文件有独特的命名模式——查找文件名符合 [8+ hex chars]-YYYY-MM-DD-* 的文件。可以使用以下快速筛选方式:
ls ~/Downloads/*.zip | grep -E '[0-9a-f]{8}.*-[0-9]{4}-[0-9]{2}-[0-9]{2}-'
如果仍无法确定,请检查 zip 中是否包含 conversations-*.json 条目:
unzip -l <candidate.zip> | grep conversations-
1. 检查导出文件清单
首先列出对话,并找出可能包含大量隐藏上下文的候选项。
python3 scripts/list-conversations.py <export.zip>
python3 scripts/list-conversations.py <export.zip> --sort hidden --min-hidden 1
python3 scripts/list-conversations.py <export.zip> --json --limit 50
利用这些信息了解规模,找到可能包含大量记忆的对话,并判断是否确实需要更广泛地审查归档。
警告: 对于大型归档(300 条以上对话),--json 输出很容易超过 100K 个字符,导致上下文窗口被大量内容占满。缓解方法:
- 先使用
--limit 50,之后可通过--start-index分页 - 将输出写入文件并选择性读取:
... --json > /tmp/conversations.json - 在输出 JSON 前使用
--title-contains进行筛选 - 初步检查清单时,非 JSON(表格)输出精简得多
2. 一步提取并预览
直接对 zip 使用预览构建器——它会在内部运行提取:
python3 scripts/build-memory-preview.py <export.zip>
python3 scripts/build-memory-preview.py <export.zip> --output /tmp/chatgpt-memory-preview.md
python3 scripts/build-memory-preview.py <export.zip> --progress
这将之前的两个步骤(提取 → 预览)合并为一步。它会从整个导出内容中提取最有用的入门信息:
about_user_messageabout_model_messageuser_profileuser_instructions
并将它们归类为:
- 活跃记忆候选项——每轮都应放入上下文的信息
- 运行时上下文——时区、位置、当前日期(跳过这些)
- 历史/渐进候选项——旧版本、先前的个人资料
- 矛盾项——存在多个版本、需要审核的字段
如果你需要单独获取原始提取 JSON(例如用于分派给子 Agent 或审计),请直接使用 extract-saved-memory.py:
python3 scripts/extract-saved-memory.py <export.zip> --json --output /tmp/chatgpt-saved-memory.json
注意: 对于 ChatGPT 个人资料较简单的用户(例如只有姓名和一句简介),预览基本只是重新整理已有的显而易见的信息。遇到这种情况,请阅读预览输出,然后直接编写记忆。当个人资料存在矛盾、包含多个历史版本,或混杂了持久信息和运行时上下文时,预览最有价值。
与现有记忆合并
如果 system/human.md 或 system/persona.md 已有内容,你是在合并,而不是替换。
反面示例: 读取现有内容后,再使用 str_replace 将整个内容替换为新版本。这属于覆盖,即使你事先读过也是如此。现有内容由用户或之前的会话编写,包含你不了解的上下文。不要将其丢弃。
正确做法: 使用有针对性的 str_replace 调用,在现有文件中添加新行或新章节。具体来说:
- 读取现有内容块(它已在你的系统提示词中)
- 找出缺失的内容——ChatGPT 中存在、但现有内容块未涵盖的信息
- 使用
str_replace将缺失信息插入相应章节,或追加到末尾作为新章节 - 除非 ChatGPT 数据明确更新且与现有内容矛盾,否则绝不要替换已有行
示例——如果 system/human.md 已写明“在 Letta 工作”,而 ChatGPT 保存的记忆写着“在 Letta 从事 Agent 基础设施工作”,合并方式如下:
str_replace "Works at Letta" → "Works at Letta on agent infrastructure"
而不是用重写后的版本替换整个文件。
如果现有内容块为空或只有少量内容(仅有默认模板),可以完整写入。只有在已有值得保留的内容时,才需要遵循合并原则。
依次写入记忆
不要并行创建或更新多个记忆文件。 同时调用时,记忆工具可能发生竞态条件,即使写入成功也会报告虚假错误。这样很难确认实际写入了哪些内容。
请一次写入一个记忆文件。速度差异微乎其微——记忆写入很快。可靠性差异则不然。
安全的写入目标和记忆结构
写入记忆前,检查 system/ 和相关参考目录。
重要的 MemFS 规则:
- 切勿创建路径重叠的文件/文件夹,例如
system/human.md和system/human/...,或system/persona.md和system/persona/...。
写入目标(所有导入至少应生成前两项):
system/human.md— 精简、持久的用户事实和协作偏好,应在每轮对话中置于上下文中reference/chatgpt/import-YYYY-MM-DD.md— 始终创建 — 导入审计记录、排除项、不确定性说明和来源路径reference/chatgpt/work-and-technical-background.md— 发现历史工作背景时创建reference/chatgpt/collaboration-preferences.md— 发现详细的互动/风格模式时创建reference/chatgpt/transcripts/— 精选的对话记录导出文件,用于保真和审计
如果 system/human.md 已存在,请更新该文件,不要另建同级文件夹。
如果 system/persona.md 已存在,请更新该文件,不要另建同级文件夹。
积极采用渐进式披露:保持活跃记忆精简,并使用 [[reference/chatgpt/...]] 路径链接到外部内容,让后续 Agent 能找到档案。
3. 写入记忆 — 活跃记忆和渐进式记忆
此步骤会同时写入 system/ 和 reference/chatgpt/。不能只写入活跃记忆。渐进式记忆层承载着导入内容的长期价值——缺少这一层,历史背景、审计记录和协作偏好都会丢失。
3a. 活跃记忆(system/human.md)
当事实明确、当前有效且敏感度较低时,立即写入:
- 姓名和稳定的基本身份信息
- 当前角色或项目背景
- 隐藏的已保存记忆中明确的回复偏好
- 重复出现的格式偏好
- 协作偏好,例如直截了当、提问频率、避免迎合
保持 system/human.md 精简。只记录每轮对话都应置于上下文中的内容。
3b. 导入审计文件(reference/chatgpt/import-YYYY-MM-DD.md)
始终创建此文件。 它记录导入过程中的情况:
- 导出路径和对话数量
- 写入了哪些内容到活跃记忆,以及写入原因
- 排除了哪些内容,以及排除原因
- 发现的矛盾及其解决方式
- 仍需确认的内容
- 每项决策的来源(哪个已保存记忆字段、哪个对话索引)
这就是凭证。后续 Agent 可以据此了解记忆的来源。
3c. 渐进式记忆文件
当预览或扩展信息中出现不适合放入 system/、但值得保留的内容时,创建以下文件:
reference/chatgpt/work-and-technical-background.md— 历史角色、过往项目、技术背景,以及有助于了解用户但无须在每轮对话中使用的旧工作背景reference/chatgpt/collaboration-preferences.md— 详细的互动模式、格式偏好、纠正模式、反模式,以及过于细致而不适合放入system/human.md、但有助于 Agent 调整语气或风格的内容
如果预览中显示了历史上的不同版本(较早的已保存记忆版本、旧版个人资料),也应放在这里。
3d. 从活跃记忆链接到渐进式文件
创建渐进式记忆文件后,在 system/human.md 中添加 [[reference/chatgpt/...]] 链接,方便后续 Agent 查找。示例:
See also: [[reference/chatgpt/work-and-technical-background.md]], [[reference/chatgpt/collaboration-preferences.md]]
写入方式
每次写入时:
- 保持内容精简、具体
- 告知用户写入了什么以及写入位置
- 告知用户接下来要检查什么
- 继续
4. 可选的档案扩充
只有在处理完已保存记忆的克隆后,才可选择性地从更广泛的对话历史中提取:
- 工作/项目背景
- 协作模式
- 历史背景
- 用户希望保留的其他持久信息
全面挖掘前先确认
归档增强会分派子 Agent,数量可能很多。对于包含 500 段对话的归档,大约需要 10 个并行 Agent。开始前务必先征求用户确认,并用具体数字告知他们所需成本:
- 将挖掘多少段对话
- 将分派多少个子 Agent
- 这是导入过程中成本最高的部分
使用 AskUserQuestion,并提供类似以下选项:
- 挖掘完整归档 —“挖掘全部 N 段对话(约需 X 个子 Agent)。最全面,也最费资源。”
- 定向挖掘 —“挖掘符合你关注的特定主题的对话。成本更低,覆盖面仍然不错。”
- 跳过增强 —“保存的记忆副本已经包含核心内容。到此为止。”
不要仅仅因为用户在初始阶段选择了“挖掘完整历史记录”,就自动分派子 Agent。初始阶段的范围问题确认的是意愿;而此处的检查点是在你了解归档规模后,确认具体成本。
对于小型归档(少于 50 段对话),直接挖掘,无需子 Agent,也无需确认:
python3 scripts/render-conversation.py <export.zip> --index 12 --output /tmp/chatgpt-12.md
对于包含 50 段及以上对话的归档,使用基于并行分块的挖掘方式(见下文)。
基于主题筛选
没有单个脚本可以完成基于主题的发现和呈现。请使用以下两步模式:
# Step 1: Find conversations by topic
python3 scripts/list-conversations.py <export.zip> --title-contains "Julia" --json
# Step 2: Render the most promising ones individually
python3 scripts/render-conversation.py <export.zip> --index 95
python3 scripts/render-conversation.py <export.zip> --index 144
要广泛检索多个主题,请尝试多次使用 --title-contains 查询(例如“Julia”“Bayesian”“economics”),并在呈现结果前按索引去重。
过时上下文/撤回内容检查
在将历史发现写入活动记忆前,进行一次轻量检查,查找后续对话中的明确更正。
使用带有 --role user 的内容搜索,重点查看用户实际说过的内容:
python3 scripts/search-conversations.py <export.zip> --query "not doing" --query "no longer" --query "forget that" --query "remove from memory" --role user
python3 scripts/search-conversations.py <export.zip> --query "used to" --query "don't assume" --role user --json --limit 20
常见信号:
- 用户表示某个项目已不再进行
- 用户要求忘记或删除旧上下文
- 用户表示某个职位、雇主、所属机构或计划已过时
当旧上下文与较新的明确更正相冲突时,应以较新的更正为准。
5. 使用 /doctor 验证
导入完成后——无论是简单的保存记忆副本,还是完整的归档增强——都要运行 /doctor。这不是可选步骤。它会验证:
- 记忆结构的完整性
- 文件/文件夹路径没有重叠
- 提示词的规范性
- 区块大小是否合理
如果 /doctor 标记出问题,请先修复,再宣布导入完成。
6. 保留对话记录
对话记录应在挖掘过程中保留,而不是之后单独处理。你或子 Agent 遇到高价值对话时,应立即保存,不要把它留作之后的问题。
**反面做法:**不要在挖掘时收集候选对话记录,之后再将它们作为菜单提供给用户(“你想导出哪些对话记录?”)。这会迫使用户对自己尚未读过的对话做决定。相反,应在发现高价值对话时立即保存,在进度说明中告知用户已保存的内容,然后继续。用户随时可以删除不需要的内容——这比重新挖掘未保存的内容容易得多。
自动保存(无需询问)
在以下情况下保留对话:
- 职业转型或重大人生决策 — 职位变动、公司变动、职业方向转变。这些是用户对自身经历的叙述,与记忆块很少重复。
- 深入的技术设计讨论 — 架构决策、系统设计、研究方法。细节很重要,无法浓缩成一个要点。
- 详细的项目背景 — 用户认真参与的项目的目标、限制、合作者和时间线。
- 结合上下文明确表达的偏好 — 不只是“直截了当”,还包括用户解释希望在什么情况下以及为什么直截了当的完整交流。
对于这些对话,请总结成 2–5 段参考文件,保存到 reference/chatgpt/transcripts/NNN-slug.md。添加 frontmatter 描述,以便查找该文件。只有在确实需要保真度时,才使用逐字导出(例如精确决策,或总结会丢失关键信息的复杂技术背景)。
保存前先询问
- 重点涉及健康/心理健康详情、亲密关系动态或财务细节的对话
- 信号确实模糊不清的对话(可能有用,也可能只是噪声)
不要保存
- 已由记忆块完整记录的对话
- 没有长期背景信息的一次性任务
- 主要由助手输出、用户输入很少的对话
子 Agent 如何处理对话记录
子 Agent 应在挖掘过程中保存对话记录,而不是将候选内容报告回来。子 Agent 提示词已指定 reference/chatgpt/transcripts/ 为写入目标。子 Agent 在处理分块时遇到高信号对话,应:
- 将总结后的参考文件写入
reference/chatgpt/transcripts/NNN-title-slug.md - 在分块总结中说明已保留该对话记录及原因
- 继续挖掘
主 Agent 无需逐条批准对话记录。对于上述“自动保存”类别,子 Agent 的判断足够可靠。
批量归档导出
如果用户希望最大限度地保留原始内容,或需要完整的归档副本,请使用 export-transcripts.py:
python3 scripts/export-transcripts.py <export.zip> \
--indexes 229,288 \
--output-dir /tmp/chatgpt-transcripts \
--skip-empty-hidden \
--compact-nontext
这是一个独立的归档功能,并非默认方式。大多数导入应采用上述选择性总结模式。
需要留意的隐藏上下文
近期的 ChatGPT 导出内容通常会在隐藏的系统/上下文消息中包含最清晰明确的记忆信息。
高信号字段:
metadata.user_context_message_data.about_user_messagemetadata.user_context_message_data.about_model_messagecontent.user_profile(来自user_editable_context)content.user_instructions(来自user_editable_context)
重要区别:
- 同一记忆块可能会在许多对话中重复出现
- 一些隐藏消息是运行时执行上下文,不属于长期记忆
user.json/user_settings.json中的账户元数据通常是审计材料,而非当前有效记忆(注意:目前没有脚本会从这些文件中提取内容——如有需要,请手动检查)
仅限运行时的上下文示例:
- 当前日期
- 当前时区
- 当前位置
- 与特定导出时点相关的临时近期性指令
持久协作背景示例:
- 直截了当/简洁的偏好
- 格式偏好
- 针对时事优先搜索的指示
- 避免谄媚或吹毛求疵的偏好
内容应归入何处
当前记忆
适合纳入的内容:
- 稳定的身份信息
- 当前职位/持续性项目背景
- 长期有效的回复偏好
- 长期有效的协作偏好
- 长期使用的工具/工作流偏好
渐进式记忆
适合纳入的内容:
- 过去的职位或项目历程
- 之前版本的 ChatGPT 已保存记忆
- 较早但仍有用的背景信息
- 为保真度/可审计性而精选的对话记录导出内容
默认存储
个人信息是了解用户的一部分。请存储以下信息:
- 家庭成员的姓名、宠物、爱好、兴趣
- 生活状况、居住地、背景
- 性格特征、沟通风格
- 个人项目、业余兴趣、目标
- 感情状态、伴侣的姓名(仅记录这一事实,不记录相处情况)
用户导入了自己的 ChatGPT 记忆,因为他们希望被了解。不要排除他们认为 Agent 应当了解的背景信息。
存储前先询问
只有在处理不当会造成实际后果的信息上,才暂停并确认:
- 健康/心理健康具体信息——诊断、药物、治疗详情(“需要谨慎处理”之类的标记除外,这些可以存储)
- 亲密关系中的相处情况——不是“有一位名叫 X 的伴侣”,而是冲突细节、情感方面的具体信息
- 财务具体信息——债务、收入、具体金额
- 存在矛盾且无法确定当前真实情况
关于敏感信息的提问(“有什么信息是我不应该存储的吗?”)是用户设定边界的机会。如果用户没有特别说明,默认存储个人信息。
使用子 Agent 并行挖掘
对于包含 50 段以上对话的档案,使用按块并行挖掘,而不是顺序处理全部内容。这是处理非简单档案时的默认扩充策略。
工作方式
- 主 Agent处理明确保存的记忆副本(工作流的第 0–3 步)
- 主 Agent将其余档案划分为若干块,每块约包含 30–50 段对话
- 主 Agent为每一块分配一个
general-purpose子 Agent - 每个子 Agent:
- 使用
render-range.py或逐一调用render-conversation.py渲染分配给自己的对话 - 提取持久有效的事实、偏好、项目背景和撤回信息
- 将发现直接写入分配给自己的记忆路径(例如
reference/chatgpt/mining/chunk-NNN.md) - 如有必要,可将整理后的转录写入
reference/chatgpt/transcripts/ - 返回摘要,并区分可安全纳入的发现和仅供提议的发现
- 使用
- 主 Agent:
- 读取
reference/chatgpt/mining/中所有块的摘要 - 将高置信度的发现合并到
system/human.md - 解决各块之间的矛盾
- 运行
/doctor验证生成的记忆结构
- 读取
子 Agent 设计规则
- 提供完整的脚本路径——子 Agent 不会继承你的技能知识
- 将每个子 Agent 的范围限制在 30–50 段对话——超过这个范围可能导致上下文溢出或超时
- 使用
general-purpose子 Agent 类型——这些子 Agent 需要通过 Bash 运行脚本 - 提前划分输出路径——每个子 Agent 负责互不重叠的目标路径
- 允许直接写入渐进式记忆——子 Agent 直接写入
reference/chatgpt/mining/chunk-NNN.md和reference/chatgpt/transcripts/ - 协调活跃记忆的写入——只有主 Agent 可以将内容合并到
system/human.md/system/persona.md - 子 Agent 不得修改现有记忆文件——只能创建新文件(
reference/chatgpt/mining/chunk-NNN.md、reference/chatgpt/transcripts/NNN-slug.md)。绝不能读取、编辑或覆盖system/中的任何内容,也不能读取、编辑或覆盖reference/中任何预先存在的文件 - 始终提供备用方案——如果子 Agent 失败,使用
list-conversations.py --title-contains挖掘对应块,然后有针对性地调用render-conversation.py
子 Agent 提示词模板
保持简洁。子 Agent 需要:导出路径、脚本路径、块的范围、输出路径以及要提取的内容。其他内容都是多余的。
Mine conversations [START]-[END] from [EXPORT_PATH] for durable memory.
Render: python3 [SCRIPTS_DIR]/render-range.py "[EXPORT_PATH]" --start-index [START] --end-index [END] --output-dir /tmp/chatgpt-chunk-[N] --skip-empty-hidden --compact-nontext --skip-thoughts --progress
Read each rendered conversation. Extract: user facts, project/work context, collaboration preferences, explicit retractions ("forget this", "no longer", "not doing").
Write findings to [MEMORY_DIR]/reference/chatgpt/mining/chunk-[NNN].md with sections:
- Safe to promote (high-confidence, explicit, current, low-sensitivity)
- Proposal only (historical, uncertain, sensitive, contradictory)
- Retractions (older context the user said to forget)
High-signal conversations (career transitions, deep technical design, detailed project context, explicit preference discussions) → summarize into [MEMORY_DIR]/reference/chatgpt/transcripts/NNN-title-slug.md. Do this during mining, not after. Use 2-5 paragraph summaries, not verbatim transcripts. Include frontmatter with a description.
IMPORTANT: Only create NEW files. Do not read, edit, or overwrite any existing files in the memory directory. Do not touch system/.
子 Agent 失败时
子 Agent 可能会因超时或上下文限制而悄无声息地失败。如果挖掘子 Agent 失败:
- 不要使用同样宽泛的范围重试
- 直接使用
list-conversations.py --title-contains查找相关对话 - 自己渲染 3–5 段信号最强的对话
- 尽可能提取信息——覆盖不完整也没关系
脚本
scripts/list-conversations.py
用于归档清点。
主要功能:
- 按全局索引列出
- 按隐藏上下文数量排序
- 使用
--min-hidden筛选 - 为 Agent 工作流输出 JSON
scripts/extract-saved-memory.py
需要原始提取 JSON 时使用(例如用于分派给子 Agent 或审计)。
它会提取并去重:
about_user_messageabout_model_messageuser_profileuser_instructions
它还会报告首次/最后一次出现的时间戳和来源样本。
支持:
--json--output--progress
scripts/build-memory-preview.py
主要的提取与分类工具。接受 zip 文件(在内部运行提取)或 extract-saved-memory.py 输出的 JSON。
它会区分:
- 可能的活跃记忆候选项
- 历史/渐进记忆候选项
- 仅运行时上下文
- 矛盾/待审核项
支持:
--json--output--progress- 直接输入 zip 文件(一步完成:提取 + 预览)
- 输入 JSON(两步完成:从现有提取结果生成预览)
scripts/render-conversation.py
用于深入审查单个对话。它会直接流式读取目标对话,而不是加载整个归档,因此效率更高。
实用的挖掘选项:
--skip-thoughts--skip-empty-tool-messages--user-only--assistant-only
scripts/render-range.py
用于归档扩充期间的批量渲染。它只打开一次 zip,并在进程内渲染所有对话,不会为每个对话启动子进程。
支持:
--output-dir(每个对话生成一个文件)或--concat-output(生成单个文件)--progress(将渲染进度输出到 stderr)- 与
render-conversation.py相同的降噪选项
scripts/search-conversations.py
标题搜索不够用时使用。
适用场景:
- 清扫过时上下文/撤回内容
- 在泛化标题中查找被埋没的项目提及
- 定位“忘掉这个”/“不再做这个了”之类的更正
- 在决定要渲染哪些对话之前搜索特定短语
支持:
--role user|assistant|tool|system— 筛选要搜索的消息角色(可重复使用)--progress— 将搜索进度输出到 stderr--json
scripts/export-transcripts.py
用于可选的高保真归档导出。
支持:
- 指定索引或范围
- 对对话文本分块
- 可选的记忆式 frontmatter
- 自动生成对话文本索引文件
面向用户的最终摘要
每次运行结束时,先给出一个叙述式概览——用简短、自然的语言概述你现在对用户的了解。与分类列表相比,这种方式更有吸引力,也能让用户立即确认导入是否成功。
然后再给出结构化细目:
- 概览——用 3–5 句话写出“这是我现在对你的了解”,语气应像是在向未来的自己介绍用户
- ChatGPT 明确记住的内容——原始的已保存记忆字段
- 克隆到 Letta 活跃记忆中的内容——现已位于
system/中的内容 - 作为渐进记忆保留的内容——位于
reference/chatgpt/中的内容 - 排除的内容及原因
- 仍需确认的内容
- /doctor 验证结果
- 回滚信息——起始提交、结束提交,以及撤销方法:“如果你想撤销导入,我可以将你的记忆重置为
<start-commit>。”
概览是用户实际会阅读的部分。回滚信息则是安全保障。
导出结构参考
ChatGPT 导出 ZIP 文件通常包含:
conversations-000.json、conversations-001.json等(分片的对话历史记录)shared_conversations.jsonuser.json、user_settings.json(账户元数据——通常用于审计,而非当前记忆)export_manifest.json- 图片、音频和其他附件
每个对话中的 mapping 字段是一个图结构,而不是扁平的消息数组。脚本会处理这些内容——你无需手动解析。
如果用户需要帮助获取导出文件:https://help.openai.com/en/articles/7260999-how-do-i-export-my-chatgpt-history-and-data
参考资料
references/memory-import-workflow.md— 导入工作流的精简检查清单