--- language: - ja library_name: transformers pipeline_tag: text-generation base_model: google/gemma-3-270m-it tags: - gemma3 - japanese - ime - predictive-text - gguf - llama.cpp - mobile --- # gemma3-270m-pred-dpo 日本語IME(キーボードの予測変換)用途に最適化した **Gemma 3 270M** の軽量モデルです。 入力テキスト中の境界 **`[---]`** の“後ろ”に続く言葉を予測変換として生成します。 - ベースモデル: `google/gemma-3-270m-it` - 学習: SFT → DPO(選好最適化) - 配布: Transformers形式(HF) + GGUF(f16 / Q4_K_M) --- ## iOS 実測(参考) > 実行環境・スレッド数・量子化設定で変動します。 - 12 ms/token - 82.94 tokens/sec - 34 ms TTFT --- ## 配布ファイル ### Transformers (Hugging Face) - リポジトリ直下に `model.safetensors` など(Transformers形式) ### GGUF(`gguf/` 配下) - `gguf/gemma3-270m-pred-dpo-f16.gguf` - `gguf/gemma3-270m-pred-dpo-q4_k_m.gguf` --- ## 入力フォーマット(重要) 固定プロンプトは以下です。 ```text キーボードの予測変換として[---]に続く言葉を予測変換してください。[---]より前はこれまでのユーザー入力です。 ユーザー入力と予測変換の間には境界 [---]を入れてください。 ーーーー以下が予測変換対象ーーーー ``` - `ーーーー以下が予測変換対象ーーーー` の後ろに、**ユーザー入力 + 境界 `[---]` + 未確定の先頭**(途中まで入力した語)を続けてください。 - 出力は **`[---]` を含む1行**を想定(運用では **1行目だけ採用**が簡単で安定します)。 ### 例 入力(ユーザー): ```text キーボードの予測変換として[---]に続く言葉を予測変換してください。[---]より前はこれまでのユーザー入力です。 ユーザー入力と予測変換の間には境界 [---]を入れてください。 ーーーー以下が予測変換対象ーーーー これに関してはどんな[---]もて ``` 出力(モデル): ```text これに関してはどんな[---]問題/でしょ/う/か/? ``` - `"[---]"` より後ろを `/` で split すると、候補列として扱えます。 - IME組み込みでは、`[---]` 以降だけ取り出してUIに反映するのが簡単です。 --- ## 使い方(Transformers) ```python import torch from transformers import AutoTokenizer, AutoModelForCausalLM model_id = "katsukiono/gemma3-270m-pred-dpo" tok = AutoTokenizer.from_pretrained(model_id, use_fast=True) if tok.pad_token is None: tok.pad_token = tok.eos_token model = AutoModelForCausalLM.from_pretrained( model_id, torch_dtype="auto", device_map="auto", ).eval() prompt = """キーボードの予測変換として[---]に続く言葉を予測変換してください。[---]より前はこれまでのユーザー入力です。 ユーザー入力と予測変換の間には境界 [---]を入れてください。 ーーーー以下が予測変換対象ーーーー これに関してはどんな[---]もて """ chat = [{"role": "user", "content": prompt}] text = tok.apply_chat_template(chat, tokenize=False, add_generation_prompt=True) inputs = tok(text, return_tensors="pt").to(model.device) with torch.inference_mode(): out = model.generate( **inputs, do_sample=False, max_new_tokens=96, ) gen = tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True) print(gen.splitlines()[0].strip()) ``` --- ## 使い方(GGUF / llama.cpp) ```bash ./llama-cli \ -m gguf/gemma3-270m-pred-dpo-q4_k_m.gguf \ -p "(上の固定プロンプト + 入力)" \ -n 96 \ --temp 0 ``` --- ## 推奨後処理(運用メモ) - 生成が複数行になる場合があるため、まずは **1行目のみ採用**が簡単です。 - `"[---]"` が欠落する出力が稀にあり得るため、プロダクションでは **`[---]` の有無チェック**を推奨します。 - 候補列の取得例: - 出力を `split("[---]", 1)` → 後半を `split("/")`(空要素は除外)で候補化 --- ## ライセンス / 利用条件 本モデルは `google/gemma-3-270m-it` をベースにしています。 利用にあたっては、ベースモデル側の利用条件(Gemmaの利用規約/ライセンス)を確認のうえ利用してください。