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가 포함됩니다. 스크립트 분석, 마이그레이션, 2차 개발에 최적입니다. - 권장 조합: 공식 보내기로 정기적인 전체 백업. 일상적인 단일 또는 선별 대화는 AI Exporter로 JSON 또는 PDF / Markdown으로. 수백 개의 과거 대화를 한 번에 읽기 쉬운 문서로 변환할 때는 공식 JSON + 변환 도구를 사용합니다.
3. 방법 1: ChatGPT 공식 데이터 보내기 (전체 백업에 최적)
OpenAI가 제공하는 유일한 공식 일괄 보내기 방식입니다.
적합한 상황
- 정기적인 계정 단위 전체 백업
- 다른 AI 플랫폼으로 마이그레이션 (예: Gemini로 채팅 가져오기)
- 부적합: 특정 대화 하나만 저장하고 싶을 때, 읽기 쉬운 문서를 바로 전달하고 싶을 때
작업 단계
- 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. 방법 2: 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": "How do I read a CSV in Python and filter columns?" }
],
"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": "You can use pandas:\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\n```" },
{ "type": "thinking", "content": "User needs a basic CSV read example..." },
{ "type": "sources", "sources": [{ "title": "pandas documentation", "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 + 클릭으로 여러 대화를 열어 각각 새 탭에서 표시합니다.
- 형식과 다운로드 폴더를 미리 설정합니다 (브라우저의 「저장 위치를 매번 확인」 비활성화).
- 각 탭에서: 선택 → 보내기 → 탭 닫기. 약 2번 클릭입니다.
- 20개 대화에 약 3~5분. 출력 형식이 통일되고 개별 이름이 지정됩니다.
제한 사항
- 공식 스타일의 「계정 전체 원클릭 보내기」 버튼이 없습니다.
- 완전한 계정 백업에는 공식 보내기와 병행을 권장합니다.
- PDF, Word, Notion에는 매일 무료 할당량이 있습니다 (JSON, Markdown, TXT는 무료).
5. 방법 3: 공식 보내기 + 변환 도구 (일괄 읽기 쉬운 아카이브)
기술 사용자용, 또는 수백 개의 과거 대화를 한 번에 Markdown으로 변환하고 싶을 때 적합합니다.
적합한 상황
- 전체 기록을 일괄로 읽기 쉬운 문서로 변환
- Obsidian, Logseq에 가져와 지식 베이스 구축
- 부적합: 지금 열고 있는 대화를 빠르게 저장하고 싶을 때
작업 단계
- 먼저 방법 1을 완료하여 공식 ZIP 보내기 패키지를 받습니다.
- 압축 해제 후
conversations.json을 찾습니다. - 변환 도구를 선택합니다:
- 명령줄:
npx chatgpt-to-markdown path/to/archive - 브라우저 변환기: ChatGPT Conversations to Markdown (로컬 처리, 업로드 없음)
- 데스크톱 앱: Univik 등 (PDF / DOCX 지원)
- 명령줄:
- 각 대화가 개별
.md파일로 생성됩니다.
장점과 제한
| 장점 | 제한 |
|---|---|
| 진정한 일괄 처리, 읽기 쉬움, 일회성 마이그레이션에 적합 | 2단계 프로세스, 어느 정도 기술 역량 필요 |
| 오픈소스 도구가 많고, 로컬 처리로 프라이버시 보호 | 출력 품질은 도구마다 다르며, 코드 블록 / 표 변환에 편차 있을 수 있음 |
| 선택적 보내기 없음. 모든 대화가 변환됨 | |
| 새 대화 추가 시 전체 프로세스를 다시 실행해야 함 |
6. 3가지 방법 비교
| 기능 | 공식 보내기 | AI Exporter | 공식 + 변환 도구 |
|---|---|---|---|
| 보내기 범위 | 전체 | 필요에 따라 선택 | 전체 |
| JSON 구조 | 트리형 mapping | 플랫 메시지 배열 | 먼저 공식 JSON 파싱 필요 |
| 출력 형식 | JSON / HTML | JSON / PDF / MD / Word / Notion 등 | 주로 Markdown |
| 타임스탬프 / 모델명 | 있지만 추출 어려움 | 각 메시지에서 직접 읽기 가능 | 변환 도구에 따라 다름 |
| 선택적 보내기 | 불가 | 가능 (메시지 단위) | 불가 |
| 멀티 플랫폼 | ChatGPT만 | ChatGPT + 10개 이상 플랫폼 | ChatGPT만 |
| 기술적 난이도 | 없음 | 없음 | 중간 |
| 20개 대화 보내기 | 수분~수일 | 약 3~5분 | 대기 + 변환 |
| 최적 용도 | 안전망 백업 | 일상 보내기 + 구조화 JSON | 기록 일괄 아카이브 |
7. 권장 워크플로: 조합해서 사용
1단계: 공식 보내기로 완전 백업
- 설정 → 데이터 제어 → 데이터 보내기
- ZIP을 클라우드 또는 외장 HDD에 저장
- 권장 빈도: 월 1회, 또는 오래된 대화 삭제 전
2단계: AI Exporter로 중요한 대화 보내기
가치 있는 대화가 끝나면 바로 보내고, 용도에 따라 형식을 선택합니다:
- 스크립트 분석 / 마이그레이션 / 파인튜닝 → JSON
- 조사 보고서, 지식 베이스 → Markdown
- 고객 전달 → PDF
- 팀 협업 → Notion 동기화
3단계 (선택): 백업 일괄 변환
전체 기록의 읽기 쉬운 아카이브가 필요하면 방법 3으로 공식 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는 API 형식과 일치하는 user / assistant 역할 레이블을 사용합니다. 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: 얼마나 자주 백업해야 하나요?
공식 전체 보내기는 월 1회를 권장합니다. 중요한 대화는 완료 후 바로 AI Exporter로 보내세요. 월간 백업을 기다릴 필요가 없습니다.
10. 요약
단일 완벽한 방법은 없습니다. 조합 전략이 가장 효과적입니다:
- 공식 보내기 = 안전망, 완전 백업의 최후 방어선
- AI Exporter = 일상적으로 쓸 수 있는 형식, 특히 가장 실용적인 구조화 JSON
- 공식 + 변환 도구 = 전체 기록의 읽기 쉬운 아카이브
👉 지금 시작하기: AI Exporter 설치 . 정기적인 공식 데이터 보내기도 잊지 마세요.