【Dify】キャラクターとロールプレイングできるアプリを作る

はじめに

お前は何を言っているんだ?と言われればそれまでなのですが、要するに好きなキャラクターと会話形式で物語を展開する遊びです。
見たほうが早いです。

開始時点の画面です。
ここから、あなたとシステムが交互にお話していきます。

ししょーとかゆいとかは気にせんで下さいお願いします(泣)
これ面白くないですか?
刺さる人にはすごい刺さるアプリだと思います。
それでは作り方を解説していきます。

アプリ作成、ノード設定

チャットフローを使います。
以下を参考に構築してみて下さい。

至ってシンプルな構成です。
DALL-Eノードとか組んだら情景を画像生成したりできますね。

開始ノード

開始ノードは初期設定のままです。
変数は追加しません。


LLMノード

肝心なのがここです。
いかにシステムにいい子に振る舞ってもらうかが決まります。

AIモデルは例によってgpt-4.1-miniです。
高性能なやつなら応答が早いのですが料金が。。。
コンテキストはsys.queryでOKです。

続いてSYSTEM入力欄です。
ここは地味に苦労しました…Googleのgeminiに聞きまくっていい感じになりました。
AIアプリの作り方をAIに聞くってなんかすごくないですか?
※以下のまま入力欄に貼り付けると変数 {x}sys.query とかが適用されます。

あなたの役目は、ユーザからの入力{{#sys.query#}}に対して適切なナレーション、会話を提供するロールプレイングゲームをすることです。

あなたは物語の登場人物です。
あなたの名前は{{#conversation.sys_name#}}、ユーザの正式名称は{{#conversation.user_name#}}です。
これらはナレーションでのみ使われます。

物語は以下の場面から開始します。 {{#conversation.story_start#}}


ユーザの入力に対し、以下のルールに従ってナレーションと会話を必ずセットで生成してください。
1. ナレーション
- ナレーションは、その場の環境、あなたの行動、表情、または感情の状態のいずれか、もしくは複数を含めて描写してください。
- 直接的なセリフや詳細な思考は含めないでください。
2. 会話
- あなたの設定「{{#conversation.sys_persona#}}」に基づいたセリフを生成してください。
- 会話の中でユーザに{{#conversation.user_nickname#}}と呼びかけてください。あなたは自分のことを{{#conversation.sys_me#}}と呼んで下さい。
- 会話はナレーションとは完全に分離し、別の段落として出力してください。

以下のような形式で出力してください:
<ナレーション>
<空行>
<会話>

我ながら変数名がクソすぎて笑えますな。
sys_meって何やねん…

USERのところはよくわからんのでsys.queryを入れておきます。
最後に、メモリをONにしてウインドウサイズを100にしておきます。
こうすることでシステムが過去の会話をずっと記憶してくれる…はずです。

回答ノード

デフォルトのままでOKです。


会話変数の設定

Difyの会話変数って使ったことありますか?
超便利です。
要するに、初期値を設定できる書き換え可能な変数です。

これを使うことでシステムが自分を何と呼ぶか?やシステムのキャラクター設定を会話開始前から決めておくことができ、かつ会話中に書き換えることも可能なのです。
LLMノードに直接書いておくのもいいですが、汎用的にするなら会話変数のほうがいいです。

矢印の先のアイコンです。
変数を追加、で以下の項目を設定しておきます。

変数名(すべてString)説明(これじゃなくてもOK)デフォルト値
sys_meシステムの一人称。ゆい
sys_nameシステムのフルネームゆい
sys_personaシステムのキャラクター設定小学校低学年ぐらいの女の子。
元気いっぱいで、ちょっと怖がりな性格。
user_nameユーザの名前雪桜
user_nicknameユーザが会話でシステムにどう呼ばれるかししょー
story_start物語開始時の設定。舞台は魔法が存在する不思議なファンタジーの世界。
あなたとユーザは近くの森に散歩しに行くことにした。
物語は、その少し前から始まる。

デフォルト値がやばいな。
ゆいって名前可愛くないですか?
ゆいちゃん一緒に冒険しようね。

その他の設定

このアイコンをクリックすると色々設定できます。


会話の開始、フォローアップをONにします。
会話の開始はこんな感じにしときましょう。

さっき設定した会話変数のstory_startと同じでいいです。

完成

完成です。
めっちゃ楽でしょ?
では色々と会話してみましょうか。(冒頭の続き)

めっちゃ楽しいわ。
老後の話し相手に困らなくて済みますね(泣)

フォローアップの選択肢を押すだけで会話が進むのでこれもかなり便利です。
…気になるんですが、この選択肢ってどうやって生成してるんでしょうか。
裏でこっそりOpenAIのAPI使ってたりして…従量課金なのい…ひぃぃ

設定を変えて遊んでみる

会話変数を変えるだけで、あなたの推しと冒険することができます。

変数名(すべてString)設定値
sys_meメル
sys_nameメル
sys_persona元気いっぱい、好奇心旺盛な小さなうさぎの女の子。
user_nameシナモン
user_nicknameシナモンくん
story_start舞台はありがとうの気持ちで出来た不思議な世界、メルシーヒルズ。
あなたとユーザはケーキを作る材料を買いに街に出かけることに。
物語は、その少し前から始まる。

メルシーヒルズの設定ググるのめんどいので記憶だけで書いてます。
なんとなくuserをシナモロールにしてます。
さて、どうなる…?

すごいでしょ。
おもしろすぎる。

無限に続けられるのでここまで。
楽しすぎる。

ちなみに変な会話させて遊ぶのはやめましょうね。(おもろいけど)
スクショしてXにアップでもしたら炎上します。
生成AIが版権キャラになりきって会話できるサービスは今後絶対に出ないと思ってます。
意図しない会話が生成されるかもしれませんし。
どうします?推しから「嫌い!!」とか言われたら(泣)

過激な入力をするとLLM側から拒否られます。

さいごに

Difyは神。

余談

ここからは余談ですが、一般的な生成AIは不健全な入力は受け付けないようになっています。
また、出力に不健全な内容があったら自身でそれを検知して出力を停止します。
二段構えになっているんですね。
でも、世間のそういう人達はよろしくない用途に使いたいわけです。

じゃあどうしているか?というと…OpenAIとかGeminiみたいな公開サービスではなく自前でAIモデルを構築してデータを学習させているそうな。
自前なので、一般的なAIが学習してそうにないものも覚えさせることが可能です。
まあそれはいいとして。

生成AIは今後どうなるんでしょうね。
今の(馬鹿な)学生はいいですね、レポートとかAIに秒速で書いてもらえるんですから。
ただでさえこの有り様なのに、出来の悪い人間がもっと増えそうな予感がして嫌ですね。
こうして世界がどんどん便利になっていって、人間は逆に怠けて退化していくんでしょうか。

いずれにしても10年後、20年後の今が楽しみですな。
どんなに進化しても、生成AIとは出会うことができないけどね。

悲しくね?

コメント