mcpField
I
importing-chatgpt-memory

importing-chatgpt-memory

github.com/letta-aiAgent 工作流152127 次安装4 周前更新
代码仓库

关于 importing-chatgpt-memory

用于将选定的 ChatGPT 记忆迁移到 Letta 的工作流技能,避免不加筛选地导入整个聊天档案。它引导用户确定范围、预览记忆候选项、写入高置信度内容,并验证最终结构。

主要功能

  1. 01提取已保存记忆和可编辑上下文
  2. 02预览活跃与渐进记忆候选项
  3. 03按范围从聊天档案补充信息
  4. 04保留选定对话以供参考
  5. 05使用 /doctor 验证记忆结构

适用场景

  1. 01将 ChatGPT 记忆迁移到 Letta
  2. 02整理过往对话中的工作背景
  3. 03留存选定对话以供审计
  4. 04避免导入敏感或临时信息

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/letta-ai/skills --skill importing-chatgpt-memory

安装后在 Claude Code 中输入/importing-chatgpt-memory确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
chatgpt-export-notes.md
memory-import-workflow.md
scripts/
build-memory-preview.py
export-transcripts.py
extract-saved-memory.py
list-conversations.py
render-conversation.py
render-range.py
search-conversations.py

详细介绍

将 ChatGPT 记忆克隆到 Letta

当用户希望 Letta 尽可能忠实地继承 ChatGPT 记忆,而不是盲目导入整个导出文件时,使用此技能。

适用场景

  • 将我的 ChatGPT 记忆克隆到 Letta
  • 检查隐藏的已保存个人资料 / 自定义指令上下文
  • 将 ChatGPT 记忆迁移到 Letta 的活跃记忆中
  • 从旧聊天中补充工作背景或协作偏好
  • 保存选定的对话记录,以便进行高保真审计 / 参考

即使用户只提出了简短请求,此技能也应能很好地发挥作用,例如:

  • “我想导入我的 ChatGPT 记忆”
  • “可以把我的 ChatGPT 记忆克隆到 Letta 吗?”
  • “导入我的 ChatGPT 导出文件”

不要要求用户写出经过优化的提示词。

范围

此技能用于记忆引导,而不仅仅是呈现对话记录。

它应该:

  • 首先提取 ChatGPT 已保存的记忆和可编辑上下文区块
  • 生成面向 Letta 的预览,说明哪些内容应成为活跃记忆,哪些应成为渐进式记忆
  • 在说明进度的同时写入明显且高置信度的条目
  • 之后可从更广泛的档案中补充信息
  • 可选地导出对话记录,以便进行高保真归档

它不应该:

  • 盲目导入整个档案
  • 将运行时上下文视为持久记忆
  • 默认将历史上下文扁平化为始终可见的记忆
  • 未经确认自动存储敏感个人资料
  • 将记忆写入格式错误的 MemFS 结构

默认策略

采用先克隆,再补充的工作流。

  1. 进行简短的结构化信息收集
  2. 检查导出文件
  3. 在一个步骤中提取并预览
  4. 在了解情况的同时写入明显且高置信度的条目
  5. 若已确定范围,则继续补充档案信息——说明进度,并允许用户随时打断
  6. 只在重要节点征求意见
  7. 运行 /doctor 验证最终记忆结构

用户应该感觉自己是在引导式引导流程中,而不是被丢进一堆脚本里。

即使用户提供的信息很少,引导流程也应保持稳健。Agent 应提供结构,而不是要求用户完善请求。

此技能是工作流,而非参考资料。 请按顺序遵循编号步骤。执行每一步前都要阅读相应指导,尤其是合并规则和写入目标。快速推进是好事,但不能跳过步骤。“自主”意味着由你推动流程,无须停下来征求许可,而不是跳过说明。

交互风格

从简短对话开始

如有条件,优先使用结构化的 AskUserQuestion 流程,让导入过程更像对话。

适合的问题类型:

  • 导出文件的位置(如果不明显)
  • 导入范围(仅已保存的记忆、记忆 + 工作背景、挖掘完整历史)
  • 主题重点:“你希望我查找哪些特定项目或主题吗?”
  • 敏感信息:“有什么内容是我不应存储的吗?”

