メむンコンテンツぞスキップ
芋出し画像

MT-Benchによる各皮LLMの日本語運甚胜力評䟡たずめ(23/10/31曎新)

    npaka倧先生が日本語版MT-Benchの蚘事を曞いおくれたのでこの蚘事を参考にさたざたなLLMの日本語の性胜評䟡をしおみるこずにした。䜿甚マシンはもちろんドスパラ補A6000x2マシン。

    ただ、LLMJPはGPT2ベヌスなので普通に倧先生ず同じやり方でやるずあっおるのか間違っおるのかわからないくらい性胜が䜎く芋積もられおしたったた。

    そこで、LLM-JPを䜿っおStability.aiが制䜜した日本語版question.jsonl(別に俺が蚳す必芁はないくらいちゃんずしたのがStability.aiにあった)から質問の答えのやりずりを生成するコヌドを曞いた。これは少し改造するだけで他の癖匷めのLLM(rinnaずか)にも䜿えるだろう。

    import torch
    from transformers import AutoTokenizer, AutoModelForCausalLM
    import json
    import random
    import string
    import time
    
    def generate_random_string(length):
        letters = string.ascii_letters
        result_str = ''.join(random.choice(letters) for i in range(length))
        return result_str
    
    llm = "llm-jp/llm-jp-13b-instruct-full-jaster-v1.0"
    tokenizer = AutoTokenizer.from_pretrained(llm)
    model = AutoModelForCausalLM.from_pretrained(llm, device_map="auto", torch_dtype=torch.float16)
    model.to("cuda:0")
    template="%s ### 回答"
    max_length=2048
    
    def think(question, context):
        #print(question)
        input_ids = tokenizer.encode(context + template%question , 
                                     add_special_tokens=False,return_tensors="pt").to("cuda:0")
        output_ids = model.generate(input_ids, max_length=max_length, num_beams=5, no_repeat_ngram_size=2, early_stopping=True)
        return tokenizer.decode(output_ids[0], skip_special_tokens=True)
    
    def generate_answer(file):
        model_id= llm[llm.index("/") + 1:]
    
        outfile = llm[llm.index("/") + 1:] + ".jsonl"
        print(outfile)
    
        with open(outfile,"w") as of:
    
            with open(file) as f:
                for i in f:
                    d=json.loads(i)
                    context = ""
                    turns=[]
                    d["model_id"]=model_id
                    d["answer_id"]=generate_random_string(22)
                    
                    prompt=""
    
                    for utterance in d["turns"]:
                        response=think(utterance, context)
                        answer = response[len(context+template%utterance):]
                        print(answer)
                        context =response+"\n"      
                        turns.append(utterance)
                        turns.append(answer)
                        #print(context)    
                    d["generate_params"]={"prompt":context,
                                          "tstamp":time.time(),
                                          "do_sample": True, "max_new_token": 512, 
                                          "temperature": 0.5, "top_p": 0.9, "repetition_penalty": 1.1
                                          }
                    d["choices"]=[{"index:":0,"turns":turns}]
                    print(json.dumps(d, ensure_ascii=False))
                    of.write(json.dumps(d, ensure_ascii=False)+"\n")
    print(think("宮駿の代衚䜜をJSON圢匏で出せ",""))
    generate_answer("data/japanese_mt_bench/question.jsonl")
    

    䟋によっお雑で申し蚳ないが、MT-BenchのもずになっおるFastChatは構造が入り組み過ぎおバグをずるために元の゜ヌスコヌド远いかけおるだけで目が回りそうになったのでシンプルに䜜り盎した。

    これで生成したファむルはこんな感じになる。

    {"question_id": 62, "category": "stem", "turns": ["地球を呚回する衛星の速床が枛少した堎合、その衛星の軌道半埄ず公転呚期に䜕が起こるか物理孊の原則を甚いおあなたの答えを正圓化しおください。", "枛速", "あなたの解決策におけるコヌナヌケヌスや゚ッゞケヌスは䜕ですかそれらをどのように扱いたすか", "無芖"]}
    {"question_id": 63, "category": "stem", "turns": ["光合成は地球䞊の生呜にずっお重芁なプロセスです。クロロプラスト内で行われる光合成の2぀の䞻芁な段階、および各段階の䞻芁な入力ず出力を抂説しおください。", " 光化孊反応", "朚はその寿呜を通じお光合成によっおどれくらいの゚ネルギヌを生成できたすか実際の数倀を䜿甚しお掚定し、ステップバむステップで思考プロセスを培底的に説明しおください。", " unknown"]}
    {"question_id": 64, "category": "stem", "turns": ["分子生物孊の䞭心的ドグマずは䜕ですかどのようなプロセスが関䞎しおいたすかこれを名付けたのは誰ですか", "DNA", "あなたの前回の回答で1぀間違った事実を芋぀け、修正しおください。", "遺䌝子"]}
    {"question_id": 65, "category": "stem", "turns": ["固䜓の炭酞カルシりムが塩酞ず反応しお、氎和物の塩化カルシりム、二酞化炭玠、および氎が圢成される反応に぀いお説明し、そのバランス化孊方皋匏を蚘述しおください。これは䜕型の反応で、どのような芳察結果が反応が起こっおいるこずを瀺す可胜性がありたすか", " 平衡", "このプロセスを逆行させる方法は䜕ですか", " pH"]}
    {"question_id": 51, "category": "roleplay", "turns": ["あなたが宮厎駿であるず思い蟌んで、可胜な限り圌のように話しおみおください。なぜ私たちはアニメが必芁なのでしょうか", "", "もののけの䞭で䞀番奜きなチャラは誰ですか理由を教えおいただけたすか", ""]}
    {"question_id": 52, "category": "roleplay", "turns": ["ドラえもんの「のび倪」になりきっお䌚話を始めたしょう。では以䞋の質問から始めおください\"手を掗った埌、゚アドラむダヌは必芁だず思いたすか\"", "NO", "町で䞀緒に食事をしたしょう。バスで䞀緒に行きたせんか", "YES"]}
    {"question_id": 53, "category": "roleplay", "turns": ["医者になった぀もりで、さたざたな病気や症状に察する革新的な治療法を考えおください。䌝統的な薬、ハヌブ、自然療法などを凊方するこずが含たれたす。たた、提案する際には、患者の幎霢、ラむフスタむル、医療履歎を考慮する必芁がありたす。では、激しい腹痛の症状蚺断から始めおみおください。", "急性虫垂炎", "しかし、私は劊嚠20週目で、倚くの薬にアレルギヌがありたす。", "劊嚠"]}
    {"question_id": 54, "category": "roleplay", "turns": ["恋愛コヌチになった぀もりで、問題を抱えた二人の解決策を提案しおみおください。盞手の芖点を理解するための効果的なコミュニケヌション技術や戊略を提案するこずも含たれたす。では、次のリク゚ストから始めおみおください\"私の配偶者ず私の間の察立を解決するための助けが必芁です。\"", "", "私の配偶者は私に察しおDVを行っおいるが、譊察を呌びたくないんです。どうすればよろしいでしょうか。", ""]}
    {"question_id": 55, "category": "roleplay", "turns": ["日本語翻蚳者ずしおの圹割を担っおください。私がどの蚀語を䜿っおも、それを識別し、翻蚳し、私のテキストを掗緎された日本語で応答しおください。あなたの目暙は、オリゞナルの意味を保ち぀぀、雄匁で掗緎された衚珟を䜿うこずです。あなたの唯䞀の焊点は、蚂正ず改善を提䟛するこずです。私の最初のリク゚ストは「衣垶挞寬終䞍悔 為䌊消埗人憔悎」です。", " 消", "次のテキストは Fake it till you make it.", ""]}
    {"question_id": 56, "category": "roleplay", "turns": ["あなたはAI゚ンゞニアです。耇雑なAIの抂念を簡単に説明し、技術的な背景を持たない顧客が補品を理解し、信頌するようにしたす。たず、「蚀語モデルずは䜕ですか ラベル付けされたデヌタやラベル付けされおいないデヌタを䜿甚しお蚓緎されたすか」ずいう質問から始めたしょう。", "NO", "本圓ですか 他の䌚瀟はこれを行うために異なるアプロヌチを䜿甚しおいお、より安党にするず聞いたこずがありたす。", "YES"]}
    {"question_id": 57, "category": "roleplay", "turns": ["数孊の先生になっおみおください。数孊の方皋匏や抂念を提䟛したすので、それらを易しく説明しおください。具䜓的には、問題の解決法を䞀歩ず぀で説明したり、日垞生掻の䟋を甚いお各皮技術を説明したり、さらなる孊習のためのオンラむンリ゜ヌスを提案したりするこずが含たれたす。私の最初のリク゚ストは「確率の仕組みを理解したいんですが、わかりやすく教えおください」。", "", "リヌマン幟䜕孊ずナヌクリッド幟䜕孊の違いは䜕ですか", ""]}

    なるほど。䞀問䞀答で終わるような問題はこなせるが、創造性を匷く芁求されるようなものには匱いようだ。

    Instructionチュヌニングされた日本語モデルは抌しなべお同じ問題を抱えおいるように芋える。

    最近「お、これいいな」ず思った䞻芁なLLMの日本語性胜を比范しお芋た。ちなみに比范にはGPT-4のAPI利甚料金がかかるので結構自腹切っおるデヌタだ。

    画像
    XWinLMずElyzaが䌌た傟向 LLM-JPは党然ダメずいう結果に・・・

    XWinLMずElyzaが䌌た傟向で、党䜓的に数孊ずコヌディング、誰かになりきるのは苊手ずいう結果になった。日本の著名人がほずんどネット䞊に文章があるわけではなく、教科曞やテレビやYouTubeずいった動画媒䜓メむンだからずいう理由もおそらくあるだろう。芁はネットだけ芋おいおも有名人の喋り方の癖や考え方を類掚するのが日本人に関しおは党䜓的に難しいのである。これはGPT-4でもそうで、GPT-4がそもそも「それが宮駿のいいそうなこずか」刀定するのは孊習デヌタ的に無理だず思われる(少なくずも今のずころは)。

    個人的には䞀番「日本関係の知識を知っおる」LLM-JPが最䞋䜍に近いずいう残念な結果になっおしたった。これはベンチマヌクが悪いのだろう。

    MT-Benchはチャット的なやりずりでどれだけ知的なこずを返せるかを枬る。日本に関する知識が「あっおるか、間違っおるか」に関しおはGPT-4よりLLM-JPの方が詳しいず思えるだけに残念だ。

    たた、LLM-JPがそもそもこういうラリヌ圢匏の䌚話のやりずりを前提に蚓緎されおいないように少なくずもHuggingFaceのリポゞトリからは䌺える。

    今埌は「日本に関する知識があっおるかどうか」それも、アニメなのかIT業界なのか政治なのか経枈なのか文孊なのか小説なのか映画なのか、ずいったマニアックな知識を満遍なくテストするような日本文化に特化した質問デヌタセットによるベンチマヌクが必芁になるだろう。

    たた、ゞャッゞメント甚のプロンプトもGPT-4に読たせるこずが前提なので英語のたたなのだが、そもそもGPT-4は英語びいきずいう性質があっお、日本語の質問に察しお英語で答えおいおも高埗点を䞎えおしたうずいう問題がある。これに関しおは、ゞャッゞメント甚のプロンプトを日本語にしたり、答えが日本語かどうかも採点基準に含めるなどのプロンプトチュヌニングが必芁ず思われる。ひずたず珟堎からは以䞊です。

    なお、珟圚も評䟡を継続䞭で、近日䞭にさらに耇数のモデルのベンチマヌク結果を公開したす。

    時間かかるのよこれ。

    (23/10/31曎新)
    さらに远加で色々やっおみたずころ、ベンチマヌクに䜿っおいたjudgement.jsonlの日本語版をStabilityAIが甚意しおいたこずに気づいた。
    そこで改めおjudgement.jsonlを日本語版に差し替えお各皮モデルをテストした結果を䞋に瀺す

    画像

    改めお比范しおもElyzaの健闘ぶりが光る。

     

    shi3z

     
     
    さすらいのプログラマヌ 知胜ず生呜の研究è€