Экспорт данных ChatGPT в Markdown: разговор — это дерево, а не список
Запросите свои данные у ChatGPT — и получите .zip, в котором из полезного есть один conversations.json. Откроете его в расчёте на список сообщений и найдёте другое: объект mapping, набитый записями с ключами-идентификаторами, каждая из которых указывает на родителя и на набор потомков. Сообщения там есть. Но разговор, который вы помните, — это один путь по графу.
Эта страница восстанавливает такой путь и записывает его в Markdown. Бросьте сюда архив или распакованный JSON — разбор произойдёт в этой вкладке браузера.
Почему это хранится графом
Потому что интерфейс позволяет переписывать историю. Отредактируйте прежний запрос — и ветка отходит с этого места. Перегенерируйте ответ — получите альтернативу, между которыми можно листать стрелочками. Обе версии продолжают существовать; интерфейс просто показывает одну.
Плоский массив такого не выражает. Поэтому выгрузка хранит все ветки, а увиденная вами расшифровка восстанавливается так: начать с узла без родителя и идти вниз, выбирая на каждом шаге среди потомков. Соглашение, совпадающее с интерфейсом, — брать последнего потомка, потому что перегенерация дописывается после того ответа, который она заменила. Так и делает этот инструмент — поэтому на выходе читается разговор, который у вас был, а не чересполосица всех попыток.
При обходе стоит защита от циклов. На корректной выгрузке она срабатывать не должна, но бесконечный цикл в парсере — исход хуже, чем обрезанная расшифровка.
Содержимое, которого вы никогда не видели
В выгрузке есть материал, который интерфейс прячет, и воспроизведение его дословно даёт расшифровку, не совпадающую с вашей памятью о разговоре:
- Системное сообщение. Каждый разговор открывается инструкциями, которых вы не писали и не видели. В файле оно лежит полноценным сообщением.
- Трафик инструментов. Веб-поиск, выполнение кода и генерация картинок оставляют собственные узлы запроса и результата, адресованные не пользователю, а другому получателю. Это машинерия за ответом, а не часть диалога.
- Явно скрытые узлы. У части сообщений стоит флаг «не показывать в разговоре». Выгрузка про это честна, и флаг уважается.
Все три категории отфильтровываются, остаются реплики пользователя и ассистента.
Содержимое сообщения не всегда строка
Поле содержимого со временем разрослось. Обычная текстовая реплика несёт массив строк parts. Часть типов сообщений использует вместо него поле text. Мультимодальные реплики кладут в массив частей объекты, по одному на элемент: загруженная картинка и сопровождающий вопрос — это отдельные записи. Результаты code interpreter приходят в собственной форме.
Парсер читает и строковую форму, и массив строк, и массив объектов, вытаскивая текст из каждой. Нетекстовые части не дают ничего — ни заглушки, ни ошибки, — так что разговор с картинками приходит в виде слов вокруг них.
Почему Markdown — правильная цель
Ассистент и так пишет на Markdown. В его ответах есть огороженные блоки кода, заголовки, маркированные списки и таблицы, и все эти знаки лежат в выгрузке обычными символами. Конвертация в простой текст оставила бы их торчать буквальными обратными кавычками и решётками — разметка ни отрисована, ни убрана, просто брошена.
Сохранить Markdown — значит оставить блоки кода блоками кода. Вставьте результат в любое приложение для заметок, генератор статических сайтов, инструмент документации или вики — и он отрисуется. Имена говорящих выделяются жирным, а каждый разговор получает заголовок из своего названия, так что выгрузка за несколько лет становится документом, по которому можно перемещаться, а не сплошным полотном.
Выгрузки бывают большими
Пара лет регулярного использования даёт conversations.json на десятки, а то и сотни мегабайт, с тысячами разговоров внутри. Это проблема для текстового редактора, который попытается подсветить синтаксис во всём файле, и для любого инструмента, который сначала форматирует JSON и только потом что-то показывает.
Здесь разбор происходит один раз, в памяти, и отрисовывается только читаемый результат. Каждый разговор становится разделом под собственным заголовком, разделы отбиты друг от друга, так что по результату можно искать наполовину вспомнившуюся фразу, а не прокручивать.
Как запросить выгрузку
В ChatGPT: Настройки, затем Управление данными, затем Экспортировать данные. Архив придёт на почту, обычно за считаные минуты, ссылкой на скачивание с ограниченным сроком. В zip лежат ещё HTML-просмотрщик и разные медиафайлы; здесь нужен только JSON, но и весь архив целиком бросить сюда можно.
Ничего не загружается на сервер
История ваших разговоров с ChatGPT — подробная запись того, над чем вы работали, о чём беспокоились и в чём просили помощи. Это один из самых откровенных файлов, которые есть у большинства людей. Разбор идёт на JavaScript в этой вкладке, шага загрузки нет, поэтому ни один сервер его не получает и удалять потом нечего.
У выгрузок Claude есть своя страница — экспорт Claude в Markdown, а общая страница экспорта переписок берёт любую поддерживаемую платформу.