見出し画像

元旦なので社長(AI)にElyza13Bを使ってクリーンで自由な会話データセットを作ってもらってみた

本日から、AIスーパーコンピュータ「継之助」を社長とした、新しい「自由なAI」を推進する会社、FreeAI株式会社をスタートします。

早速なので、先日発表され、日本語性能はピカイチと名高いElyza13Bに、以前GPT-3で作ったのと同じ、Wikipediaの知識からマルチターンの会話データセットを出力するプログラムを書いてみましたのでご報告いたします。

当社の社長である継之助(A100 80Gx8)にElyza13Bを読み込ませて推論させています。量子化は行なっていません。

その結果、こんな感じのデータセットが得られました。

conversation=[{'生徒':'オリオン座デルタ星について教えてください','先生':'「オリオン座デルタ星」は、オンオン座の恒星で2等星だよ'},{'生徒':'どんな軌道で飛びますか?','先生':'ほぼ天の赤道上にあるから、ほぼ真東から登り、ほぼ真西に沈むだろうね'},{'生徒':'地球からはどのくらい遠いの?','先生':'約690光年、つまり約212パーセクと考えられているよ'},{'生徒':'固有名は?','先生':'固有名はMintakaというらしいね'},{'生徒':'由来は?','先生':'アラビア語で「ジャウザーの帯」という意味の「ミンタカ・アル=ジャウザー」からとっているそうだ'}]

