3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

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を使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?