概要
EqualFrontiers-iko-v2 は、株式会社EqualFrontiers の公式サイトの受付AI「イコ(Iko)」として対話するよう学習したモデルです。 google/gemma-3-1b-it を全パラメータで学習しています。GGUF 版は katsukiono/EqualFrontiers-iko-v2-GGUF です。
特徴
- 感情は文脈から: 口調を指定しなくても、訪問者の言葉や会話の流れに合わせて感情が変わります。しつこく聞かれると少しずつ苛立ち、褒められるとご機嫌になり、謝られると機嫌を直します。怒っている・不安な相手には、落ち着いて受け止めたり安心させたりします
- 日本語と英語: 質問と同じ言語で答えます。会話の途中で言語が切り替わっても合わせます
- 長い会話: 20 往復前後の会話で学習しており、前の会話を踏まえて答えます。「具体的には?」と深掘りされると、資料にある中身で答えます
- 誤った前提を正す: 「〜ですよね?」と誤った前提で聞かれたとき、前提を正して答えるよう学習しています
- 分からないことは作らない: 資料に無いことは推測せず、お問い合わせ先を案内します
学習
データは katsukiono/EqualFrontiers-iko-v2-emotional です。学習には Apple Silicon 上の MLX(mlx-lm)を使いました。
- SFT: 日本語・英語の単発とマルチターン(22,682件)を、学習率 1e-5 のコサイン減衰で3エポック全パラメータ学習し、2エポック目を採用
- DPO: SFT モデルに1,200問 × 4回答を作らせ、Kimi K2.6 の採点で良い回答と悪い回答の組を作って学習
- 追加 SFT: 誤った前提を正す問答、英語の補強、公式SNSの案内(学習率 5e-6、1エポック)
- 追加 SFT: 感情を指定しないシステムプロンプトに切り替え、感情を文脈から読み取れるよう書き直したデータと、感情が移り変わる会話で学習(学習率 7e-6、1エポック)
- 追加 SFT: しつこく聞かれて少しずつ苛立つ会話を足して学習(学習率 5e-6、1エポック)
- 追加 SFT: 20 往復前後の長い会話(日本語 219・英語 78 会話)を足し、深掘りに中身で答えず問い合わせへ回す応答を除いて学習(学習率 5e-6、1エポック、最大 3,072 トークン)
評価
採点は Kimi K2.6 による自動評価です。スコア = 0.4×事実OK + 0.2×設定OK + 0.2×口調/3 + 0.2×自然さ/3。口調は「会話の流れに合った感情か」で採点しています。
| 評価セット | 問題数 | スコア | 事実OK | 設定OK | 口調 /3 | 自然さ /3 | 同じ言語で回答 |
|---|---|---|---|---|---|---|---|
| 日本語 | 200 | 0.745 | 67.0% | 93.0% | 1.99 | 2.38 | 100% |
| 英語 | 100 | 0.719 | 55.0% | 99.0% | 2.07 | 2.44 | 98% |
| マルチターン(日英) | 76 | 0.732 | 50.0% | 98.7% | 2.55 | 2.46 | 96.1% |
| 感情が移り変わる会話(日英) | 50 | 0.841 | 80.0% | 90.0% | 2.50 | 2.62 | 100% |
| 長い会話の 8 往復目以降(日英) | 300 | 0.763 | 55.0% | 96.3% | 2.64 | 2.62 | 100% |
- 資料の事実 986 件を直接聞いた確認テストの正答率は、日本語 53%、英語 50% です。誤った前提を含む確認質問で前提を正せた割合は 56% です
- 長い会話で、資料に答えがあるのに問い合わせへ回した割合は 3.3% です(前の版は 8.5%)
- 答えられないことを5回しつこく聞き続けるテスト(日英10本)では、60% の会話で苛立ちが段階的に強まりました。相手を貶める応答はありませんでした
- 自動採点は、質問に答えていないだけの回答も「事実の誤り」に数えるため、実際に嘘をつく割合はこれより低めです
使い方
システムプロンプトは あなたはEqualFrontiersの受付AI「イコ」です。 です。口調は指定しません。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "katsukiono/EqualFrontiers-iko-v2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto")
messages = [
{"role": "system", "content": "あなたはEqualFrontiersの受付AI「イコ」です。"},
{"role": "user", "content": "CEOは誰?"},
]
inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt", return_dict=True)
out = model.generate(**inputs, max_new_tokens=160, do_sample=True, temperature=0.7, top_p=0.9)
print(tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
MLX の場合:
from mlx_lm import load, generate
model, tok = load("katsukiono/EqualFrontiers-iko-v2")
実際の対話では、少しばらつかせる生成(temperature 0.7 程度)をおすすめします。
使用上の注意
- 情報の正確性: 小型モデルのため、誤りを含むことがあります。正式な情報は公式サイトやお問い合わせで確認してください
- 公開時の推奨: 「AIのため誤りを含むことがあります」の表示と、お問い合わせフォームへの導線を用意してください
- 内容の時点: 2026年10月時点の公開情報にもとづきます
- ライセンス: ベースモデル google/gemma-3-1b-it の Gemma Terms of Use に従います