不要询问用户多久进行一次回顾。大多数用户没有明确偏好,有偏好的人会主动说明。默认继续推进——说明你正在做什么,让用户在想暂停时随时打断。这样可以避免设置一个并无实际意义的检查点,让流程保持顺畅。

避免提出不会实际改变工作流的问题。例如,“你希望如何处理历史上下文?”听起来很重要,但回答很少会改变你运行的脚本。重点询问那些会让流程分支的问题。

设置此信息收集环节,是为了让用户不必在第一条消息中就提供所有这些上下文。

使用:

  • 政策决策采用单选
  • 范围选择采用多选
完成接收后,主动推进流程

范围明确后,应更加果断地主导流程,而不是一味征求许可。

不要反复用含糊的提示询问:

  • “接下来要我做什么?”
  • “要继续吗?”

而应:

  1. 说明已写入的内容
  2. 说明接下来要检查的内容
  3. 自动继续

只有遇到以下情况时才暂停:

  • 事实相互矛盾
  • 敏感或私密内容
  • 范围发生重大变化
  • 无法确定哪些内容应作为持久记忆

如果用户已明确提出宽泛的范围,也不要因为低风险的流程选择而暂停。

也不要教用户应该如何措辞来提出请求。只需正确执行引导流程。

进度跟踪

大型归档的导入可能需要几分钟。绝不要让用户一直干等。 导入过程应像有引导、持续更新的流程。

记录起始提交

写入任何记忆前,先记录记忆仓库当前的 HEAD:

git -C "$MEMORY_DIR" log --oneline -1

保存此提交哈希,作为回滚点。如果出现问题或用户想撤销导入,可以重置到此提交:

git -C "$MEMORY_DIR" reset --hard <start-commit>
git -C "$MEMORY_DIR" push --force

在导入审计文件和最终摘要中都写明起始和结束提交哈希。明确告诉用户:“如果你想撤销这些更改,我可以将记忆重置到导入前的状态。”

使用 TodoWrite 跟踪阶段

在导入开始时创建待办列表,并在执行过程中更新:

  1. 记录起始提交
  2. 定位导出文件并运行清单检查
  3. 提取并预览已保存的记忆
  4. 写入活动记忆(system/human.md)
  5. 写入导入审计和渐进式记忆(reference/chatgpt/)
  6. 丰富归档内容(如在范围内)
  7. 使用 /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_message
  • about_model_message
  • user_profile
  • user_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 调用,在现有文件中添加新行或新章节。具体来说:

  1. 读取现有内容块(它已在你的系统提示词中)
  2. 找出缺失的内容——ChatGPT 中存在、但现有内容块未涵盖的信息
  3. 使用 str_replace 将缺失信息插入相应章节,或追加到末尾作为新章节
  4. 除非 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]]
写入方式

每次写入时:

  1. 保持内容精简、具体
  2. 告知用户写入了什么以及写入位置
  3. 告知用户接下来要检查什么
  4. 继续
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 在处理分块时遇到高信号对话,应:

  1. 将总结后的参考文件写入 reference/chatgpt/transcripts/NNN-title-slug.md
  2. 在分块总结中说明已保留该对话记录及原因
  3. 继续挖掘

主 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_message
  • metadata.user_context_message_data.about_model_message
  • content.user_profile(来自 user_editable_context)
  • content.user_instructions(来自 user_editable_context)

重要区别:

  • 同一记忆块可能会在许多对话中重复出现
  • 一些隐藏消息是运行时执行上下文,不属于长期记忆
  • user.json / user_settings.json 中的账户元数据通常是审计材料,而非当前有效记忆(注意:目前没有脚本会从这些文件中提取内容——如有需要,请手动检查)

仅限运行时的上下文示例:

  • 当前日期
  • 当前时区
  • 当前位置
  • 与特定导出时点相关的临时近期性指令

持久协作背景示例:

  • 直截了当/简洁的偏好
  • 格式偏好
  • 针对时事优先搜索的指示
  • 避免谄媚或吹毛求疵的偏好

内容应归入何处

当前记忆

适合纳入的内容:

  • 稳定的身份信息
  • 当前职位/持续性项目背景
  • 长期有效的回复偏好
  • 长期有效的协作偏好
  • 长期使用的工具/工作流偏好
渐进式记忆