conversation=[{'生徒':'M-1グランプリ2015について教えてください','先生':'「M-1グランプリ2015」とは、お笑いライブイベントですよね}, {'徒後':''}]
conversation=[{'生徒':'滄浪閣について教えてください','先生':'「滄浪閣」とは、海の荒い時ぐらいにしか沖に出ないという意味である。』}]
conversation=[{'生徒':'マウリシオ・ポチェッティーノについて教えてください','先生':'「マウリシオ・ポチェッティーノ」とは、あの有名なイタリア人監督のことだ"}, {'徒生': 'どこで出身ですか?',    '$: Argentinean出身なんだよね} ]
conversation=[{'生徒':'インタラクティブアートについて教えてください','先生':'「インタラクティブアート」とは、観衆をから何かによって参加したりする美術品なんだよね"}, {'徒生': 'どのような作品がありますしょうか?', '先生は: "パソコンの中のキャラクターと話をする”といったものやら“体を動かして何かするもの”など様々なものがあるようです。」}, {student:'どのように作るのでしょうか ? ', teacher :'"作品を見る人などが何かを操作することで成立しているためその装置を作る必要があるようだ."} ]
conversation=[{'生徒':'ロイヤル・アーマリーズについて教えてください','先生':'「ロイヤル・アーマリーズ」とは、英国の最古典館でもある国営武装品美術館だ"}, {'学生': '場所は?',    '先生は': "現在はイングランド北部のリーズ市に本館のほか二拠点がある。」},   {student: ‘何年前に開かれたのか知りたい’ , teacher : “1九八五(昭和六〇)年代に閉鎖されて”} ]
conversation=[{'生徒':'スティーブン・ノゴセクについて教えてください','先生':'「スティーブン・ノゴセク」とは、アメリカ出身で大阪育ちの野球選手よね"}, {'徒生': 'どのような選手?',    '先生は: "アメリカンリーグ=ボストン・レッドソークス→ニューヨーック・メッセンジャーズの一員として活躍してる!” }} ]
conversation=[{'生徒':'ENQUIREについて教えてください','先生':'「ENQUIRE」とは、ティーン·バーンズのリース氏が1九八〇年代にコイナで行わったソフトウェアプロジェクトのことだ"}, {'徒手': 'なぜそのようなシステムのが必要だと思われたのですか?', '先生は': '自分のつくっていたものがどんどん古くなるのに気が付いてしまったんだそう。』} ]
conversation=[{'生徒':'ALGO!について教えてください','先生':'「ALGO!」とは、辻村深月の漫画作品のことです"}, {'徒手': 'どのような作品を作ろうとしていたのですか?', '先生は': "私はコンシューマーゲームの限界を感じており、『ファミコマガー版 ドラゴンクエストIII』『北斗の神拳 FINAL MISSION』、『スーパーマリオブラザーズ in SFC』、およびPCエンジン版のドラえもんなどの移植作品の開発を行っていました"} ]
conversation=[{'生徒':'オーシャン郡 (ニュージャージー州)について教えてください','先生':'「オーシャン郡 (ニュージャージー州)」とは、アメリカのニュージャージ...',} ]
conversation=[{'生徒':'インペトゥオーソ級駆逐艦について教えてください','先生':'「インペトゥオーソ級駆逐艦」とは、イタリアの自国で建てられた初めての駆逐んでるんだよ。』}]
conversation=[{'生徒':'VS AMBIVALENZについて教えてください','先生':'「VS AMBIVALENZ」とは、 Nizi Projectことニージスタインコネーションプロデューストゥークンの二次元選抜ユニットプロデューサー育成番組だよね}, {'徒弟': '時なんて?',    '先生は': "時間は2021年である。」 }, {‘学生’: ‘何人選出するの ? ’ ,   “先生の” : ”総合司会 鈴木裕美“ } ]
conversation=[{'生徒':'135丁目駅 (IND8番街線)について教えてください','先生':'「135丁目駅 (IND8番街線)」とは、マニャンッタッとハマットヘップスのヘルラム&ハンミットトンハイッツにかろうる "セント ニックロスあべいぬ”とうこすと “いちさんまちえいきゅううぇいでんとしゃふるかいせんちほうだてえんYOKE YORIHONCHUUREN TOSHIBA CHIKATSU KEISOKUSHO JIMUKIN SHITETSUBUTSUMEDAIRO HAKUBUN RIDOU SENT NICOLAS AVENUE TOZAN ISHIGAMIMARU OTORIMONDO NO MAGARIBI BUILDING DOWNSTRET AVE."なんだよね',}']
conversation=[{'生徒':'ペクサン砲について教えてください','先生':'「ペクサン砲」とは、炉付爆弾が発火するための遅れをつけて発導したものだ。』}]
conversation=[{'生徒':'登別温泉について教えてください','先生':'「登別温泉」とは、オホートクの町・・',}'student': 'どこにありますか?',>'先生は': "鉄道ではなく車なら行けるけど・・・",}" student":'"一番おいしい時期はいつですか?' ,>"先生が": "- 1月の寒祭り前 ", } ]
conversation=[{'生徒':'バルビツール酸系依存症について教えてください','先生':'「バルビツール酸系依存症」とは、バリウムタルトネーイトなどの長期的に使用することによって起こるものです}, {'徒手': 'なぜそうなるのでしょうか?', '先生は: "バレビントルソーサンケイガクのハジケッタノイシン”となるのはその効果が切れるのを嫌ったりして常習利用するためだ"}, {student:'どのように抜ければよいのでしょうか ? ', teacher :'(脱域する際には大変な不調になることがあるんで慎重にした方がいいですよ)' } ]
conversation=[{'生徒':'三春張子人形について教えてください','先生':'「三春張子人形」とは、福島県の古町家である“高いさ”で行われる traditionnel crafts & toysの一つですね }, {'徒手': 'なぜ京風のデザインなのか?',    '先生は': "江戸時代に通貨がなかった時代から商売をするために東海道を通じて東北地方の各地へと伝わったんだそうです"}, {   '学生': 'どうして東京以外で初めて作ったのか気になりました。』 ,     '{教師}`: “会津若松市の仁井田町出身の詩人水原秋桜子が童話作家サトコウによって描かれた絵本に出てくるキャラクター ”うぐいいぬ くまっこいちゃもん’の原案となった物語を書いたのがここ三郎村出身だということです”, } ]
conversation=[{'生徒':'スコッチ・ウイスキーの銘柄一覧について教えてください','先生':'「スコッチ・ウイスキーの銘柄一覧」とは、モルトロースキューティーのことだ"}, {'徒弟': '主な種類は何ですか?', '先生は: "メインなものとしては以下がある”morlto whisky’ ‘important single malt whiskies ’ “Islay Malt ”“ vatted malts and blendedwhiskeys.”となっている。』} ]
conversation=[{'生徒':'ボルダー (コロラド州)について教えてください','先生':'「ボルダー (コロラド州)」とは、アメリカのコロンバリアード州の市になりまして…',}'student': 'え〜!そんなところにも行ったことないなぁ、、',} ]
conversation=[{'生徒':'DNA型鑑定について教えてください','先生':'「DNA型鑑定」とは、デンアの多様部を査察することによって人間などを個別に特定する方法のことだ',} ]
conversation=[{'生徒':'嘉陵江について教えてください','先生':'「嘉陵江」とは、中国南西部,華北東部を水分して流れ出る大河のことです"}, {'徒生': 'その起源は何ですか?', '先生は: ''それは中国の最高峰といわれる海抜八千メートルを超える唐古拉山の雪どけ水が始まりなんです'' }, {student:'何キロぐらい先のところに出まかせてくれるのですか ? ', teacher : "およそ一〇五○㌔のところに出ましこきます"} ]
conversation=[{'生徒':'ブラッドオレンジについて教えてください','先生':'「ブラッドオレンジ」とは、レオン種の一種類なんだ',}'学生': 'なにかが特異なのか?',>'先生は': "ブラジルンと言われる成分が含まれているからだよね", {'student':'"ザンゴレン”と同じなのか’,'>‘さんは`: “同じだとおもう”, } ]
conversation=[{'生徒':'バホフォンドについて教えてください','先生':'「バホフォンド」とは、グルスタヴォ=サントオーニャを中心に活動する音楽の集団だ"}, {'徒手': 'どのようなジャンルの歌曲を制作されています?', '先生は: "アルバカロル”と呼ばれている独自のスタイルを持っているようだ"} ]
conversation=[{'生徒':'南湾山系について教えてください','先生':'「南湾山系」とは、日本で一番大きい山のあるところのだけど』、 {'student': 'それはいつ頃に名づけられましたでしょうか?',    'teacher': "1st これは藤原定家の作だとされている歌謡集、『小律�(しょうりつぎょう)』『新古今和歌類聚抄』、『続百人一首』などに収められた短歌の中に出てくる言葉です。」 },   {‘学生’: ‘日本にはいろいろなあだ名がありますよね。』 ,     ’教師`: “そうですねえ”} ]
conversation=[{'生徒':'ザ・ダンスについて教えてください','先生':'「ザ・ダンス」とは、フリットウドマッコクの生番組演奏なんだよね"}, {'徒手': '何年で発表されたのか?',    '先生は:' "1九八七年にはるかにて結成されちゃったんだけどそのとき記録したのは一〇年後の一二一年だそう", }, {student :'(ビヨンドアルバムのタイトルは何ですか?) , teacher :('それは名盤と言われる傑作のアルバ−トムだから名前覚えておくといいかも!”囁きの街“とか “ミスティーク’っていう有名な曲のあるヤツァイだろ ?"} ]
conversation=[{'生徒':'エスパーニャ級戦艦について教えてください','先生':'「エスパーニャ級戦艦」とは、オスマン帝国軍が一〇年度補充予算にてフランスより購入予定だったが不成立になった二五センチ総武装巡りの四十六㌢縦骨鉄classe d’escadre de croiseur cuirassé classés en "croireaux""(大西洋艦隊旗艦用巡洋艦)としてのプランを立ててたものです。』}]
conversation=[{'生徒':'ラース・フォン・トリアーについて教えてください','先生':'「ラース・フォン・トリアー」とは、オランダ出身の画家のアンドレ·ドランの代表作のひとつですね',}]
conversation=[{'生徒':'柿本ケンサクについて教えてください','先生':'「柿本ケンサク」とは、映 画,コマ-ショナルメッセ―ジなど幅広い分野で活動されている人物ですよ'}, {'徒:何年でデビューしましたかというのは分かりますましたが、、何から始めたとか志望動機はわかりませんでした。』}]
conversation=[{'生徒':'絶対王者について教えてください','先生':'「絶対王者」とは、王座などの保持者が共通にして持つ特別な成績を表彰するための言葉だ"}, {'徒手': '例はある?', '先生は:' "例えばプロレス界においてはパワードウマンらが一時期無敗のまま世界戦を勝ち抜いたケースがあるよね", }, {student: ‘ボクも一度なりたい’ , teacher : “それはいいなぁ” } ]

ただ、残念ながらクォーテーションの整合性についてはElyza-13B-Fast-Instructは弱いようです。ただ、ここまでできていれば、クォーテーションの訂正は他のモデルを使うかか、力技で解決できるかもしれないので、これで「自由な」「日本語独自の」会話データセットが得られる可能性が高まりました。

Elyzaさんへのリクエストとしては、JSON形式をもっと学ばせてほしいなということです。自分で学習させてもいいのですが、それだと二度手間になってしまう気がして、とりあえずこの状態でデータセットを先に作ろうと思います。

ソースコードは汚いですが開示しておきます。何かの参考になれば。

from transformers import AutoTokenizer, AutoModelForCausalLM
import json
import random
import string
import time
import sys
import torch


from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("elyza/ELYZA-japanese-Llama-2-13b-fast-instruct",trust_remote_code=True,torch_dtype=torch.bfloat16,device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("elyza/ELYZA-japanese-Llama-2-13b-fast-instruct",trust_remote_code=True)

B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。質問には全てJSON形式で回答します。JSON以外の余計なことは一切言ってはいけません。もしJSON以外の答えを返せば、あなたは即座に解雇されます"


example="""
conversation=[{'生徒':'オリオン座デルタ星について教えてください','先生':'「オリオン座デルタ星」は、オンオン座の恒星で2等星だよ'},{'生徒':'どんな軌道で飛びますか?','先生':'ほぼ天の赤道上にあるから、ほぼ真東から登り、ほぼ真西に沈むだろうね'},{'生徒':'地球からはどのくらい遠いの?','先生':'約690光年、つまり約212パーセクと考えられているよ'},{'生徒':'固有名は?','先生':'固有名はMintakaというらしいね'},{'生徒':'由来は?','先生':'アラビア語で「ジャウザーの帯」という意味の「ミンタカ・アル=ジャウザー」からとっているそうだ'}]
"""

order= (   "オリオン座デルタ星について書かれた以下の文章を読んで先生と生徒で会話する会話文を作りなさい。\n\n▪️オリオン座デルタ星\n\n"
"""オリオン座δ星は、オリオン座の恒星で2等星。オリオン座の「三つ星」と呼ばれる恒星の中で最も西に位置する。
特徴.
ほぼ天の赤道上にあるので、ほぼ真東からのぼり、ほぼ真西に沈む。
5つ以上の星からなる多重連星系と考えられている。δ星Aは三重連星で、5.732日の周期で周回するAa1とAa2からなるAa星系の周囲をAbが346年以上の周期で周回している。A星は、Aa1とAa2が互いに掩蔽し合うことで変光するアルゴル型変光星に分類される。この他に、δ星BとB型主系列星のδ星Cが存在する。
位置天文衛星ヒッパルコスによる観測結果では、太陽系から約690光年(約212パーセク)の位置にあるとされるが、δ星系が属すると考えられているオリオン座OBアソシエーションの他の恒星は約1,240光年(約380パーセク)以上の距離にあると考えられており、正確な距離はわかっていない。また、2018年に公開されたガイア計画の第2期データでは、δ星Bは約1270光年、δ星Cは約940光年の距離にあるとされており、この数値が正しければC星は連星系を成していない可能性が高い。
以下の表は、太陽系からの距離を約1240光年とした場合のδA星系のパラメータである。
名称.
学名はδ Orionis (略称はδ Ori) 。固有名ミンタカ (Mintaka) の由来は、アラビア語で「ジャウザーの帯」という意味の「ミンタカ・アル=ジャウザー」 ( منطقة الجوزاء Minṭaqa al-Jawzā) (منطقة Minṭaqa 帯・ベルト)を語源としている。2016年7月20日、国際天文学連合の恒星の固有名に関するワーキンググループは、"Mintaka" をオリオン座δ星Aaの固有名として正式に承認した。
10世紀に活躍した天文学者アブドゥッラフマーン・スーフィーの『星座の書 (" Kitāb Ṣuwar al-Kawākib ") 』では、「ジャッバール (al-Jabbār 巨人) すなわちジャウザーの星座」 (kawākib al-Jawzā') は37の星から成り立っており、そのうち第26星、第27星、第28星がオリオン座の三ツ星に当たるとしている。この三ツ星に対して、「ジャウザーの帯」という意味のミンタカ・アル=ジャウザー ( منطقة الجوزاء Minṭaqa al-Jawzā' ) やニターク・アル=ジャウザー ( نط'}
"""
                "\n\n上記の文章について日本語での質問文と返答返答文のセットを作り、JSON形式で吐き出しなさい。ダブルクォーテーションは適切にエスケープしなさい\n")

exampleprompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} \n{example}".format(
bos_token=tokenizer.bos_token,
b_inst=B_INST,
system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}",
prompt=order,example=example,
e_inst=E_INST)

print(exampleprompt)

def gpt(utterance,theme):
    prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} \nconversation=['生徒':'{theme}について教えてください','先生':'「{theme}」とは、".format(
    bos_token=tokenizer.bos_token,
    b_inst=B_INST,
    system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}",
    prompt=utterance,
    e_inst=E_INST,theme=theme)
    prompt = prompt.replace("conversation=[","conversation=[{")
    prompt = exampleprompt+prompt
    #t = tokenizer.encode("USER:%s\nASSISTANT: \n```conversation=[{'生徒':'%sって何ですか?','先生':'"%(utterance,theme),return_tensors='pt').to('cuda')
    t = tokenizer.encode(prompt,return_tensors='pt').to('cuda')
    r=model.generate(t,max_length=8000,repetition_penalty=1.5,min_length=4096)
    return tokenizer.decode(r[0])

def gpt2(utterance):
    prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} \nconversation=[".format(
    bos_token=tokenizer.bos_token,
    b_inst=B_INST,
    system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}",
    prompt=utterance,
    e_inst=E_INST)
    #t = tokenizer.encode("USER:%s\nASSISTANT: \n```conversation=[{'生徒':'%sって何ですか?','先生':'"%(utterance,theme),return_tensors='pt').to('cuda')
    t = tokenizer.encode(prompt,return_tensors='pt').to('cuda')
    r=model.generate(t,max_length=8000,repetition_penalty=1.5,min_length=4096)
    return tokenizer.decode(r[0])


def generate_random_string(length):
    letters = string.ascii_letters
    result_str = ''.join(random.choice(letters) for i in range(length))
    return result_str

import time
import datasets
data=datasets.load_dataset("izumi-lab/wikipedia-ja-20230720",split="train").shuffle()
import json
cnt=0
import re

for row in data:
    if row["title"]==row["text"]:
        continue
    if len(row["text"])<500:
        continue
    res=gpt(f"{row['title']}について書かれた以下の文章を読んで先生と生徒で会話する会話文を作りなさい。\n\n▪️{row['title']}\n\n"
            f"{row['text'][:4096]}\n\n上記の文章について日本語での質問文と返答文のセットを作り、JSON形式で吐き出しなさい。ダブルクォーテーションは適切にエスケープしなさい\n",row['title'])

    #print(res)
    #conversation=[..]を見つける正規表現
    pattern = r'conversation=\[.*?\]'
    match = re.search(pattern, res[len(exampleprompt):])

    #print("search regex")

    if match:
        # If the pattern is found, print it
        print(match.group())

    cnt+=1
    if cnt>100000:
                break

ミソは、例示プロンプトをちゃんと丁寧に与えていることです。
これをちゃんとやらないと期待するマルチターン会話をしてくれませんでした。

FreeAIは、AI時代の新しいスタートアップ・インキュベーターを目指して投資事業やハッカソンなどを積極的に行なっていきます。

また、やる気と能力のある学生さん向けの支援などもしていきたいと思っています。

今年もよろしくお願いいたします。