Decisionモデル

Decisionモデルとは、「Does the latest message move the scene to a new place?」のような、はい・いいえで答える質問にMarinaraのために回答する小さなモデルです。ロアブック、カスタムエージェント、プロンプト、グループチャットがこれを使います。これは任意の機能です。設定しなくてもチャットは動作し、各機能はMarinaraでの用途で説明するフォールバックを使います。

回答はMarinaraの動作を制御するもので、チャットに投稿されることはありません。Decisionモデルは判定文を0から1の数値で採点します。Marinaraはその数値をしきい値と比較し、結果をはい、またはいいえとして扱います。「angry」、「sad」、「none of these」のような短いリストから答えを1つ選ぶこともできます。

迷ったら、None(なし)のままにしておくのがおすすめです。判定を使いたい場合は、すでに持っているかもしれない内蔵モデルか、すでに動かしているサーバー上のチャットモデルを使ってください。どちらも追加の費用はかかりません。

Decisionモデルを選ぶ

始める前に、選択の目安を参照してください。

  1. 上部バーのConnections(接続)をクリックし、Jobs(役割)ボックスを開きます。
  2. Behind the scenes(裏方の処理)の下にあるDecisionの行をクリックします。リストが開きます。
  3. モデルを選びます。リストは3つのグループに分かれています。
  1. テストするには、行にあるDecision settings(判定の設定)の歯車をクリックし、Test(テスト)をクリックします。このボタンは内蔵モデルの項目に表示されます。TypeSafeまたはOpenRouterのアカウントでは、そのモデルのEdit model(モデルの編集)を開き、Test provider(プロバイダーをテスト)をクリックします。Own decision server(自分の判定サーバー)のアカウントでは、アカウントの⋯メニューにあるTestを使います。

テストに成功すると、「はい」の確率と、回答にかかった時間が表示されます。自分のコンピューター上のモデルでは、対数確率が利用できたかと、モデルが直接回答するかも表示されます。対数確率とは、モデルが書く可能性のある各単語について、モデルがどれだけ確信しているかを表す数値です。テストでは固定のサンプルを送り、自分のチャットは送りません。

うまくいかなかった場合は、メッセージに理由が表示されます。よくある原因は、キーが拒否された、サービスがリクエストを制限している、内蔵モデルが動いていない、回答が制限時間を超えた、のいずれかです。トラブルシューティングを参照してください。

今は回答できない項目も、理由とともにグレー表示でリストに残ります。Noneを選ぶと、起動質問や判定文を削除せずに判定をオフにできます。

選択の目安

すでにローカルモデルを動かしているなら、まずそれを試し、自分のチャットのターンでテストしてください。判定文の表現は結果を大きく左右します。判定文の書き方を参照してください。

JevとOpen-Jevは別のモデルです。JevはTypeSafeのホスト型モデルで、直接またはOpenRouter経由で利用できます。Open-JevはQwenを基盤に別途公開されたモデルで、Marinaraでローカル実行できます。Open-Jevのテストは、ホスト型のJevを測定したものではありません。

Android(Termux)ではBuilt-in decision modelは動作せず、スマートフォンのプロセッサーで動く小型のローカルモデルでは遅すぎることがあります。OpenRouter経由のJevなど、ホスト型のアカウントが実用的です。Decision接続の設定を参照してください。

プリセット、カード、エージェントは「Decisionモデル」を前提に書き、「Jev必須」とはしないでください。どのモデルでも同じ判定文の構文を使いますが、モデルによって回答が異なることがあります。判定を使うコンテンツをインポートすると、カスタムエージェントやAgent Organizerからのインストールも含め、Marinaraはこのガイドへのリンク付きの通知を表示します。プロファイル全体のZIPを復元した場合は表示されません。

内蔵モデルを使う

内蔵モデルをダウンロード済みなら、アカウントも費用もなしで判定に使えます。内蔵モデルのセットアップを参照してください。

  1. Jobs(役割)ボックスのBehind the scenes(裏方の処理)の下にあるDecisionの行をクリックします。
  2. Built-in model(内蔵モデル)を選びます(補助用のモデルがある場合はBuilt-in model (utility)(補助用の内蔵モデル)でもかまいません)。
  3. Decision settings(判定の設定)の歯車をクリックし、Test(テスト)をクリックします。

