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)