ChatGPTのエクスポートデータをプログラムから扱う

ChatGPTからエクスポートした会話データをプログラム上から扱いやすくしたい。 最終的には、会話データをいい感じにNotionに保存して、検索したり個人ノートとして使いやすくしたい。

まずは、会話データをPythonから使いやすい状態にして、その後にNotionにインポートする方法を検討する。

import json
from typing import Optional
from dataclasses import dataclass
from dataclasses_json import dataclass_json

path = "..."


@dataclass_json
@dataclass
class Author:
    """
    メッセージの送信者情報
    """

    role: str
    name: Optional[str]
    metadata: dict

    def __str__(self):
        return self.role


@dataclass_json
@dataclass
class Message:
    """
    メッセージ情報
    """

    id: str
    author: Author
    create_time: float
    update_time: Optional[float]
    content: dict
    end_turn: Optional[bool]
    weight: float
    metadata: dict
    recipient: str

    def __str__(self):
        content = "".join(self.content["parts"])
        return f"{self.author}: {content}"


@dataclass_json
@dataclass
class Mapping:
    """
    メッセージのマッピング情報
    """

    id: str
    message: Optional[Message]
    parent: Optional[str]
    children: list[str]


@dataclass_json
@dataclass
class ChatHistory:
    """
    Chat履歴データ
    """

    id: str
    title: str
    create_time: float
    update_time: float
    mapping: dict[str, Mapping]
    current_node: str


class ExportDataService:
    """
    エクスポートしたデータを扱うサービス
    """

    def __init__(self, path: str):
        self.path = path
        self.histories = self._load_history(path)

    def _load_history(self, path: str) -> list:
        """
        JSONファイルから履歴を読み込む
        """
        with open(path, "r") as file:
            data = json.load(file)

        result = []
        for row in data:
            history = ChatHistory.from_dict(row)
            result.append(history)

        return result

    def display_chat(self, offse: int = 0):
        """
        指定されたChat履歴を表示する
        """
        chat = self.histories[offset]
        messages = []
        for _, v in chat.mapping.items():
            if v.message:
                messages.append(v.message)

        for message in messages:
            print(message)

だいたいこんな感じで使う。

path = "path/to/conversations.json"
import chat_history

service = chat_history.ExportDataService(path)
service.display_chat(0)