Marinaraはモデルにはい・いいえの質問を1つ送り、1トークンだけ書かせて、そのトークンの確率から回答を読み取ります。返信は書かれないため、リクエストは短く済みます。複数の回答から選ぶ場合は、回答ごとに1つのはい・いいえの質問として問い合わせます。

Thinking(推論)の設定は、モデルが1語で答えられないときの動作を決めます。常に先に推論するモデルもあります。

Thinking動作
Auto (try one word, allow thinking if the model cannot)(自動: まず1語を試し、答えられなければ推論を許可)デフォルトです。1語での回答に2回続けて失敗すると、モデルが先に推論できるようになり、Marinaraがそれを知らせます。
Off (always answer in one word)(オフ: 常に1語で答える)1語で答えられないモデルは、回答なしになります。
Allowed (let the model think first)(許可: モデルに先に推論させる)モデルに推論を省略するよう求めることはありません。

先に推論するモデルは数秒かかるため、デフォルトでは、後処理エージェントなど、返信が画面に表示された後に行う確認にだけ回答します。返信前に動くエージェントの判定にも使うには、Also gate agents that run before the reply(返信前に実行するエージェントも判定)をオンにします。その場合、すべての返信がこのモデルの回答を待ちます。

汎用チャットモデルのはい・いいえの確率もしきい値に使えますが、判定専用モデルのように校正する訓練は受けていません。対数確率を返さないランタイムは、単純な1か0で回答します。しきい値は自分のチャットで調整してください。

稼働中のサーバーでの利用

チャットモデルをOllama、LM Studio、llama.cpp、またはほかのOpenAI互換サーバーで動かしているなら、Marinaraが2つ目のコピーを読み込まなくても、そのモデルが判定に回答できます。

  1. Connections(接続)パネルでそのモデルの⋯をクリックし、Use this model for decisions(このモデルを判断に使う)を選びます。Add account(アカウントの追加)ウィンドウが判定のステップで開き、同じアドレス、モデル、キーが入っています。
  2. モデルを選び、Test decision(判定をテスト)をクリックします。テストに成功すると、サーバーが対数確率を返したかと、モデルが先に推論する必要があったかが表示されます。Done(完了)をクリックします。
  3. Behind the scenes(裏方の処理)の下にあるDecisionの行をクリックし、新しいモデルを選びます。

