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로 채팅 가져오기)
  • 부적합: 특정 대화 하나만 저장하고 싶을 때, 읽기 쉬운 문서를 바로 전달하고 싶을 때

작업 단계

  1. chatgpt.com 을 열고 로그인합니다.
  2. 왼쪽 하단 프로필 아이콘 → Settings(설정) 을 클릭합니다.

ChatGPT 계정 메뉴에서 Settings 항목이 강조 표시됨

  1. Data controls(데이터 제어) 로 이동합니다.
  2. Export data(데이터 보내기) → 확인합니다.

ChatGPT Data controls 패널에서 Export data 버튼이 강조 표시됨

  1. OpenAI 이메일을 기다립니다 (보통 20~30분. 대화가 많은 계정은 더 오래 걸릴 수 있으며, 공식 문서 에 따르면 최대 24시간).
  2. 이메일의 다운로드 링크를 클릭합니다 (24시간 유효. 스팸 폴더도 확인하세요).
  3. ZIP을 압축 해제하고 conversations.json을 찾습니다 (최신 버전에서는 conversations-000.json 등 여러 파일로 분할될 수 있습니다).

얻을 수 있는 것

  • conversations.json — 트리형 mapping 구조의 전체 대화 기록. 타임스탬프와 모델 정보 포함
  • chat.html — 브라우저에서 볼 수 있는 기본 버전
  • 이미지, 첨부 파일 포함 가능 (DALL·E 이미지, 임시 대화, 삭제된 채팅은 포함되지 않을 수 있음)

공식 JSON의 한계

OpenAI 공식 보내기도 JSON이지만, 내부 저장용 구조로 스크립트에 바로 사용할 수 없습니다:

  1. 트리형 mapping + 부모-자식 포인터 — 대화 순서를 재구성하려면 역방향 순회가 필요합니다.
  2. 프롬프트 편집 시 분기 발생 — 하나의 대화에 여러 경로가 있어 파싱이 복잡해집니다.
  3. 텍스트가 content.parts[] 깊숙이 묻혀 있음 — 단순 문자열 필드가 아닙니다.
  4. 타임스탬프는 Unix 부동소수점 — 예: 1713350400.0. 추가 변환이 필요합니다.
  5. 전체 또는 미보내기 — 특정 메시지 선택 보내기나 즉시 보내기 불가.
장점상세
공식이며 신뢰할 수 있음OpenAI 제공. 서드파티 불필요
진정한 일괄 보내기계정 내 모든 대화를 한 번에
메타데이터 풍부타임스탬프, 모델 정보, 대화 구조 포함
설치 불필요ChatGPT 설정 화면에서 직접 조작
제한상세
전체 또는 미보내기특정 대화나 날짜 범위 선택 불가
구조가 복잡트리형 JSON은 사용 전 대량 파싱 필요
형식 옵션 없음PDF, Markdown, Word 선택지 없음
전달이 느림수분에서 수일 소요 가능
콘텐츠 누락임시 대화, 삭제된 채팅, 일부 AI 고유 콘텐츠 누락 가능

요약: 공식 보내기는 안전망으로 적합하지만, 일상적으로 구조화된 데이터를 즉시 얻는 방법은 아닙니다.

4. 방법 2: AI Exporter (일상 보내기에 최적)

솔직히 말씀드립니다: 이것은 저희가 개발한 제품입니다. 아래에 할 수 있는 것과 할 수 없는 것을 정직하게 설명합니다.

AI Exporter로 JSON을 보내는 이유

공식 conversations.json과 비교하면, AI Exporter의 JSON은 프로그램 처리를 위해 설계되었습니다:

관점공식 conversations.jsonAI Exporter JSON
구조트리형 mapping, 대량 파싱 필요플랫 메시지 배열, 직접 순회 가능
보내기 범위계정 전체 일괄단일 대화 / 일부 메시지 필요에 따라
속도수분에서 수일즉시 원클릭
타임스탬프Unix 부동소수점각 메시지에 사람이 읽을 수 있는 created_at
모델 정보metadata에 분산각 assistant 메시지에 model / displayModel / modelId
콘텐츠 유형신기능 지원 지연contents 배열로 여러 구조화 유형 보존

AI Exporter JSON 구조

최상위는 메시지 배열입니다 (공식의 metadata + mapping이 아님):

