OpenAI用のpromptとcompletionのデータ構成についてNotionAI活用による自動生成を試してみた

OpenAI向けの学習用データ作成をNotionAIを通して手軽にできないかと試した結果をまとめてみました。NotionAIによる整形処理についてはまだまだ検証が要りそうです。
2023.06.14

OpenAIへ学習させたいデータを作ろうとした際に、課題は取り込ませるテキストデータの校正や追加、及び管理方法でした。特にそのうちの校正が一番の課題です。正直一つ一つ手作業でやりたくはないというのが本音です。

手元の環境ではNotionAIが一番お手軽なのですが、OpenAIが学習できるフォーマットとなるとまた別問題になってきます。Markdownを除去する必要があるためです。

効率よく、Notion上でテキストを管理しつつ、NotionAIにOpenAI向けテキストを生成させて、さらにOpenAIへ取り込ませるプロセスを試してみました。

Notion上での管理フォーマット

現在のNotionはDBのプロパティ経由にてNotionAIの自動処理が使えます。手間を書けずにテキストを生成するにはならない仕組みといえます。

課題はMarkdownの除去です。本文を元に整形することになりますが、結論として上手くいった本文構成は見出しテキストの組み合わせでした。今回はOpenAI向け加工とわかりやすくするため、見出しにpromptとcompletionの2つを用意しています。NotionAIテンプレートを使った事がある方は察しがつくかと思います。

テーブル内にテキストを入れてNotionAIに整形するよう指示した場合、Markdownが掛かる部分をNotionAIは除去します。例えば、文中の適当な単語にリンクを貼り、NotionAIに整形指示するとリンクが貼られているテキストが抜け落ちた形のテキストが出力されます。

  • テーブル内の対象テキスト
    • リンクが入ったテキスト
  • NotionAIによる加工結果
    • が入ったテキスト

リンク部分がページメンションになった場合等も抜け落ちます。

NotionAIへの指示

今回の指示は揺らぎを減らしたいがために英語での指示としました。指示は重要情報です。

completionについては以下。

plain text of completion

promptについては以下の通り。

plain text of prompt

限度はありますが、completionとpromptの両見出しにテキストを入れてAIプロパティにて生成を行うと、Markdown設定を除去したテキストを出してくれます。

OpenAI向けデータの構成

JSON形式にも次いでにととのえておきます。関数フィールドで以下の構成としました。

concat("{\"prompt\":\"", prop("prompt"), "\", \"completion\": ", "\"", prop("completion"), "\"}")

ローカルでのJSONLファイル生成

DB上のテキストをAPI通してローカル上でJSONL形式として書き出します。

import os
import requests
import json

DATABASE_ID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
NOTION_TOKEN = os.environ['NOTION_TOKEN']

# Fetch database properties
response = requests.post(
    f"https://api.notion.com/v1/databases/{DATABASE_ID}/query",
    headers={
        "Authorization": f"Bearer {NOTION_TOKEN}",
        "Notion-Version": "2022-06-28",
    }
)

if response.status_code == 200:
    result = response.json()["results"]
    # Print the properties
    with open('sample.jsonl', 'w', newline='\n') as f:
        for record in result:
            text = record["properties"]["JSON"]["formula"]["string"]
            f.write(json.dumps(json.loads(text),ensure_ascii=False) + '\n')
else:
    print(f"Error: {response.status_code} - {response.json()['message']}")

OpenAIへの取り込み

pip経由でインストールしたopenaiを使ってアップします。

openai api fine_tunes.create -t sample.jsonl -m ada

たまにStreamが途切れますが、指示されたコマンドにて継続します。

Stream interrupted (client disconnected).
To resume the stream, run:

  openai api fine_tunes.follow -i ft-xxxxxxxxxxxxxxxxxxxxx

あとがき

最適解とは言い難いながらも、Notion上でMarkdownを適用したテキストをOpenAI向けに加工するまでをNotion上で済ませることができました。

今回の手順のポイントは、promptとcompletionの各見出しにテキストを入れておくだけでOpenAI向けデータが自動で担保できるところです。ただ、NotionAIの出してくるテキストがどこまで通用するかはわからないため、出力内容が適切な文章ではない場合は修正が必要になります。