自分で作成することもできます。ソースをOpenAI-compatible chat model (Ollama, LM Studio, llama.cpp)(OpenAI互換チャットモデル)にしたDecisionアカウントを使い、チャット用のアカウントと同じアドレス(Ollamaなら例えばhttp://localhost:11434/v1)と、サーバーが使うモデル名を指定します。

問い合わせ方は内蔵モデルと同じで、判定文ごとにはい・いいえの1語を求めます。サーバーが同時にいくつのリクエストを処理できるかMarinaraには分からないため、判定文は1つずつ送ります。アカウントのThinking(推論)は常にAutoです。別のコンピューター上のサーバーにはPROVIDER_LOCAL_URLS_ENABLEDが必要です。ローカルモデルやセルフホストモデルへの接続を参照してください。

Decision接続の設定

ホスト型のDecisionアカウントは、選択した最近のメッセージと判定文をサービスに送信し、料金が発生することがあります。Smart応答順ではキャラクター一覧も送信します。

  1. 上部バーのConnections(接続)をクリックし、Add(追加)をクリックします。
  2. Decisions(判定)の下で、TypeSafeまたはOwn decision server(自分の判定サーバー)をクリックします。OpenRouterの場合は、Chat(チャット)の下のOpenRouterをクリックして接続し、モデルの⋯メニューにあるUse this key for decisions(このキーをDecisionに使用)を使います。
  3. API key(APIキー)を入力します。Own decision serverの場合はServer address(サーバーのアドレス)を入力します。Connect(接続)をクリックします。ウィンドウが閉じ、パネルに新しいアカウントが表示されます。
  4. Behind the scenes(裏方の処理)の下にあるDecisionの行をクリックし、新しいモデルを選びます。
  5. テストするには、パネルでモデルをクリックしてEdit model(モデルの編集)を開き、Provider tests(プロバイダーのテスト)カードのTest provider(プロバイダーをテスト)をクリックします。Own decision serverのモデルには、そこにTest providerボタンがありません。代わりに、パネルでアカウントの⋯メニューを開き、Test(テスト)をクリックします。

Test providerに成功すると、確率、回答にかかった時間、アカウントの制限時間が表示されます。⋯メニューにあるアカウントのTestでは、動作したかどうかと、かかった時間だけが表示されます。テストは少なくとも10秒待ちます。制限時間がそれより長い場合は、その制限時間の5秒後まで待ちます。回答が制限時間より長くかかった場合は、結果にその旨が表示されます。チャットでは、その回答は回答なしとして扱われます。

うまくいかなかった場合は、トラブルシューティングを参照してください。

Decisionエディター(判定モデルのEdit model)には、次の欄があります。

欄内容
Decision source(判定のソース)TypeSafe、OpenRouter、Custom System One endpoint(カスタムSystem Oneエンドポイント)、OpenAI-compatible chat model (Ollama, LM Studio, llama.cpp)(OpenAI互換チャットモデル)のいずれかです。モデルを作成した時点で固定されます。
API key source(APIキーの取得元)Enter a separate key (optional for local servers)(別のキーを入力、ローカルサーバーでは任意)か、ほかのアカウントのUse key from …(…のキーを使用)です。リンクしたキーは、後からのキーの変更に追従します。カスタムSystem OneモデルやOpenAI互換モデルがカスタムチャットアカウントのキーを借りられるのは、両方のアドレスのスキーム、ホスト、ポートが同じ場合だけです。
Recent-message token budget(最近のメッセージのトークン予算)送信するチャットの推定トークン数です。1から30,000まで。デフォルトは、TypeSafeとOpenRouterで30,000、カスタムサーバーで3,500です。Marinaraは古いメッセージから除外し、続いて最新メッセージの最も古い部分を切り詰めます。拒否されたリクエストや予算を超えたリクエストは、回答なしになります。
Time limit (seconds)(制限時間、秒)チャット中に、判定文ごとに回答を待つ時間です。0.5から30まで。デフォルトは1.5、OpenAI互換チャットモデルでは4です。制限時間を参照してください。

TypeSafeはhttps://api.typesafe.aiに送信します。Base URL(ベースURL)は、TypeSafeのAPIを動かしている別のサーバーのアドレスに置き換えられます。アドレスには/v1/systemoneを含めません。その場合もTypeSafeのキーが必要で、キーはそのサーバーに送信されます。Custom System One endpointには、Open-JevやStrands deciderなど、自分で動かしているSystem Oneサーバーを指定できます。アドレスは/v1/systemoneを含めずに入力します。OllamaなどのチャットモデルサーバーはSystem Oneに対応していません。その場合はOpenAI-compatible chat modelを使ってください。

ホスト型サービスの中には、ときどき回答が1.5秒より遅くなるものがあり、判定が不規則に壊れているように見えます。数回テストし、最も遅い回答より長い制限時間に設定してください。プリセットの判定や、返信前に動くエージェントの起動質問など、返信前に問い合わせる判定文は、それぞれ最大でその時間だけ返信を遅らせることがあります。

判定にキーを使っているアカウントを削除すると、警告が表示されます。その後はDecisionアカウントのリンクをやり直す必要があり、それまで判定は回答なしになります。インポートした接続ファイルにはAPIキーも借用元アカウントへのリンクも含まれないため、手動で復元してください。

Marinaraでの用途

起動質問はエージェントを実行するかどうかを決め、プロンプト内の判定文は、実行中のそのエージェントに何を伝えるかを決めます。はい・いいえの条件には{{#if decision:"..."}}を、複数の回答からの選択には{{#if decision_choice:"..." == "..."}}を使います。

モデルが受け取る情報

起動質問と、プロンプトおよびロアブックの判定文では、モデルは判定文と、チャットに保存されたとおりの最近のメッセージを受け取ります。プリセット、キャラクターカード、ペルソナ、ロアブックエントリー(Constantのものも含む)、要約、エージェントの出力は受け取りません。@ Depthに設定したエントリーなど、メッセージの間に挿入されるテキストも含まれません。これらに依存する判定文では、必要な事実を判定文自体に書いてください。

Smart response order(Smart応答順)ではキャラクター一覧も送信します。分かっている場合は各候補の名前、状態、活動、発言頻度と、最大300文字の性格(性格が空なら説明)を含めます。

Automate active characters(アクティブなキャラクターを自動化)でもキャラクター一覧を送信します。各キャラクターの名前と、最大300文字の説明(説明が空なら性格)を含めます。出演者が多くて収まらない場合は、100文字まで、または名前だけに切り詰めます。さらに、Character Trackerが直近に見たキャラクターの名前も含めます。名前だけにしてもメッセージの余地が足りない場合は、モデルに質問せず、Character Trackerが代わりを務めます。Mergedグループでは、1つの返信が全員の声を担うため、返信に「the narrator」というラベルが付きます。

ホスト型の判定サービスは、メッセージに加えてこれらの一覧も受け取ります。

Advanced Memoryは、チャットごとの専用Decisionモデルを使い、直近5件のルールは適用されません。シーン確認は、関連する履歴の範囲を読み取ります。記憶の呼び出しでは、最近の会話のテキストと、候補に絞り込んだ過去の要約を最大24件送ります(Maximum recalled scenes(想起するシーンの最大数)のほうが大きい場合はそれ以上)。続いて、キャラクターのアクセス権を確認したうえで、モデルが選んだシーンの元のメッセージを送ります。ホスト型サービスはこれらのテキストを受け取り、複数のバッチに分けて受け取ることもあります。記憶の呼び出しの各段階には、通常、モデルの速さに合わせて10~25秒が割り当てられます。両段階は1回の返信につき合わせて40秒を共有するため、1つの段階の時間が10秒未満になることもあります。時間内に回答が得られなかった記憶は、通常の記憶の呼び出しに戻ります。任意のDecisionモデルを参照してください。

しきい値

確率はモデル間で比較できません。同じ例でも、あるモデルでは0.99、別のモデルでは0.2になることがあります。はい・いいえのデフォルトのしきい値は、モデルによって異なります。

エージェントのRun when probability is at least(実行に必要な最小確率)は、この値を上書きします。保存した値が異なると、エディターはモデルの推奨値に戻すことを提案します。モデルを切り替えるたびに確認してください。プロンプトの判定文とロアブックのDecision欄はモデルのデフォルトを使い、エージェントのしきい値を変えてもこれらは変わりません。

Custom System Oneのアカウントの背後で自分で動かしているOpen-Jevも0.5を使います。Marinaraは任意のカスタムエンドポイントを校正できないためです。そのため、0.5未満の肯定的な結果をいいえと読むなど、内蔵のOpen-Jevとは結果が異なることがあります。

制限時間

時間内に届かない判定は回答なしとなり、生成は機能ごとのフォールバックで続行します(Marinaraでの用途を参照)。制限時間はすべて判定文単位です。複数の判定文を含むリクエストでは、判定文ごとに制限時間が与えられ、Choiceの回答候補もそれぞれ1つの判定文と数えます。ローカルモデルは一度に少数のリクエストしか処理しないため、判定文は順番を待ちます。各判定文の時間は、モデルがその処理を始めた時点から計測します。

生成をキャンセルすると、判定リクエストも停止します。

その他の設定

これらはDecision settings(判定の設定)の歯車の中にあります。

誤回答に備える

どのモデルも誤回答することがあり、正しい「はい」の回答がしきい値すれすれになることもあります。

トラブルシューティング

生成中の判定スコアと出力を見るには、Debug Modeをオンにするか、ログレベルをdebugにします。ログレベルを参照してください。返信を生成せずに自分の判定文をテストするには、Peek Prompt → Decision diagnostics → Test decisions(Peek Prompt → Decision診断 → 判断をテスト)を開きます。明示的なテストは選択したモデルを呼び出すため、ホスト型サービスでは料金が発生することがあります。判定文のテストを参照してください。

Marinaraによる判定モデルのインストール

Built-in decision model(内蔵の判定モデル)は、実験的な判定専用モデルです。Marinaraがダウンロードし、チャットモデルと並行して、独立したローカルプロセスとして動かします。使用メモリーは、チャットモデルの使用分に加算されます。ローカルモデルがすでにあるなら、まずそのモデルの判定を試してください。

Open-JevモデルにはLinux x86-64、コンピュート能力7.5以降のNVIDIA GPU(Turing、RTX 20シリーズ以降)、バージョン580以降のドライバーが必要です。Linux ARMや、それより古いカードには対応していません。モデルを実行できない環境でも選択肢は表示されたままで、理由が示され、Set up a Decision provider instead(代わりにDecisionプロバイダーを設定)が提案されます。

モデルモデルのダウンロードランタイムを含むディスク容量GPUメモリー
Open-Jev 2B約4.6 GB約10 GB約4.8 GB(4.5 GiB)
Open-Jev 9B約19.4 GB約25.3 GB約23.6 GB(22 GiB)

これらはカタログの推定値です。9Bモデルでは、24 GBのGPUに余裕がほとんど残りません。自分のカードに対するインストーラーの診断結果を確認してください。

  1. Connections(接続)パネルでAdd(追加)をクリックし、Decisions(判定)の下にあるBuilt-in model (decisions)(判定用の内蔵モデル)をクリックします。Built-in decision modelというタイトルのウィンドウが開きます。Built-in model(内蔵モデル)カードのページからも開けます。
  2. 警告を読み、Use the built-in decision model(内蔵の判定モデルを使用)をオンにします。Turn on the built-in decision model?というタイトルのダイアログに、自分のコンピューターに対する診断結果が表示されます。Enable(有効化)をクリックします。診断結果が警告の場合はEnable anyway(それでも有効化)をクリックします。
  3. Available decision models(利用できる判定モデル)の下で、Open-Jev 2BまたはOpen-Jev 9Bを選びます。Download and install(ダウンロードしてインストール)をクリックし、サイズ、ハードウェアの診断結果、ライセンスを確認します。それまでは何もダウンロードされません。
  4. Behind the scenes(裏方の処理)の下にあるDecisionの行をクリックし、Built-in model (decisions)を選びます。

ウィンドウには、ほかに次の操作があります。

起動直後のモデルの最初の回答は遅いため、Marinaraは読み込み中にウォームアップ用の質問を1つ送ります。これに失敗してもモデルは起動し、最初の実際の質問でその遅延が発生します。長いチャットで判定文が多いターンほど時間がかかります。長いチャットでは、Open-Jev 2Bは判定文1つあたり約0.25秒かかります。

Strands deciderのセルフホスト

Strands decider 2Bは、System Oneに対応した別のオープンなDecisionモデル(Apache-2.0)です。Marinaraからはインストールできませんが、自分で起動したままにしておけばCustom System One endpoint(カスタムSystem Oneエンドポイント)として動作します。

  1. Python 3.10以降の環境でインストールし、サーバーを起動します。
   pip install strands-decider
   strands-decider serve StrandsAgents/strands-decider-2B-hobson-v19 --port 8000

NVIDIA GPUかApple siliconが見つかればそれを使い、なければプロセッサーで動作しますが遅くなります。初回起動時にモデルと約4.6 GBのベース重みをダウンロードし、Pythonパッケージは約5.5 GBを使います。サーバーにパスワードはないので、127.0.0.1で運用してください。

  1. Server address(サーバーのアドレス)をhttp://127.0.0.1:8000にして、Own decision server(自分の判定サーバー)のアカウントを追加します。モデル名は何でもかまいません。
  2. Decisionの行でそれを選び、アカウントの⋯メニューにあるTest(テスト)でテストします。起動後の最初の回答には約2秒かかり、デフォルトの制限時間より長いため、チャットを始める前に1回テストしてください。

確率は校正済みなので、セルフホストのOpen-Jevと違い、デフォルトのしきい値0.5が適しています(しきい値を参照)。回答は判定文の表現に左右されるため、判定文の書き方に従ってください。

関連ガイド