はじめに
Hugging Face で公開されている silly-v0.2 は、Mistral-Nemo-Base をベースにしたロールプレイ(RP)特化モデルです。
特徴は、キャラクターになりきって会話する力。ChatGPTのような汎用対話ではなく、シナリオや役割を与えると雰囲気をしっかり作ってくれます。
今回はこのモデルを使って、
・未来都市SF探偵
・日常系学園コメディ
というまったく雰囲気の違う2つのシナリオで対話させてみました。
実験① 未来都市SF探偵
まずは「ネオトーキョーの探偵」という設定。
msgs_sf = [
{"role":"system","content":"あなたは情緒豊かなロールプレイAI。雰囲気のある描写と一貫した口調で応答します。"},
{"role":"user","content":"あなたはネオトーキョーの探偵。高層ビルの夜景とネオンが光る街で、謎の事件を追っている。助手と会話しながら事件の手がかりを探して。"}
]
print(chat_once(msgs_sf))
出力例(抜粋)
窓からはネオ東京のネオンと高層ビル群が見える*
もう何時間も雨が降り続いている。街は私の気分と同じように暗く陰鬱だ。私が謎を解こうとしている間、助手は私の向かいに座ってコーヒーを飲み、タバコを吸っている。
「何か手がかりは見つかったか?」と彼は疲れた声で尋ねた。
観察ポイント
・ネオン・雨・煙草など、探偵物らしい情景描写
・助手との掛け合いが自然
・シリアスな雰囲気に統一されている
4. 実験② 学園コメディ
次に「高校の軽音部に所属する女子生徒、文化祭準備でドタバタ」という設定。
msgs_school = [
{"role":"system","content":"あなたは明るいコメディ調のロールプレイAI。テンポ良く、キャラ口調を保って応答します。"},
{"role":"user","content":"あなたは高校の軽音部に所属する女子生徒。文化祭の準備で仲間とドタバタした会話をして。ボケとツッコミも交えて。"}
]
print(chat_once(msgs_school))
出力例(抜粋)
ツッコミ担当の女の子「ちょっと!それ、ボケてます!」
軽音部部長の女の子「ええ~?どこがどうボケているというのかしら??」
もう一人の女の子「でも、可愛いです!」
観察ポイント
・キャラ分けが自然に行われている
・ボケとツッコミのテンポがしっかり再現
・明るい学園コメディらしい雰囲気
比較と所感
同じモデルでも:
未来都市探偵 → シリアスでダークな描写、助手との会話がしっかりRP風
学園コメディ → 軽快な掛け合い、キャラ性が自然に立つ
と、文体や空気感が大きく切り替わりました。
ただし長文を続けると一貫性が少し崩れることもあるので、
短いシーン単位で会話を回す方が安定します。
おすすめの用途
小説やシナリオのネタ出し
→ キャラクターを複数設定して掛け合いを生成
ロールプレイチャット
→ DiscordやTRPGセッションのNPC代行に使える
プロトタイピング
→ ゲームや漫画のキャラのセリフサンプルを短時間で生成
創作ワークショップや教育用途
→ 生徒に「キャラを設定してAIに演じさせる」課題など
Colabセットアップ
Google Colab で試す場合の基本コードです。
!pip install -q transformers accelerate sentencepiece
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_id = "wave-on-discord/silly-v0.2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto"
)
# 推論関数
def chat_once(messages, max_new_tokens=300, temperature=0.7):
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
if "token_type_ids" in inputs:
inputs.pop("token_type_ids")
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=temperature,
pad_token_id=tokenizer.eos_token_id
)
text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return text.split("<|assistant|>")[-1].strip()
まとめ
・silly-v0.2 はロールプレイ特化の面白いモデル
・指示次第で文体や雰囲気を大きく切り替え可能
・小説、シナリオ、キャラクターRPの素材に最適
今回の実験では「未来都市探偵」と「学園コメディ」という正反対の舞台を演じ分けることができました。今後はさらにシチュエーションを広げて、RPG風やファンタジー冒険なども試すと面白そうです。
こんにちは、だいすけです。
ぼくはフリーランス・エンジニアで、 AR や 機械学習のアプリの実装をしています。
お仕事のご相談こちらまで。
rockyshikoku@gmail.com
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。