社長(AI)に頼んで1万件(10K)の商用利用可能(llama2ライセンス)な日本語マルチターン会話データセットを作ってもらった
注意:llama2の派生モデルであるllama2Pro8Bで生成しているので商用利用可能な範囲に制限があります。詳しくはllama2ライセンスを確認してください
https://ai.meta.com/resources/models-and-libraries/llama-downloads/
「社長、ただいま出張から戻りました!」
「・・・」
「お願いしていた稟議の件、どうなりましたでしょうか?」
$ cat llama2pro8b.txt |wc -l
29110
「お、3万件、ずいぶんできましたね!早速スクリーニングにかけてみたいと思います!」
$ python conv2train.py llama2pro8b.txt > ja_conv_llama2pro8b_10k.jsonl
$ cat ja_conv_llama2pro8b_10k.jsonl |wc -l
10912
「おお、ついに1万件!ありがとうございます!」
というわけで出張中も正月中も休まず働いていたFreeAI社の社長(AI)が3万件の会話データを生成し、スクリーニングした結果、1万件の会話データを得ることができた。llamaPro8Bの歩留は30%くらい。そこまで悪くない。
つまり、10万件のデータが欲しければ30万件分生成されるまで待てば良いと言うこと。三日かそこらで3万件なので、あと6日もあればそれくらいになるはず・・・たぶん。
稟議書は前回と変わらず
ちなみに会話データのスクリーニングをする稟議書(プログラム)は以下のような感じ
# コマンドライン引数で指定されたファイルを読み込む
# そのファイルの中身を学習用のデータに変換する
import sys
import os
import json
def conv2train(filename):
with open(filename) as f:
for i in f:
try:
#print(i)
src = json.loads(i)
dst = {"conversations":[]}
if len(src["conversations"])<3: #会話が少なすぎたらエラー
continue
turn="gpt"
for row in src["conversations"]:
if type(row) is str:
#print(row)
continue
x=list(row.items())
for utterance in x:
person=utterance[0]
person=person.replace("生徒","human")
person=person.replace("先生","gpt")
#print("turn:%s person:%s"%(turn,person))
if turn==person: #どちらかが連続で喋っていたらエラー
#print("turn error")
raise Exception("turn error")
turn="%s"%person
#print("turn:%s"%turn)
dst["conversations"].append({"from":person,"value":str(utterance[1])})
print(json.dumps(dst, ensure_ascii=False))
except Exception as e:
print(e, file=sys.stderr)
print(i, file=sys.stderr)
pass
conv2train(sys.argv[1])
とにかくイミフなやつはエラーで落としてるだけ。