Rinnaのマルチターン対応LLM Youriをベンチマークする
Rinnaからマルチターン対応のYouri-7b-chatが出ていたのでJapanese-MT-benchでベンチマークできるようにプログラムを書いてみた。
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 = "rinna/youri-7b-chat"
tokenizer = AutoTokenizer.from_pretrained(llm)
model = AutoModelForCausalLM.from_pretrained(llm, device_map="auto", torch_dtype=torch.float16)
model.to("cuda:0")
template="ユーザー: %s\nシステム: "
sep="\n"
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 = "設定: あなたは様々な質問に丁寧に答えるアシスタントです\n"
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+sep
#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")
generate_answer("data/japanese_mt_bench/question.jsonl")
これで、実際の出力はこんな感じになる。
悪くないように見えるのだがJapanese_MT_benchの結果はイマイチ。
はぐらかし系が多い印象かな。
サイズの割には各種質問の深堀に弱い模様。学習したデータの問題だろうか。
全体のベンチマークはここにあります