ChatGPT 聊天记录怎么导出?JSON / PDF / Markdown 完整教程
ChatGPT 没有单条对话下载按钮。本文详解官方数据导出流程,并对比浏览器扩展与 JSON 转换工具,教你把会话完整保存为 JSON、PDF 或 Markdown。
1. ChatGPT 能导出聊天记录吗?
ChatGPT 没有「单条对话一键下载」按钮,但保存会话的需求非常普遍——学习笔记归档、工作交付、代码备份、知识库搭建、账号级防丢备份,都离不开导出。
导出格式很多:PDF 适合交付,Markdown 适合笔记,JSON 则适合程序化处理——用 Python、jq 或数据库分析对话、提取代码块、构建微调数据集、接入 RAG 管道,JSON 都是最佳起点。
本文对比 3 种实用方案,并重点说明 AI Exporter 的 JSON 导出为什么比官方 conversations.json 更好用。
2. 先看结论:3 种方法怎么选
- 官方数据导出(设置 → 数据控制 → 导出数据)是 ChatGPT 唯一官方全量备份方式,但
conversations.json是树形mapping结构,解析成本高,不能直接当 PDF 或 Word 交付。 - AI Exporter 的 JSON 导出输出扁平消息数组,每条消息自带
role、model、modelId、created_at和结构化contents,适合脚本分析、迁移和二次开发。 - 推荐组合:官方导出做定期全量备份;日常单条或精选对话用 AI Exporter 导出 JSON 或 PDF / Markdown;需要把几百条历史一次性转成可读文档时,再用官方 JSON + 转换工具。
3. 方法一:ChatGPT 官方数据导出(全量备份首选)
OpenAI 提供的唯一官方批量导出方式。
适用场景
- 定期账号级完整备份
- 迁移到其他 AI 平台(如 Gemini Import chats)
- 不适合:只想保存某一条对话、直接拿可读文档交付
操作步骤
- 打开 chatgpt.com 并登录。
- 点击左下角头像 → Settings(设置)。

- 进入 Data controls(数据控制)。
- 点击 Export data(导出数据) → 确认。

