優れたエントリの書き方
プラットフォームのワールドはどれもエントリ(ロア)を使っていて、人気作の多くはビヘイビアをひとつも使わず、エントリだけで動いています。オープニング、ロア、4 つのロアブロックの基本は オープニングと設定 を見てください。
生きていると感じられるキャラクターを書く
プラットフォームでよくできたワールドは、何よりもキャラクターのエントリに手間をかけています。
性格はラベルではなく行動として書く
特徴を並べるだけでは足りません。その特徴が行動にどう出るかを書きます。
こうではなく:
Kasu は内気で、内向的で、受け入れられたいと切実に願っている。
こう書く(Poison in the Jar(壺中の毒 · 大逃杀) のカードにある、実際の Kasu のエントリ):
Kasu はひどく内向的で、そこにいることすらほとんど気づかれない。いちばん望んでいるのは、受け入れられること。学校での 3 年間、自分から誰かに話しかけたことはほとんどなかった。冷たいからではなく、怖いからだ。口を開けば拒まれ、笑われ、無視されるのではないかと怯えている。だから黙って、自分を背景にしてしまう。
洞窟のグループでは、Kasu はいちばん体を使う仕事を黙々とこなす。小川から水を汲み、寝床を整え、引き潮のときに貝を拾う。文句はひとつも言わない。「やることがある」ことだけが、自分は必要とされていると感じさせてくれるからだ。
AI は「内気」を一貫して演じることはできません。でも「水を汲み、文句を言わず、自分を背景にしてしまう」なら、ずっと演じ続けられます。
関係性のステージ
没入感の高いワールドは、プレイヤーとどれだけ親しいかによってキャラクターのふるまいを変えます。Sakura Season がそうで、3 人のヒロインそれぞれに、好感度 4 段階(0-25、26-50、51-75、76-100)ごとのふるまいが書かれています。
これは、ステージごとにエントリを 1 つずつ作り、変数がそのステージの範囲にあるあいだだけ送るようにすれば作れます。
- 初期(好感度 0-25):かしこまっていて、警戒していて、当たりさわりのない会話
- 信頼が芽生える(好感度 26-50):意見を話しはじめ、ときどき弱さを見せる
- 親しい(好感度 51-75):内輪のジョーク、気まずくない沈黙、助けを求める
- 深い絆(好感度 76+):弱さを全部見せる、ふたりだけの言葉づかい、守ろうとする
関係の変数が変わると、AI への指示も自動で切り替わります。
設定のしかた
キャンバスでは、これは 条件ロア で作ります。
- ステージごとにエントリを 1 つずつ書きます(「Rin — 初期」「Rin — 信頼が芽生える」など)。
rin_affinityの変数をエントリの上にドラッグします。線がつながり、エントリは 条件ロア のブロックに移ります。線をクリックして、条件を≥ 26のように設定します。- 範囲にしたいときは、同じ変数をもう一度同じエントリにドラッグして、2 つめの条件(
< 51)を設定します。条件が 2 つ以上あると、エントリの AI に渡すタイミング で、すべて満たす必要があるか、どれかひとつでいいかを選べます。ステージの範囲なら、すべてを選びます。
エンジンは毎ターン条件を確かめ、合っているステージの内容だけが AI に届きます。
もうひとつのやり方は、待機ロア とビヘイビアを組み合わせることです。ステージのエントリの 常に送信 をオフにし、キーワードも条件も付けずにおいて、好感度がしきい値を越えるたびに ロアエントリを有効化 / ロアエントリを無効化 を使うビヘイビアを追加します。手間は増えるので、変数の値以外のこと(ボタン、キーワード、一度きりの出来事)でエントリを開きたいときに向いています。ビヘイビアと自動化 を参照してください。
カードのデータでは、条件はエントリの conditions: [...] として保存されます。スキーマの全体 → World Spec:エントリ
キャラクターシートの型
うまくいっているワールドの多くに共通する型です。
- 何者か(1〜2 文):名前、役割、核になる特徴
- 見た目(2〜3 文):プレイヤーの目に映るもの。ありきたりの描写ではなく、具体的なところ
- ふるまいのパターン(ここがメイン):話し方、緊張・怒り・喜びのときにどうするか、くせ、矛盾
- プレイヤーとの関係:最初にプレイヤーをどう見ているか、何でその見方が変わるか
- 秘密:AI は知っているけれど、キャラクターは簡単には明かさないこと
ふるまいのパターンは、ほとんどのクリエイターが手をかけていないところです。
ロアブック:必要に応じたコンテキスト
キーワードロアを使えば、ワールドに 5 万語のロアを持たせながら、AI にはそのターンに関係のある数本だけを読ませられます。
いいキーワードリストを作る
エンジンは直近のいくつかのメッセージから、キーワードを探します。どれかひとつでも一致すれば、そのエントリが発動します(OR の条件)。プレイヤーがそれをどんな言い方で口にしそうか、思いつくだけ考えましょう。
酒場についてのエントリなら:
tavern、inn、bar、drink、bartender、pub
Sakurai Kimika というキャラクターのエントリなら:
Kimika、Sakurai、class rep、class representative
単語単位で一致:短いキーワードが関係ないところで発動してしまうときにオンにします。オフのままだと、「art」というキーワードが「start」「heart」「apart」にも一致してしまいます。
セカンダリキーワードで絞り込む
キーワードひとつだけでは、そのエントリが関係あるかどうか判断できないこともあります。セカンダリキーワード で、もう一段フィルターをかけられます。
| モード | 意味 | 使いどころの例 |
|---|---|---|
| AND_ANY | メインが一致し、さらにセカンダリのどれかひとつ | 「forest」+「elf」「danger」「ruins」のどれか |
| AND_ALL | メインが一致し、さらにセカンダリのすべて | 「forest」+「night」と「danger」の両方 |
| NOT_ANY | メインが一致し、セカンダリをどれも含まない | 「forest」で、「safe」も「peaceful」も含まない |
| NOT_ALL | メインが一致し、セカンダリがすべてそろってはいない | 「forest」で、「safe」と「day」が両方そろってはいない |
いちばんよく使うのは AND_ANY で、話題が重なったときに発動させる使い方です。「暗い森の言い伝え」のエントリは、木の話が出るたびではなく、プレイヤーが森と何か不穏なことを両方口にしたときだけ発動させたい、という場合です。
単語単位で一致、セカンダリキーワード、それに以下の設定は、エントリを開いて AI に渡すタイミング → 詳細設定 にあります。
深度注入:エントリが会話のどこに入るか
注入先 が 話題に出たときだけ のエントリは、毎回送るエントリと一緒にプロンプトの上のほうに入るわけではありません。会話履歴の決まった位置に差し込まれます。その位置を決めるのが 深度(末尾からのメッセージ数) の設定です。
depth: 4 なら、エントリは会話の末尾から 4 件目に入ります。上から降ってくるシステムの指示ではなく、最近の会話の一部のように自然に読まれます。
数字が小さい(末尾に近い)ほど、AI はよく注意を向けます。大きい(もっと前の)ほど、背景の情報のように扱われます。
技術的な補足:depth の動き
会話履歴がこうだとします。
[1] User: Hello
[2] AI: Hi there
[3] User: Where's the forest?
[4] AI: Head north
[5] User: Alright, let's godepth 2 のエントリは、メッセージ [4] の前に入ります。
[1] User: Hello
[2] AI: Hi there
[3] User: Where's the forest?
--- [Entry content inserted here] ---
[4] AI: Head north
[5] User: Alright, let's godepth 0 なら、エントリはいちばん最後に入ります(最後に置く のエントリに近い位置です)。
全体のリファレンス → World Spec:エントリ
状態駆動エントリ
キーワードを待たずに、ワールドの実際の状態に合わせて AI に渡したいエントリもあります。キャンバスでは、これが 条件ロア のブロックです。変数をエントリの上にドラッグし、線をクリックして条件を設定します。手順は上の 関係性のステージ で説明しています。
こうすると、エントリはプレイヤーがたまたまキーワードを打ったかどうかではなく、変数の実際の値 で切り替わります。
実例:仲間の態度
Wandering Diary は、この形で仲間のプレイヤーへの態度を変えています。仲間ひとりにつきエントリが 3 つあります。好感度が低いとき(用心深く、距離がある)、中くらいのとき(打ち解けはじめる)、高いとき(深い忠誠)。好感度の変数がしきい値を越えるたびに、合ったものが AI に渡ります。
プレイヤーからこのしくみは見えません。少しずつ心を開いていく仲間がいる、と感じるだけです。
条件とキーワードを両方使う
エントリにはキーワード と 条件の両方を付けられます。その場合は、キーワードが出て、しかも 条件が成り立っているときだけ送られます。
- キーワード:
Kimika、class rep - 条件:
day_count > 3 - 結果:NPC の過去は 3 日目以降、しかもプレイヤーが彼女の話をしたときだけ出てくる
情報が物語の早い段階で出すぎるのを防げます。
7 つの比較演算子
| 演算子 | キャンバスでの表示 | 意味 | 向いている使い方 |
|---|---|---|---|
eq | = | 等しい | 状態をぴったり確かめる(「location が cave と等しい」) |
neq | ≠ | 等しくない | 除外する(「チュートリアルの区域にいない」) |
gt | > | より大きい | しきい値(「好感度が 50 より上」) |
gte | ≥ | 以上 | しきい値(その値を含む) |
lt | < | より小さい | 低い状態で発動(「体力が 20 未満」) |
lte | ≤ | 以下 | 低い状態(その値を含む) |
contains | 含む | 文字を含む | 文字の一部で一致 |
条件が複数あるときは、すべて(どの条件も成り立つ)か いずれか(ひとつ成り立てばいい)で組み合わせます。
高度なテクニック
再帰:連鎖するコンテキスト
エントリ A が発動して、その内容にエントリ B のキーワードが含まれていたら、B も発動させるべきか。これが再帰です。デフォルトではオフですが(Context → 詳細設定 の 連鎖トリガーの深さ が 0)、ロア同士が絡み合っているワールドではオンにできます。
使うときは慎重に。 再帰の連鎖が深いと、コンテキストを大量に使うことがあります。ほとんどのワールドは 0 か 1 にしています。
エントリごとに、安全のための設定が 2 つあります。
- 再帰を防ぐ:このエントリ自体は発動するが、その内容からほかのエントリを探さない。「起こされはするけれど、誰も起こさない」。
- 再帰から除外:プレイヤーが実際に書いた言葉でしかこのエントリは発動しない。再帰のスキャンからはまったく見えない。
API ロールを変える
デフォルトでは、エントリはすべてシステムメッセージとして送られます。送信形式 を変えると、AI の受け取り方が変わります。
- 指示(system):デフォルト。AI は従うべきルールとして扱います。
- ユーザー:AI はプレイヤーがこう言ったと受け取ります。ユーザーのメッセージを重く見るモデルもあります。
- AI(assistant):AI は自分がこう言ったと受け取ります。返信のスタイルを「先に書いておく」のに使えます。
会話例
注入先 が 会話の例 のエントリは特別に扱われます。エンジンが user / assistant のメッセージの組に分けるので、AI はひとかたまりの文章ではなく、実際の会話のサンプルとして読みます。
書き方:
<START>
{{user}}: Can you heal this wound?
{{char}}: *examines the wound, frowning* This isn't a normal knife wound.
There's a curse residue. I need moonflower pollen... but it's daytime.
<START>
{{user}}: So what do we do?
{{char}}: *shrugs* Either wait for nightfall, or you endure it.
I recommend the latter — pain is the best teacher.<START> で会話例を区切ります。{{user}} と {{char}} はマクロで、実際のプレイヤー名とキャラクター名に置き換わります。
例は数より質です。 キャラクターの声をつかんだサンプルが 2〜3 個あれば、AI がそのまま硬くまねしてしまう 10 個より効きます。
正規表現のキーワード
キーワードには正規表現も使えます。/pattern/flags の形(例:/dark\s*forest/i)で書くと、エンジンはそのままの文字列ではなく正規表現として扱います。ふつうのキーワードでは拾いきれない、言い回しのゆれに対応したいときに便利です。
スキャン深度とトークン予算
エンジンは会話履歴の全部からキーワードを探すわけではありません。何件前のメッセージまで確かめるかは キーワードを遡る件数(デフォルト 2、最大 50)で決まります。キャンバスでは Context → 詳細設定 にあり、パネル → ロアブック の エントリ設定 にも同じ設定があります。大きくするほど多くの言及を拾えますが、処理の負担も増えます。
発動したエントリにはトークン予算もあります。ワールド設定の lorebookBudgetPercent(デフォルト 100%)と lorebookBudgetCap(デフォルト 0、つまり上限なし)です。エディターにはこれを変える場所がなく、カードのデータで設定します。発動したエントリが予算を超えると、位置 の順に残し(一致のスコアは同じ位置のときの並べ替えにだけ使います)、残りは外されます。
フォルダで整理する
エントリが数十、数百と増えてきたら、フォルダを使いましょう。パネル → ロアブック に フォルダを追加 があり、エントリをドラッグしてまとまりごとに分けられます(NPC はひとつのフォルダ、場所のロアは別のフォルダ、など)。フォルダは整理のためだけのもので、動き、一致の判定、注入の順番には影響しません。
位置の順番
各セクションの中で、エントリは 位置 の番号順に並びます(小さいほど先)。番号は パネル → ロアブック で設定します。小数も使えるので、位置 2 と 3 のあいだに入れたいときは 2.5 にします。
毎回送るエントリは、前のほうにあるものほどキャッシュが効きやすくなります。いちばん変わらない内容(キャラクターの描写、ワールドのルール)を小さい番号に、変わるかもしれない内容(状況に応じた指示)を大きい番号に置きましょう。
よくあるミス
いつまでも送られないエントリ。 常に送信 がオフで、キーワードも条件もないエントリは、自分からは送られません。それが 待機ロア で、ビヘイビアから開くつもりならそれで正解です。そのつもりがないなら、キーワードか条件を付けるか、常に送信にチェックを入れてください。
ステージの範囲が重なっている。 「Rin — 初期」を好感度 < 30 で、「Rin — 信頼が芽生える」を好感度 > 25 で送ると、26〜29 のあいだは両方が AI に届きます。重ならない範囲にしましょう。< 26 と、≥ 26 かつ < 51、のようにします。ステージのエントリをビヘイビアで有効・無効にする場合も同じです。
細かすぎて一致しないキーワード。 「Crystalline Sanctum」のエントリが crystalline sanctum でしか発動しないと、「crystal place」や「that temple」と打つプレイヤーには届きません。正式な名前だけでなく、プレイヤーが実際にどう呼ぶかを考えましょう。
大事な情報なのに深度が深すぎる。 depth 8 のエントリは会話履歴のずっと奥に埋もれて、AI はほとんど気にかけません。大事な情報は depth 2〜4 に置き、深い位置は雰囲気づけの情報に使いましょう。
関連項目
- ゲーム状態の設計 — エントリが反応する変数の選び方と組み立て方
- AI ディレクティブとマクロ — エントリの中で使う
{{macro}}の書き方とディレクティブの形式 - ビヘイビアと自動化 — ロアエントリを有効化 / ロアエントリを無効化 で、ビヘイビアからエントリを開け閉めする方法
スキーマの全体 → World Spec:エントリとセクション
