本モデルは
Miwa-Keita/zenz-v2.5-datasetに独自の前処理を施したデータを用いて学習しています。
モデルはPrivate Use Areaの特殊Unicodeトークンを使用するjinen形式でトレーニングされています。
この形式はzenzaiのかな漢字変換モデル「zenz」の第3世代(zenz-v3)フォーマットを参考にしています。
zenz-v3ではコンテキストを前置する \uEE02<context>\uEE00<input_katakana>\uEE01<output></s> 方式を推奨しており、jinen形式も同じトークン配置を採用しています。
AJIMEE-Bench による評価結果です。本モデルのトークナイザーは NFKC 正規化込みで動作するため、NFKC 適用条件下での Acc@1 が実運用上の値となります。
1from transformers import AutoTokenizer, AutoModelForCausalLM
2import torch
3
4model_name = "togatogah/jinen-v1-xsmall"
5tokenizer = AutoTokenizer.from_pretrained(model_name)
6model = AutoModelForCausalLM.from_pretrained(model_name, dtype=torch.bfloat16)
7model.eval()
8
9INPUT_START = "\uee00"
10OUTPUT_START = "\uee01"
11CONTEXT = "\uee02"
12
13# (コンテキスト, カタカナ入力) のペア
14prompts = [
15 # コンテキストなし
16 ("", "キョウハイイテンキデスネ"), # => 今日はいい天気ですね
17 ("", "ローカルエルエルエムデニホンゴヘンカン"), # => ローカルLLMで日本語変換
18 # コンテキストあり(同音異義語の区別)
19 ("歯が痛いので", "ハイシャ"), # => 歯医者
20 ("車が壊れたので", "ハイシャ"), # => 廃車
21 # 半角カタカナ(tokenizerのNFKC正規化により全角と同じ結果になる)
22 ("", "キョウハイイテンキデスネ"), # => 今日はいい天気ですね
23]
24
25for context, kana in prompts:
26 prompt = f"{CONTEXT}{context}{INPUT_START}{kana}{OUTPUT_START}"
27 inputs = tokenizer(prompt, return_tensors="pt")
28 with torch.no_grad():
29 outputs = model.generate(**inputs, max_new_tokens=128, do_sample=False, num_beams=1)
30 result = tokenizer.decode(outputs[0], skip_special_tokens=False)
31 converted = result.split(OUTPUT_START, 1)[-1].replace("</s>", "").strip()
32 print(f"{kana} => {converted}")