json
[
  {
    "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 루프로 직접 순회할 수 있습니다. 중첩 트리나 부모-자식 포인터 처리가 필요 없습니다.

사용자가 가장 관심 있는 필드

메시지 단위:

필드설명
roleuser(내 메시지) 또는 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_widgetCanvas / 인터랙티브 아티팩트
shopping_card / shopping_table쇼핑 추천 카드 및 비교표

JSON 보내기는 PDF나 Markdown의 「타임스탬프 표시 여부」 등 표시 설정과 관계없이 구조화 데이터를 완전히 보존합니다.

AI Exporter로 JSON 보내는 방법

  1. Chrome 웹 스토어 에서 AI Exporter를 설치합니다 (Edge, Firefox에서도 사용 가능).
  2. 보낼 ChatGPT 대화를 엽니다.
  3. 확장 프로그램 아이콘 클릭 → JSON 형식을 선택합니다.
  4. 선택 사항: 필요한 메시지만 선택하여 보냅니다.
  5. 선택 사항: 「클립보드에 복사」를 활성화하면 JSON을 스크립트나 API 도구에 바로 붙여넣을 수 있습니다.

보낸 JSON으로 할 수 있는 것

아래 예시는 AI Exporter JSON 형식을 기반으로 합니다. 공식 보내기를 사용하는 경우, 먼저 mapping 트리에서 메시지를 추출하세요.

Python으로 대화 빠르게 집계:

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']))}")

모든 코드 블록 추출:

python
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)으로 변환:

python
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데이터 분석, 마이그레이션, 자동화, 파인튜닝
MarkdownObsidian, 블로그 작성, 지식 베이스
PDF공유, 인쇄, 아카이브 — 코드 하이라이트, LaTeX, 이미지 보존
Word추가 편집이 필요한 오피스 문서
Notion지식 베이스에 원클릭 동기화
TXT / 이미지경량 아카이브, 시각적 공유

기타 핵심 기능:

  • 선택적 보내기 — 전체 대화, 일부 메시지, 단일 응답 호버 보내기
  • 형식 보존 — 코드 블록, 표, LaTeX 수식, Canvas, 이미지
  • 멀티 플랫폼 — ChatGPT, Claude, Gemini, DeepSeek 등 10개 이상 플랫폼
  • 로컬 처리 — JSON, Markdown, TXT는 주로 브라우저에서 처리. 서버에 업로드하지 않음
  • 무료 할당량 — JSON, Markdown, TXT 무료. PDF, Word, Notion은 매일 무료 횟수 제공

여러 대화 빠른 보내기 (멀티 탭 워크플로)

공식의 「모든 대화 원클릭 보내기」는 없지만, 멀티 탭 워크플로로 여러 대화를 효율적으로 처리할 수 있습니다:

  1. ChatGPT 사이드바에서 Cmd/Ctrl + 클릭으로 여러 대화를 열어 각각 새 탭에서 표시합니다.
  2. 형식과 다운로드 폴더를 미리 설정합니다 (브라우저의 「저장 위치를 매번 확인」 비활성화).
  3. 각 탭에서: 선택 → 보내기 → 탭 닫기. 약 2번 클릭입니다.
  4. 20개 대화에 약 3~5분. 출력 형식이 통일되고 개별 이름이 지정됩니다.

제한 사항

  • 공식 스타일의 「계정 전체 원클릭 보내기」 버튼이 없습니다.
  • 완전한 계정 백업에는 공식 보내기와 병행을 권장합니다.
  • PDF, Word, Notion에는 매일 무료 할당량이 있습니다 (JSON, Markdown, TXT는 무료).

5. 방법 3: 공식 보내기 + 변환 도구 (일괄 읽기 쉬운 아카이브)

기술 사용자용, 또는 수백 개의 과거 대화를 한 번에 Markdown으로 변환하고 싶을 때 적합합니다.

적합한 상황

  • 전체 기록을 일괄로 읽기 쉬운 문서로 변환
  • Obsidian, Logseq에 가져와 지식 베이스 구축
  • 부적합: 지금 열고 있는 대화를 빠르게 저장하고 싶을 때

작업 단계

  1. 먼저 방법 1을 완료하여 공식 ZIP 보내기 패키지를 받습니다.
  2. 압축 해제 후 conversations.json을 찾습니다.
  3. 변환 도구를 선택합니다:
    • 명령줄: npx chatgpt-to-markdown path/to/archive
    • 브라우저 변환기: ChatGPT Conversations to Markdown (로컬 처리, 업로드 없음)
    • 데스크톱 앱: Univik 등 (PDF / DOCX 지원)
  4. 각 대화가 개별 .md 파일로 생성됩니다.

장점과 제한

장점제한
진정한 일괄 처리, 읽기 쉬움, 일회성 마이그레이션에 적합2단계 프로세스, 어느 정도 기술 역량 필요
오픈소스 도구가 많고, 로컬 처리로 프라이버시 보호출력 품질은 도구마다 다르며, 코드 블록 / 표 변환에 편차 있을 수 있음
선택적 보내기 없음. 모든 대화가 변환됨
새 대화 추가 시 전체 프로세스를 다시 실행해야 함

6. 3가지 방법 비교

기능공식 보내기AI Exporter공식 + 변환 도구
보내기 범위전체필요에 따라 선택전체
JSON 구조트리형 mapping플랫 메시지 배열먼저 공식 JSON 파싱 필요
출력 형식JSON / HTMLJSON / 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 (공식 원본)공식 보내기
스크립트 분석 / 파인튜닝 / RAGJSON (구조화)AI Exporter
지식 베이스 (Obsidian / Notion)MarkdownAI Exporter
고객 / 동료와 공유PDFAI Exporter
추가 편집 필요WordAI Exporter
팀 지식 베이스NotionAI 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 설치 . 정기적인 공식 데이터 보내기도 잊지 마세요.