适合纳入的内容:

  • 过去的职位或项目历程
  • 之前版本的 ChatGPT 已保存记忆
  • 较早但仍有用的背景信息
  • 为保真度/可审计性而精选的对话记录导出内容
默认存储

个人信息是了解用户的一部分。请存储以下信息:

  • 家庭成员的姓名、宠物、爱好、兴趣
  • 生活状况、居住地、背景
  • 性格特征、沟通风格
  • 个人项目、业余兴趣、目标
  • 感情状态、伴侣的姓名(仅记录这一事实,不记录相处情况)

用户导入了自己的 ChatGPT 记忆,因为他们希望被了解。不要排除他们认为 Agent 应当了解的背景信息。

存储前先询问

只有在处理不当会造成实际后果的信息上,才暂停并确认:

  • 健康/心理健康具体信息——诊断、药物、治疗详情(“需要谨慎处理”之类的标记除外,这些可以存储)
  • 亲密关系中的相处情况——不是“有一位名叫 X 的伴侣”,而是冲突细节、情感方面的具体信息
  • 财务具体信息——债务、收入、具体金额
  • 存在矛盾且无法确定当前真实情况

关于敏感信息的提问(“有什么信息是我不应该存储的吗?”)是用户设定边界的机会。如果用户没有特别说明,默认存储个人信息。

使用子 Agent 并行挖掘

对于包含 50 段以上对话的档案,使用按块并行挖掘,而不是顺序处理全部内容。这是处理非简单档案时的默认扩充策略。

工作方式
  1. 主 Agent处理明确保存的记忆副本(工作流的第 0–3 步)
  2. 主 Agent将其余档案划分为若干块,每块约包含 30–50 段对话
  3. 主 Agent为每一块分配一个 general-purpose 子 Agent
  4. 每个子 Agent:
    • 使用 render-range.py 或逐一调用 render-conversation.py 渲染分配给自己的对话
    • 提取持久有效的事实、偏好、项目背景和撤回信息
    • 将发现直接写入分配给自己的记忆路径(例如 reference/chatgpt/mining/chunk-NNN.md)
    • 如有必要,可将整理后的转录写入 reference/chatgpt/transcripts/
    • 返回摘要,并区分可安全纳入的发现和仅供提议的发现
  5. 主 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 失败:

  1. 不要使用同样宽泛的范围重试
  2. 直接使用 list-conversations.py --title-contains 查找相关对话
  3. 自己渲染 3–5 段信号最强的对话
  4. 尽可能提取信息——覆盖不完整也没关系

脚本

scripts/list-conversations.py

用于归档清点。

主要功能:

  • 按全局索引列出
  • 按隐藏上下文数量排序
  • 使用 --min-hidden 筛选
  • 为 Agent 工作流输出 JSON
scripts/extract-saved-memory.py

需要原始提取 JSON 时使用(例如用于分派给子 Agent 或审计)。

它会提取并去重:

  • about_user_message
  • about_model_message
  • user_profile
  • user_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
  • 自动生成对话文本索引文件

面向用户的最终摘要

每次运行结束时,先给出一个叙述式概览——用简短、自然的语言概述你现在对用户的了解。与分类列表相比,这种方式更有吸引力,也能让用户立即确认导入是否成功。

然后再给出结构化细目:

  1. 概览——用 3–5 句话写出“这是我现在对你的了解”,语气应像是在向未来的自己介绍用户
  2. ChatGPT 明确记住的内容——原始的已保存记忆字段
  3. 克隆到 Letta 活跃记忆中的内容——现已位于 system/ 中的内容
  4. 作为渐进记忆保留的内容——位于 reference/chatgpt/ 中的内容
  5. 排除的内容及原因
  6. 仍需确认的内容
  7. /doctor 验证结果
  8. 回滚信息——起始提交、结束提交,以及撤销方法:“如果你想撤销导入,我可以将你的记忆重置为 <start-commit>。”

概览是用户实际会阅读的部分。回滚信息则是安全保障。

导出结构参考

ChatGPT 导出 ZIP 文件通常包含:

  • conversations-000.json、conversations-001.json 等(分片的对话历史记录)
  • shared_conversations.json
  • user.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 — 导入工作流的精简检查清单

评论

支持 Markdown