- 等待 OpenAI 邮件(通常 20–30 分钟,对话多的账号可能需要更久,官方说明 最长可达 24 小时)。
- 点击邮件中的下载链接(24 小时内有效,注意查垃圾箱)。
- 解压 ZIP,找到
conversations.json(新版可能拆成conversations-000.json等多个分片)。
你会获得什么
conversations.json— 完整对话历史,树形mapping结构,含时间戳和模型信息chat.html— 可在浏览器中浏览的基础版本- 可能包含图片、附件等(DALL·E 图片、临时对话、已删除聊天可能不包含)
官方 JSON 的痛点
OpenAI 官方导出虽然也是 JSON,但结构面向内部存储,不适合直接拿来写脚本:
- 树形
mapping+ 父子指针 — 需要反向遍历才能重建对话顺序。 - 编辑提示词会产生分支 — 一段对话可能有多条路径,解析更复杂。
- 文本深埋在
content.parts[]— 不是简单的字符串字段。 - 时间戳是 Unix 浮点数 — 如
1713350400.0,需要额外转换。 - 全量或不导 — 无法选择性导出单条消息,也不支持即时导出。
| 优势 | 详情 |
|---|---|
| 官方且可靠 | 由 OpenAI 提供,无需第三方 |
| 真正的批量 | 一次性导出账号内所有对话 |
| 元数据完整 | 含时间戳、模型信息和对话结构 |
| 无需安装 | 直接从 ChatGPT 设置页面操作 |
| 局限性 | 详情 |
|---|---|
| 全量或不导 | 无法选择特定对话或日期范围 |
| 结构复杂 | 树形 JSON 需要大量解析才能使用 |
| 无格式选项 | 没有 PDF、Markdown、Word 选项 |
| 交付缓慢 | 可能需要数分钟到数天 |
| 内容缺失 | 临时对话、已删除聊天、部分 AI 特有内容可能缺失 |
小结: 官方导出适合兜底备份,不适合日常即时获取结构化数据。
4. 方法二:AI Exporter(日常导出首选)
坦诚声明:这是我们开发的产品,下面如实说明能做什么、不能做什么。
为什么推荐用 AI Exporter 导出 JSON?
对比官方 conversations.json,AI Exporter 的 JSON 是为程序化处理设计的:
| 维度 | 官方 conversations.json | AI Exporter JSON |
|---|---|---|
| 结构 | 树形 mapping,需大量解析 | 扁平消息数组,直接遍历 |
| 导出范围 | 全账号批量 | 单条对话 / 部分消息 按需导出 |
| 速度 | 数分钟到数天 | 即时一键 |
| 时间戳 | Unix 浮点数 | 每条消息 created_at(人类可读) |
| 模型信息 | 分散在 metadata 中 | 每条 assistant 消息带 model / displayModel / modelId |
| 内容类型 | 新功能支持滞后 | contents 数组保留多种结构化类型 |
AI Exporter JSON 长什么样?
顶层是消息数组(不是官方那种 metadata + mapping):
[
{
"id": "msg_001",
"chatGroupId": "group_abc",
"role": "user",
"model": "chatgpt",
"displayModel": "ChatGPT",
"contents": [
{ "type": "markdown", "content": "如何用 Python 读取 CSV 并筛选列?" }
],
"created_at": "2026-04-15 14:30:45",
"updated_at": 1713175845000
},
{
"id": "msg_002",
"chatGroupId": "group_abc",
"role": "assistant",
"model": "chatgpt",
"displayModel": "ChatGPT",
"modelId": "GPT-4o",
"contents": [
{ "type": "markdown", "content": "你可以使用 pandas 库:\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\n```" },
{ "type": "thinking", "content": "用户需要基础的 CSV 读取示例..." },
{ "type": "sources", "sources": [{ "title": "pandas 官方文档", "url": "https://pandas.pydata.org", "domain": "pandas.pydata.org" }] }
],
"created_at": "2026-04-15 14:31:22",
"updated_at": 1713175882000
}
]注意这种扁平结构——一个可以直接 for 循环的数组,无需处理嵌套树或父子指针。
用户最关心的字段
消息级:
| 字段 | 说明 |
|---|---|
role | user(你的消息)或 assistant(AI 回复) |
model / displayModel / modelId | 平台名、展示名和具体模型版本(如 GPT-4o、Claude Sonnet) |
created_at / updated_at | 消息时间,便于排序和统计 |
chatGroupId | 同轮问答分组,方便配对 user / assistant |
contents 数组(结构化内容,JSON 导出的核心价值):
| type | 保留内容 |
|---|---|
markdown / text | 正文、代码块、数学公式 |
thinking | 推理 / 思维过程 |
sources | 网页搜索、Deep Research 引用来源 |
image / attachment | 图片、上传文件 |
html_widget | Canvas / 交互工件 |
shopping_card / shopping_table | 购物推荐卡片与对比表 |
JSON 导出保留全量结构化数据,不受 PDF 或 Markdown 里「是否显示时间戳」等显示配置影响。
怎么用 AI Exporter 导出 JSON
- 从 Chrome 网上应用店 安装 AI Exporter(也支持 Edge、Firefox)。
- 打开要导出的 ChatGPT 对话。
- 点击扩展图标 → 选择 JSON 格式。
- 可选:勾选部分消息,只导出你需要的内容。
- 可选:开启「复制到剪贴板」,直接把 JSON 粘贴进脚本或 API 工具。
导出的 JSON 能做什么
以下示例基于 AI Exporter 的 JSON 格式。如果你用的是官方导出,需要先从 mapping 树中提取消息。
用 Python 快速统计对话:
import json
from collections import Counter
with open("ChatGPT-my-conversation.json") as f:
messages = json.load(f)
roles = Counter(msg["role"] for msg in messages)
print(f"你的提问: {roles.get('user', 0)}")
print(f"AI 回复: {roles.get('assistant', 0)}")
responses = [m for m in messages if m["role"] == "assistant" and m["contents"]]
longest = max(responses, key=lambda m: len(str(m["contents"])))
print(f"最长回复字符数: {len(str(longest['contents']))}")提取所有代码块:
import json
import re
with open("ChatGPT-my-conversation.json") as f:
messages = json.load(f)
for msg in messages:
if msg["role"] != "assistant":
continue
for item in msg.get("contents", []):
if item.get("type") not in ("markdown", "text"):
continue
blocks = re.findall(r"```(\w+)?\n(.*?)```", item.get("content", ""), re.DOTALL)
for lang, code in blocks:
print(f"--- {lang or 'text'} ---")
print(code)转换为 OpenAI 微调格式(JSONL):
import json
with open("ChatGPT-my-conversation.json") as f:
messages = json.load(f)
training_data = []
for i in range(0, len(messages) - 1, 2):
user_msg, assistant_msg = messages[i], messages[i + 1]
if user_msg["role"] != "user" or assistant_msg["role"] != "assistant":
continue
user_text = " ".join(c.get("content", "") for c in user_msg.get("contents", []) if c.get("content"))
assistant_text = " ".join(c.get("content", "") for c in assistant_msg.get("contents", []) if c.get("content"))
if user_text and assistant_text:
training_data.append({
"messages": [
{"role": "user", "content": user_text},
{"role": "assistant", "content": assistant_text},
]
})
with open("training.jsonl", "w") as f:
for item in training_data:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
print(f"已生成 {len(training_data)} 条训练样本")AI Exporter 的其他优势
JSON 只是 AI Exporter 支持的格式之一。如果你还需要可读文档,可以在同一个扩展里切换输出:
| 格式 | 最适合的场景 |
|---|---|
| JSON | 数据分析、迁移、自动化、微调 |
| Markdown | Obsidian、博客写作、知识库 |
| 分享、打印、归档 — 保留代码高亮、LaTeX、图片 | |
| Word | 需要二次编辑的办公文档 |
| Notion | 一键同步到知识库数据库 |
| TXT / 图片 | 轻量存档、视觉分享 |
其他核心能力:
- 选择性导出 — 整条对话、部分消息、单条回复悬浮导出
- 格式保留 — 代码块、表格、LaTeX 公式、Canvas、图片
- 多平台支持 — ChatGPT、Claude、Gemini、DeepSeek 等 10+ 平台
- 本地处理 — JSON、Markdown、TXT 主要在浏览器完成,不上传服务器
- 免费额度 — JSON、Markdown、TXT 免费;PDF、Word、Notion 有每日免费次数
多对话快速导出(多标签工作流)
虽然没有官方那种「一键导出全部对话」,但用多标签工作流可以高效处理多个对话:
- 在 ChatGPT 侧边栏 Cmd/Ctrl + 点击 多个对话,每个在新标签页打开。
- 预配置格式和下载目录(关闭浏览器「每次询问保存位置」)。
- 每个标签页:选择 → 导出 → 关闭标签,约两次点击。
- 20 个对话大约 3–5 分钟,输出格式规范、单独命名。
局限性
- 没有官方那种「一键导出全部对话」按钮。
- 完整账号备份仍建议配合官方导出。
- PDF、Word、Notion 有每日免费额度(JSON、Markdown、TXT 免费)。
5. 方法三:官方导出 + 转换工具(批量可读归档)
适合技术用户,或需要把几百条历史对话一次性转成 Markdown 的场景。
适用场景
- 全历史批量转可读文档
- 导入 Obsidian、Logseq 建知识库
- 不适合:只想快速保存当前这一条对话
操作步骤
- 先完成方法一,获取官方 ZIP 导出包。
- 解压,找到
conversations.json。 - 选择转换工具:
- 命令行:
npx chatgpt-to-markdown path/to/archive - 浏览器转换器:ChatGPT Conversations to Markdown(本地处理,不上传)
- 桌面应用:Univik 等(支持 PDF / DOCX)
- 命令行:
- 每个对话生成独立
.md文件。
优势与局限性
| 优势 | 局限性 |
|---|---|
| 真正批量、可读、适合一次性迁移 | 两步流程,需一定技术门槛 |
| 开源工具多,本地处理保障隐私 | 输出质量因工具而异,代码块 / 表格转换可能参差不齐 |
| 无选择性导出,所有对话均被转换 | |
| 新增对话后需重新走完整流程 |
6. 三种方法对比
| 功能 | 官方导出 | AI Exporter | 官方 + 转换工具 |
|---|---|---|---|
| 导出范围 | 全部 | 按需选择 | 全部 |
| JSON 结构 | 树形 mapping | 扁平消息数组 | 需先解析官方 JSON |
| 输出格式 | JSON / HTML | JSON / PDF / MD / Word / Notion 等 | mainly Markdown |
| 时间戳 / 模型名 | 有,但难提取 | 每条消息直接可读 | 取决于转换工具 |
| 选择性导出 | 否 | 是(逐条消息) | 否 |
| 多平台 | 仅 ChatGPT | ChatGPT + 10+ 平台 | 仅 ChatGPT |
| 技术门槛 | 无 | 无 | 中等 |
| 导出 20 个对话 | 数分钟至数天 | 约 3–5 分钟 | 等待 + 转换 |
| 适合场景 | 兜底备份 | 日常导出 + 结构化 JSON | 历史批量归档 |
7. 推荐工作流:组合使用
第一步:官方导出做完整备份
- 设置 → 数据控制 → 导出数据
- ZIP 存云盘或外部硬盘
- 建议频率:每月一次,或删除旧对话前
第二步:AI Exporter 导出重要对话
完成重要对话后即时导出,按用途选格式:
- 脚本分析 / 迁移 / 微调 → JSON
- 研究报告、知识库 → Markdown
- 客户交付 → PDF
- 团队协作 → Notion 同步
第三步(可选):批量转换备份
需要全历史可读存档时,用方法三把官方 ZIP 批量转成 Markdown。
8. 应该导出为哪种格式?
| 你的目标 | 最佳格式 | 最佳方法 |
|---|---|---|
| 完整账号备份(安全网) | JSON(官方原始) | 官方导出 |
| 脚本分析 / 微调 / RAG | JSON(结构化) | AI Exporter |
| 知识库(Obsidian / Notion) | Markdown | AI Exporter |
| 给客户 / 同事看 | AI Exporter | |
| 需要二次编辑 | Word | AI Exporter |
| 团队协作知识库 | Notion | AI Exporter |
| 全历史批量可读存档 | Markdown | 官方 + 转换工具 |
9. 常见问题
Q1:ChatGPT 能直接导出 JSON 吗?
可以,但只能通过官方批量数据导出(Settings → Data Controls → Export Data),输出的是包含所有对话、结构复杂的嵌套文件。如果需要按单个对话导出且结构清晰的 JSON,请使用 AI Exporter。
Q2:AI Exporter 的 JSON 和官方 conversations.json 有什么区别?
AI Exporter 输出扁平消息数组,每条消息包含 role、model、modelId、created_at 和结构化 contents,可以直接在循环中遍历。官方导出使用树形 mapping 结构,包含父子引用关系、深埋在 parts[] 中的内容和 Unix 浮点时间戳,需要大量解析工作。
Q3:JSON 里会保留模型名和时间戳吗?
会。每条 assistant 消息带有 model、displayModel 和 modelId(如 GPT-4o),created_at 字段记录消息时间,便于排序和按模型分组统计。
Q4:思维过程、网页搜索来源、代码块会保留吗?
会。AI Exporter 的 contents 数组分别用 thinking、sources、markdown 等类型保留这些内容,比简单复制粘贴完整得多。
Q5:JSON 导出免费吗?
是的,JSON 导出在 AI Exporter 免费版本中即可使用,无需账户或订阅。
Q6:能只导出 AI 回复、不包含我的提示词吗?
可以。点击 Select 并选择 Answers 即可只选择 AI 回复,也可以手动勾选 / 取消单条消息。
Q7:导出的 JSON 能用于 OpenAI API 或微调吗?
可以。AI Exporter 使用 user / assistant 角色标签,与 API 格式一致,只需从 contents 中提取文本内容即可,参见上文微调转换示例。
Q8:AI Exporter 能批量导出所有对话吗?
没有官方那种一键全量导出,但可以用多标签工作流逐个快速导出。完整账号备份仍建议配合官方导出。
Q9:官方导出要等多久?下载链接过期了怎么办?
通常 20–30 分钟,对话多的账号可能更久。下载链接 24 小时内有效,过期后需要重新发起导出请求。
Q10:免费 ChatGPT 账号能导出吗?
可以。官方导出和 AI Exporter 均支持免费账号。
Q11:AI Exporter 和 ChatGPT Exporter 有什么区别?
两者都支持 JSON 导出,但 AI Exporter 覆盖 ChatGPT、Claude、Gemini、DeepSeek 等 10+ 平台,还支持 Word、Notion 等格式,且 contents 数组保留了思维过程、搜索来源、Canvas 等更多结构化类型。
Q12:应该多久备份一次?
建议每月做一次官方全量导出。重要对话在完成后用 AI Exporter 即时导出,不必等月度备份。
10. 总结
没有单一完美方案,组合策略最有效:
- 官方导出 = 安全网,兜底完整备份
- AI Exporter = 日常可用格式,尤其是最好用的结构化 JSON
- 官方 + 转换工具 = 全历史可读归档
👉 立即开始:安装 AI Exporter ,同时记得定期做一次官方数据导出。