ChatGPTのログをexportしてjsonlにするメモ (指示データセットに使いたい)

はじめに

大規模言語モデルの構築にあたって、最も大切と言われるのは、モデルのファインチューニングとよばれる部分です。
ファインチューニングは、モデルが人間ときちんと対話できるようになるための訓練で、AIは、実際の対話データなどを学習することで、人間との関わり方を学びます。

最近は指示データセットを作る取り組みを行っています。

が、ゼロからデータセットを作るのはなかなか骨が折れます。

そこで思いついたのは、ある意味当たり前のことだったんですが、「ChatGPTとの実際の対話記録」を実際のデータセットの構築に活用する、というものです。*

*色々と注意点はあります。後述。

本記事では、ChatGPTのログを出力・解析する方法について示します。

データの出力

出力は簡単です。

画面の左下のアカウントのボタンから、「設定」→「データ制御」→「データをエクスポート」するだけです。

エクスポートを開始すると、登録したemailにデータが送られます。その中に、json形式のファイルが入っています。

データ解析

jsonデータには、細々とした不要な情報が入っているので、それをクレンジングします。処理コードは以下の通り。

import json

#jsonの読み込み
with open("conversations.json", "r") as f:
    data = json.load(f)

data_list=[]
for item in data:
    d={}
    title = item["title"]

    d["title"]=title

    print(f"---------\n Title: {title}")

    mapping = item["mapping"]
    conversations=[]
    for key in mapping.keys():
        message = mapping[key]["message"]
        if message:
            message_id = message["id"]
            author_role = message["author"]["role"]
            content=""
            if message["content"]["content_type"]=="multimodal_text":
                continue
            if "parts" in message["content"]:
                content= message["content"]["parts"]
                content="\n".join(content)
            if "text" in message["content"]:
                content+="\n"+(message["content"]["text"])
            if "model_slug" in message["metadata"]:
                print("Model_slug:", message["metadata"]["model_slug"])
                pass
            if content=="":
                continue
            print(f"Author role: {author_role}")
            print(f"Content: {content}")
            conversations.append((author_role,content))
    d["conversations"]=conversations
    data_list.append(d)

#出力
out_path="out.json
with open(out_path,"w") as f:
    for d in data_list:
        f.write(json.dumps(d,ensure_ascii=False)+"\n")

筆者は1年ほど、ChatGPTを使いました。
1000件ほどのスレッド(約13 MB)で、ChatGPTと会話をしたようです。

中身を見てみる

こんな感じでした。半分以上は、IT系の相談でした。
データセットとして使う場合は、カテゴリのバランスは気をつける必要があるかもしれません。

どう使うか?

会話データセットとして公開する

ChatGPTとの会話ログをデータセットとして公開することで、publicに使えるデータ資源を増やすことができます。
ただし、ChatGPTの利用規約上、GPTの出力を学習したAIを作っても、商用利用は難しい点については注意が必要です。

質問集として活用する

GPTの出力をAIの学習に使うのは、筋が悪いかもしれません。一方、入力の方は、そのような制約を受けません。
机上のやりとりではなく、実際の現場のユーザーの要望 = GPTに対する質問 ですので、まさに実用に近い質問集といえます。

自分で言うのもなんですが、かなり雑な質問が大半でした。
以下が、質問の例です。(人間に聞いたら、もっと詳しく説明しろ・ちゃんと調べろと、怒られそうですね)

  • deduplicate コマンドを全てkill linux

  • コマンド remote-containers.attachToRunningContainerFromViewlet の実行中にエラー The operation was aborted が発生しました。remote-containers.attachToRunningContainerFromViewlet を提供する拡張機能が原因である可能性があります。

  • cv2で、グレースケールにするコード

  • deepspeedのstage3でlora

  • datasetsライブラリで、listデータを読み取りたい

このような、ユーザーの手間を最小限に抑えた(雑な)質問の意図を的確に読み取り、真摯に回答するbotこそ、真に現場で求められるものかもしれません。

今後の取り組み

以下の計画を考え中です。

  • 他所に出せないやりとりを簡便に除くフィルターシステムの構築

  • 協力者を募りながら、データセットを公開する

    • 質問部分は、CC0ライセンス

    • GPTの回答部分は、CC-NC系ライセンス

  • ライセンス上、問題のない回答部分を頑張って作成する

このあたり、進捗があったら、追記します。

この記事が気に入ったらサポートをしてみませんか?