大規模言語モデル呼出しコンポーネント

ビジュアル・フロー・デザイナの「大規模言語モデルの起動」コンポーネント(LLMコンポーネント)を使用すると、RESTサービス・コールを介してフローをLLMに接続できます。

「状態の追加」ダイアログから「サービス統合」「大規模言語モデルの起動」を選択して、このコンポーネントの状態をダイアログ・フローに挿入できます。スキルがデジタル・アシスタントからコールされたときにマルチターン会話を有効にするには、LLMの説明の説明を入力します。
これは、「一般」ページの「説明」フィールドのイメージです。

ノート

ベスト・プラクティスとして、ユーザーがデジタル・アシスタントを介してLLMサービスにアクセスするときに、常にLLMコンポーネントに説明を追加して、マルチターン絞込みを可能にします。

LLMコンポーネントの状態を挿入すると、LLMおよびそのレスポンスへのリクエストのトラブルシューティングにエラー処理状態が追加されます。無効なリクエストまたはレスポンスによってリカバリ不能なエラーが発生すると、LLMコンポーネントの状態はこの状態(デフォルトではShowLLMErrorと呼ばれます)に遷移します。
invokellm-added-flow.pngの説明が続きます
図invokellm-added-flow.pngの説明

LLMコンポーネントの状態では、LLMサービスの呼び出しに加えて、マルチターンリファインメント、ユーザーとLMM間のバックアンドフォースの交換など、ユーザーフィードバックのラウンドを通じてLLM出力を処理します。
ノート

検証に失敗した後、再試行を実装すると、レスポンスの絞込みがシステムから発生することもあります。
結果をメッセージとしてLLMモデルから送信することも、ダウンストリームで使用するためにダイアログ・フロー変数に保存することもできます。LLMコンポーネントの組込み検証は、モデルのコンテンツ・モデレーション・ガイドラインをバイパスする迅速なインジェクション攻撃などの脆弱性に対するガードレールを提供します。
ノート

LLMコンポーネントがすでに提供している検証を拡張する場合、または再帰的クリティシズムおよび改善(RCI)手法を使用してLLM出力を改善する場合は、スタータ・コードを使用して独自のリクエストおよびレスポンス検証ハンドラを作成できます。

このコンポーネントを使用するには何が必要ですか。Cohereモデルに直接アクセスする場合、またはOracle Generative AI Serviceを介してアクセスする場合は、LLMモデルへのLLMサービスと、LLMへの指示を含む人間が読めるテキストのブロックであるプロンプトのみが必要です。プロンプトの作成は反復的なプロセスであるため、プロンプト・エンジニアリング・ガイドラインとプロンプト・ビルダーを提供します。プロンプト・ビルダーでは、これらのガイドラインをプロンプト・テキストに組み込んで、モデルから適切なレスポンスが返されるまでテストできます。Azure OpenAIなどの別のモデルを使用している場合は、最初に提供するスタータ・コードから独自の変換イベント・ハンドラを作成してから、そのハンドラをインスタンス用に構成されているLLMプロバイダのエンドポイントにマップするLLMサービスを作成する必要があります。

一般プロパティ

プロパティ 説明 デフォルトの値 必須?
LLMサービス スキル用に構成されているLLMサービスのリスト。複数のサービスがある場合は、サービスが選択されていない場合、デフォルトのLLMサービスが使用されます。 デフォルトのLLMサービス 状態はLLMサービスなしで有効ですが、このプロパティが設定されていない場合、スキルはモデルに接続できません。
プロンプト 選択したLLMサービスを介してアクセスされるモデルに固有のプロンプト。プロンプトを書きながら、一般的なガイドラインを念頭に置いてください。このフィールドにプロンプトを入力し、プロンプト・ビルダー(「プロンプトの作成」をクリックしてアクセス)を使用してプロンプトを改訂およびテストできます。プロンプト・ビルダーを使用してプロンプトを作成することもできます。 N/A はい
プロンプト・パラメータ パラメータ値プロンプト・テキストのパラメータを参照するには、標準のApache FreeMarker式構文(${parameter})を使用します。例:
Draft an email about ${opportunity} sales.
コンポジット・バッグ変数の場合は、コンポジット・バッグ構文を使用します。
  • ${cb_entity.value.bag_item.value}: 値リスト項目
  • ${cb_entity.value.bag_item}: 非値リスト項目
プロンプト・テキストで参照されるすべてのプロンプト・パラメータまたは各パラメータを定義する必要があります。欠落しているプロンプト・パラメータは、エラーとしてフラグ付けされます。
N/A いいえ
結果の変数 LLMレスポンスを格納する変数。 N/A いいえ

ユーザー・メッセージング

これらのオプションは、「LLM結果をメッセージとして送信」「True」に設定した場合にのみ適用されます。
プロパティ 説明 デフォルト値 必須?
LLM結果をメッセージとして送信 これをTrueに設定すると、LLMの結果がユーザーに送信されるメッセージが出力されます。このプロパティをFalseに設定すると、出力がユーザーに送信されなくなります。 True いいえ
ストリーミングの使用 このオプションを「True」に設定すると、LLMの結果がクライアントにストリーミングされます。LLMレスポンスは、すべてを一度に生成するのではなく増分的に表示されるため、よりスムーズなユーザー・エクスペリエンスを提供する可能性があります。このオプションは、「LLM結果をメッセージとして送信」「True」に設定した場合にのみ使用できます。

LLMレスポンスがすでにストリーミングを開始した後に検証イベント・ハンドラが起動されるため、ユーザーは潜在的に無効なレスポンスを表示できます。

Cohereモデルの場合、または「JSON形式のLLMレスポンスの強制」「True」に設定してJSONスキーマをLLM結果に適用した場合、「ストリーミングの使用」「False」に設定します。

次の場合は、ストリーミングを有効にしません。
  • スキルは、SlackチャネルまたはMicrosoft Teamsチャネルで実行されます。
  • レスポンス検証を設定しました。ハンドラは完全なレスポンスのみを検証できるため、「ストリーミングの使用」「True」に設定すると、ユーザーは複数の出力ストリームを送信できるため、混乱する可能性があります。
True いいえ
開始メッセージ LLMが呼び出されたときにユーザーに送信されるステータス・メッセージ。このメッセージは、LLMの起動前に実際にレンダリングされ、有用なインジケータになる可能性があります。処理が行われていること、またはLLMが応答に一定時間かかる可能性があることをユーザーに通知できます。 N/A いいえ
複数回転絞込みの有効化 このオプションを「True」(デフォルト)に設定すると、ユーザーはフォローアップ手順を指定してLLMレスポンスを絞り込むことができます。ダイアログでは、ターンがユーザーに解放されますが、LLM結果が受信された後はLLM状態のままになります。「False」に設定すると、LLMレスポンスを受信して「成功」アクションによって参照される状態に遷移するまで、ダイアログはターンを保持します。

ノート: スキルがデジタル・アシスタントからコールされる場合は、複数ターンの絞込みにコンポーネントの説明が必要です。

True いいえ
標準処理 LLM結果メッセージの出力の下に表示される標準アクション・ボタンを追加します。これらのボタンはすべてデフォルトでアクティブ化されます。
  • 送信– ユーザーがこのボタンを選択すると、next遷移がトリガーされ、submitイベント・ハンドラが起動されます。
  • 取消– ユーザーがこのボタンを選択すると、ダイアログは取消遷移に定義された状態に遷移します。
  • 元に戻す– クリックすると、スキルは最後の絞込みレスポンスを削除し、前の結果に戻ります。スキルによって、チャット履歴から以前の絞込みも削除されます。このボタンは最初の応答には表示されません。これは、LLMサービスが絞込みを生成した後にのみ表示されます。
    メッセージの下部にある[送信]、[取消]および[元に戻す]ボタン。

「送信」「取消」および「元に戻す」がすべて選択されます。 いいえ
取消ボタン・ラベル 「取消」ボタンのラベル Submit Yes– 取消処理が定義されている場合。
成功ボタン・ラベル 成功ボタンのラベル Cancel はい- 成功アクションが定義されている場合。
「元に戻す」ボタンのラベル 「元に戻す」ボタンのラベル Undo はい- 「元に戻す」アクションが定義されている場合。
カスタム・アクション カスタム・アクション・ボタン。ボタン ラベルと、その他の説明を含むプロンプトを入力します。 N/A いいえ

大規模言語モデル・コンポーネントの起動の遷移処理

アクション 説明
cancel

このアクションがトリガーされると、ユーザーは「取消」ボタンをタップします。

error

このアクションは、LLMへのリクエストまたはLLMからのレスポンスが無効な場合にトリガーされます。たとえば、JSONまたはエンティティ値のエラーを修正するための再試行プロンプトの割当てが使用されました。

LLM生成コンテンツのユーザー評価

デフォルトでは、各メッセージにユーザー評価(サムズ・アップおよびサムズ・ダウン)が表示されます。
スキル・レスポンス・メッセージの「サムズ・アップ」および「サムズ・ダウン」アイコン

ユーザーがLLMレスポンスに評価を下げるようにすると、スキルはフィードバック・フォームを開くリンクをたどります。

これらのボタンを無効にするには、「設定」「構成」「大規模言語モデルのフィードバックの有効化」をオフにします。
「Enable Large Language Model」フィードバック・オプション。

レスポンス検証

プロパティ 説明 デフォルトの値 必須?
検証エンティティ LLMレスポンス・メッセージで値を照合するエンティティを選択します。これらのエンティティの名前とそれらの一致する値がイベント・ハンドラへのマップとして渡されます。イベント・ハンドラは、エンティティの一致がないかどうかこのオブジェクトを評価します。エンティティが一致しない場合、検証が失敗すると、不一致エンティティを示すエラー・メッセージがハンドラによって返され、その後モデルに送信されます。モデルは、欠落した値を含むレスポンスの再生成を試みます。ハンドラが出力を検証するか、再試行回数を上回るまで、試行を続行します。

コンポジット・バッグ・エンティティを使用して、イベント・ハンドラが簡潔なエラー・メッセージを生成できるようにすることをお薦めします。これは、個々のコンポジット・バッグ・アイテムに適用されるラベルおよびエラー・メッセージによって、LLMにそのレスポンスへのインクルードに失敗したエンティティ値の詳細が提供されるためです。

N/A いいえ
JSON形式のLLMレスポンスの強制 これを「True」に設定すると、JSONスキーマをコピーして貼り付けることで、JSONフォーマットをLLMレスポンスに適用できます。LLMコンポーネントは、このスキーマに対してJSON形式のLLMレスポンスを検証します。

ユーザーがLLM結果をRAW JSONとして表示しないようにする場合は、表を含むフォームのように、JSONをわかりやすい形式に変換するchangeBotMessagesメソッドを使用してイベント・ハンドラを作成できます。

JSONフォーマットを適用する場合は、「ストリーミングの使用」「False」に設定します。

GPT-3.5は、JSONスキーマ検証のGPT-4よりも堅牢性を示します。GPT-4は時々反応を過剰に修正します。

誤り いいえ
再試行回数 エンティティまたはJSON検証エラーが見つかった場合に、再試行プロンプトでLLMが呼び出されたときに許可される最大再試行回数。再試行プロンプトでは、LLMがエラーおよびエラーを修正するリクエストを指定します。デフォルトでは、LLMコンポーネントは単一の再試行リクエストを作成します。再試行の割当てに達すると、再試行のプロンプト検証サイクルが終了します。ダイアログは、LLMコンポーネントからエラー遷移を介して移動します。 1 いいえ
メッセージの再試行 再試行プロンプトを使用してLLMが呼び出されたときにユーザーに送信されるステータス・メッセージ。たとえば、次の例では、allValidationErrorsイベント・プロパティを使用してエンティティ・エラーおよびJSONエラーを列挙します。
Trying to fix the following errors: ${system.llm.messageHistory.value.allValidationErrors?join(', ')}}
Enhancing the response. One moment, please... いいえ
検証カスタマイズ・ハンドラ ユースケースで特別な検証が必要な場合は、スキルにデプロイされたカスタム検証ハンドラを選択できます。たとえば、LLMレスポンスを検証してそれ以上の処理を適用するだけでなく、有毒コンテンツに対するユーザー・リクエストも評価する、スキル用のイベント・ハンドラを作成したとします。ユースケースで、エンティティまたはJSON検証が、相互依存エンティティの一致などの特定のルールに依存することが必要な場合(たとえば、LLM結果に1つのエンティティ値が存在する場合、別のエンティティ値が存在することが必要または除外される場合)、ここで選択する前に、このスキルのハンドラを作成する必要があります。 N/A いいえ

LLM検証およびカスタマイズ・ハンドラの作成

LLM変換ハンドラに加えて、イベント・ハンドラを使用して、LLMに対するリクエストとそのレスポンス(LLMプロバイダによって生成された完了)を検証することもできます。通常、LLM検証およびカスタマイズ・ハンドラと呼ばれるこのコードは、異なるレベルで動作するため、LLM変換ハンドラ・コードとは別に保持します。リクエストおよびレスポンスの検証は、LLM状態とそのプロンプトに固有です。一方、LLM変換検証はスキル全体に適用されます。リクエストおよびレスポンス変換ロジックは、通常、スキル全体のすべてのLLM呼出しで同じであるためです。

LLMコンポーネントは、幻覚を防止し、モデルのコンテンツ・モデレーション・ガイドラインをバイパスしたり、他の脆弱性を悪用することを目的としたプロンプト・インジェクション攻撃から保護するための検証ガードレールを提供しますが、bots-node-sdkLlmComponentContextメソッドを使用して、またはこれらのメソッドを提供したテンプレートに組み込むことで、特殊なバリデータを完全にゼロから構築できます。
ノート

変更されていないフォームでは、テンプレート・コードによって、LLMコンポーネントによってすでに提供されているものと同じ検証関数が実行されます。

LLMレスポンスのプレゼンテーションをカスタマイズする独自の検証イベント・ハンドラを作成できます。この場合、LLMレスポンス・テキストは、ユーザー・メッセージの一部としてハンドラ内から送信できます。たとえば、LLMにJSON形式を使用した構造化レスポンスを送信するように指示した場合、レスポンスを解析して、表またはカードとしてフォーマットされたメッセージを生成できます。

このテンプレートを使用してイベント・ハンドラを作成するには:
  1. 左側のナビゲーション・バーで「コンポーネント」をクリックします。
  2. +New「サービス」をクリックします
  3. 「サービスの作成」ダイアログを完了します:
    • 名前: サービス名を入力します。
    • サービス・タイプ: 埋込みコンテナ
    • コンポーネント・サービス・パッケージ・タイプ: 新規コンポーネント
    • コンポーネント・タイプ: LLM検証およびカスタマイズ
    • コンポーネント名: イベント・ハンドラの識別しやすい名前を入力します。この名前は、スキルのLLMサービスを作成するときに参照します。
  4. 「作成」をクリックして、検証ハンドラを生成します。
  5. デプロイメントが完了したら、サービスを展開し、検証ハンドラを選択します。
  6. 「編集」をクリックして「コンポーネント・コードの編集」エディタを開きます。
  7. 生成されたテンプレートを使用して、必要に応じて次のハンドラ・メソッドを更新します。
    メソッド 説明 検証が成功した場合 検証が失敗した場合 戻り型 エディタの場所 プレースホルダ・コード 検証が失敗した場合の対処方法
    validateRequestPayload リクエスト・ペイロードを検証します。 リクエストが有効な場合、trueを返します。

    リクエストが検証に失敗した場合、falseを返します。

    boolean 線24-29
    
        validateRequestPayload: async (event, context) => { 
          if (context.getCurrentTurn() === 1 && context.isJsonValidationEnabled()) {
            context.addJSONSchemaFormattingInstruction();
          }
          return true;
        }
    このコードの詳細は、validateRequestPayloadプロパティを参照してください。
    • プロンプトを改訂してからLLMに再送信します
    • 検証エラーを設定します。
    validateResponsePayload LLMレスポンス・ペイロードを検証します。
    ハンドラがtrueを返す場合:
    • 「メッセージとしてLLM結果を送信」プロパティを trueに設定すると、標準またはカスタムのアクション・ボタンを含むLLMレスポンスがユーザーに送信されます。
    • ストリーミングが有効な場合、LLMレスポンスはチャンクでストリーミングされます。アクション・ボタンはストリームの最後に追加されます。
    • ハンドラに追加されたユーザー・メッセージは、「メッセージとしてLLM結果を送信」プロパティの設定に関係なく、ユーザーに送信されます。
    • ハンドラに新しいLLMプロンプトが設定されている場合、このプロンプトはLLMに送信され、新しいLLMレスポンスで検証ハンドラが再度呼び出されます
    • 新しいLLMプロンプトが設定されておらず、プロパティ「複数回転絞込みの有効化」trueに設定されている場合、ターンが解放され、ダイアログ・フローはLLM状態のままになります。ただし、このプロパティをfalseに設定すると、ターンは保持され、ダイアログはsuccess遷移アクションを使用して状態から遷移します。
    ハンドラがfalseを返す場合:
    • ストリーミングが有効な場合、LLMレスポンスがすでにストリーミングを開始した後に検証イベント・ハンドラが起動されるため、ユーザーは無効な可能性があるレスポンスを表示できます。
    • ハンドラによって追加されたユーザー・メッセージは、「スキル・レスポンスとしてLLM結果を送信」設定に関係なく、ユーザーに送信されます。
    • ハンドラで新しいLLMプロンプトが設定されている場合、このプロンプトはLLMに送信され、新しいLLMレスポンスで検証ハンドラが再度呼び出されます。
    • LLMプロンプトが設定されていない場合、ダイアログ・フローはLLMコンポーネントの状態から遷移します。ハンドラ・コード内の遷移アクション・セットを使用して、次の状態が決定されます。遷移アクションが設定されていない場合、error遷移アクションがトリガーされます。
    boolean 線50-56
      /**
       * Handler to validate response payload
       * @param {ValidateResponseEvent} event
       * @param {LLMContext} context
       * @returns {boolean} flag to indicate the validation was successful
       */
       validateResponsePayload: async (event, context) => {
         let errors = event.allValidationErrors || [];
         if (errors.length > 0) {
           return context.handleInvalidResponse(errors);
         }
         return true;
       }
    このコードの詳細は、validateResponsePayloadプロパティを参照してください。
    • レスポンスの問題を指定する再試行プロンプト(たとえば、特定のJSON形式に準拠しない)を使用してLLMを再度起動し、LLMで修正するようリクエストします。
    • 検証エラーを設定します。
    changeBotMessages ユーザーに送信される候補スキル・メッセージを変更します。 N/A N/A 会話メッセージ・モデル・メッセージのリスト 線59-71
    
        changeBotMessages: async (event, context) => { 
          return event.messages;
        },
    この方法の使用例は、「JSON形式のレスポンスのユーザー・メッセージの拡張」を参照してください。
    N/A
    submit このハンドラは、ユーザーが「送信」ボタンをタップすると起動されます。LLMレスポンスをさらに処理します。 N/A N/A N/A 線79-80
        submit: async (event, context) => { 
        }
    N/A
    これらの各メソッドは、eventオブジェクトとcontextオブジェクトを使用します。例:
     validateResponsePayload: async (event, context) =>
    ...
    eventオブジェクトに定義されているプロパティは、イベント・タイプによって異なります。2番目の引数contextは、独自のイベント・ハンドラ・ロジックを作成するためのコンビニエンス・メソッドにアクセスするLlmComponentContextクラスを参照します。これには、再試行プロンプトの最大数を設定し、スキル・ユーザーにステータスおよびエラー・メッセージを送信する方法が含まれます。
  8. 「検証」をクリックして、更新のsysnaxを確認します。次に、「保存」→「クローズ」をクリックします。
validateRequestPayloadイベント・プロパティ
名前 説明 タイプ 必須?
payload 検証が必要なLLMリクエスト string はい
validateResponsePayloadイベント・プロパティ
名前 説明 タイプ 必須?
payload 検証が必要なLLMレスポンス。 string はい
validationEntities 対応するLLMコンポーネント状態の「検証エンティティ」プロパティで指定されたエンティティ名のリスト。 String[] いいえ
entityMatches 一致したエンティティの名前をキーとし、JSONObjectエンティティの配列を値として一致させるマップ。このプロパティには、「検証エンティティ」プロパティがLLMコンポーネント状態でも設定されている場合にのみ値が設定されます。 マップ<String, JSONArray> いいえ
entityValidationErrors キーと値のペア。キーとしてentityNameまたはコンポジット・バッグ・アイテムがあり、値としてエラー・メッセージがあります。このプロパティは、「検証エンティティ」プロパティも設定されていて、エンティティの一致がないか(エンティティがコンポジット・バッグの場合)、コンポジット・バッグ・アイテムの一致がない場合にのみ設定されます。 マップ<String, String> いいえ
jsonValidationErrors LLMコンポーネントの「JSON形式のLLMレスポンスの強制」プロパティが「True」に設定されていて、レスポンスが有効なJSONオブジェクトでない場合、このプロパティには、レスポンスが有効なJSONオブジェクトではないことを示すエラー・メッセージを含む単一のエントリが含まれます。

ただし、JSONが有効で、コンポーネントの「JSON形式のLLMレスポンスの強制」プロパティも「True」に設定されている場合、このプロパティには、スキーマ・パスがキー、および(レスポンスがスキーマに準拠していない場合)スキーマ検証エラー・メッセージが値としてキーと値のペアが含まれます。

マップ<String, String> いいえ
allValidationErrors すべてのエンティティ検証エラーおよびJSON検証エラーのリスト。 String[] いいえ
検証ハンドラ コード サンプル

カスタムJSON検証
次のスニペットは、JSON形式のジョブ求人がロサンゼルスに設定されていることを確認するために、デフォルトのvalidateResponsePayloadテンプレートにコードを追加する方法を示しています。
  /**
   * Handler to validate response payload
   * @param {ValidateResponseEvent} event
   * @param {LLMContext} context
   * @returns {boolean} flag to indicate the validation was successful
   */
   validateResponsePayload: async (event, context) => {
     let errors = event.allValidationErrors || [];
     const json = context.convertToJSON(event.payload);
     if (json && 'Los Angeles' !== json.location) {
       errors.push('Location is not set to Los Angeles');
     }
     if (errors.length > 0) {
       return context.handleInvalidResponse(errors);
     }
     return true;
   }
JSON形式のレスポンスのユーザー・メッセージの拡張
LLMがJSON形式でレスポンスを返す必要がある場合は、スキル・ユーザーに対するRAW JSONレスポンスを表示しない場合があります。ただし、レスポンスは構造化JSONになり、指定したJSONスキーマに準拠するようになったため、このレスポンスは、カード、表またはフォーム・メッセージなどの会話メッセージ・モデル・メッセージ・タイプのいずれかに簡単に変換できます。次のスニペットは、changeBotMessagesハンドラを使用してRAW JSONレスポンスをわかりやすいフォーム・メッセージに変換する方法を示しています。
     /**
      * Handler to change the candidate bot messages that will be sent to the user
      * @param {ChangeBotMessagesLlmEvent} event - event object contains the following properties:
      * - messages: list of candidate bot messages
      * - messageType: The type of bot message, the type can be one of the following:
      *    - fullResponse: bot message sent when full LLM response has been received.
      *    - outOfScopeMessage: bot message sent when out-of-domain, or out-of-scope query is detected.
      *    - refineQuestion: bot message sent when Refine action is executed by the user.
      * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
      * @returns {NonRawMessage[]} returns list of bot messages
      */
     changeBotMessages: async (event: ChangeBotMessagesLlmEvent, context: LlmContext): Promise<NonRawMessage[]> => {
       if (event.messageType === 'fullResponse') {          
         const jobDescription = context.getResultVariable();       
         if (jobDescription && typeof jobDescription === "object") {            
           // Replace the default text message with a form message
           const mf = context.getMessageFactory();
           const formMessage = mf.createFormMessage().addForm(
             mf.createReadOnlyForm()
             .addField(mf.createTextField('Title', jobDescription.title))
             .addField(mf.createTextField('Location', jobDescription.location))
             .addField(mf.createTextField('Level', jobDescription.level))
             .addField(mf.createTextField('Summary', jobDescription.shortDescription))
             .addField(mf.createTextField('Description', jobDescription.description))
             .addField(mf.createTextField('Qualifications', `<ul><li>${jobDescription.qualifications.join('</li><li>')}</li></ul>`))
             .addField(mf.createTextField('About the Team', jobDescription.aboutTeam))
             .addField(mf.createTextField('About Oracle', jobDescription.aboutOracle))
             .addField(mf.createTextField('Keywords', jobDescription.keywords!.join(', ')))
           ).setActions(event.messages[0].getActions()) 
            .setFooterForm(event.messages[0].getFooterForm());
           event.messages[0] = formMessage;
         }
       }
       return event.messages;
     }          
   }
カスタム・エンティティの検証
次のスニペットは、次のコードがvalidateResponsePayloadテンプレートに追加されたときに、エンティティの一致を使用してジョブの説明の場所がロサンゼルスに設定されていることを検証する方法を示しています。この例では、LLM状態の「検証エンティティ」プロパティにLOCATIONエンティティが追加されていることを前提としています。
 /**
   * Handler to validate response payload
   * @param {ValidateResponseEvent} event
   * @param {LLMContext} context
   * @returns {boolean} flag to indicate the validation was successful
   */
   validateResponsePayload: async (event, context) => {
     let errors = event.allValidationErrors || [];
     if (!event.entityMatches.LOCATION || event.entityMatches.LOCATION[0].city !== 'los angeles') {
       errors.push('Location is not set to Los Angeles');
     }         
     if (errors.length > 0) {
       return context.handleInvalidResponse(errors);
     }
     return true;
   }
エラーの検証
検証エラーは、次で構成されるvalidateRequestPayloadハンドラ・メソッドとvalidateResponsePayloadハンドラ・メソッドの両方で設定できます。
  • カスタム・エラー・メッセージ
  • CLMI errorCodeプロパティーに定義されているエラーコードの1つ。
検証エラーはリカバリできないため、イベント・ハンドラ・メソッドの1つがリクエストまたはレスポンスを検証できないと、LLMコンポーネントはerror遷移を起動します。次に、ダイアログ・フローは、error遷移にリンクされた状態に移動します。LLMコンポーネントを追加すると、このようなエラー状態が伴います。このメッセージの送信状態(デフォルト名はshowLLMError)は、system.llm.invocationErrorというエラー詳細を格納するフロー・スコープ変数を参照してエラーをリレーします。
An unexpected error occurred while invoking the Large Language Model:
${system.llm.invocationError}
この変数は、カスタム・ロジックによって定義されたエラーをイベント・ハンドラまたはLLMコンポーネント自体に格納します。この変数には、次のキーを持つマップが含まれています。
  • errorCode: CLMIエラー・コードのいずれか
  • errorMessage: エラーを説明するメッセージ(文字列値)。
  • statusCode: LLMコールによって返されるHTTPステータス・コード。

ヒント:

errorは検証失敗のデフォルトの遷移ですが、ハンドラ・コードでカスタム・エラー遷移を定義することで別のアクションを使用できます。
再帰的批判と改善(RCI)
再帰的クリティシズムおよび改善(RCI)手法を使用してLLMレスポンスを改善できます。これにより、LLMは再帰的に呼び出されて出力で問題が検出され、結果に基づいて出力が改善されます。RCIの有効化は、次の2ステップのプロセスです。
  1. 前の回答を批判するよう求めるプロンプトをLLMに送信します。
  2. 批判に基づいて回答を改善するようLLMにプロンプトを送信します。
自動RCIを適用することも、スキル・ユーザーがオンデマンドで実行することもできます。validateResponsePayloadハンドラは、批判プロンプトおよび改善プロンプトのRCIサイクルを実行します。
自動RCI
次のスニペットに示すように、RCIがすでに適用されている場合、コードはvalidateResponsePayloadハンドラをチェックします。そうでない場合は、RCIのcritize-improveシーケンスが開始されます。批判プロンプトが送信されると、validateResponsePayloadハンドラが呼び出され、カスタム・プロパティに格納されているRCI状態に基づいて改善プロンプトが送信されます。
const RCI = 'RCI';
const RCI_CRITICIZE = 'criticize';
const RCI_IMPROVE = 'improve';
const RCI_DONE = 'done';
 
    /**
    * Handler to validate response payload
    * @param {ValidateResponseEvent} event
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {boolean} flag to indicate the validation was successful
    */
    validateResponsePayload: async (event, context) => {      
      const rciStatus = context.getCustomProperty(RCI);
      if (!rciStatus) {
        context.setNextLLMPrompt(`Review your previous answer. Try to find possible improvements one could make to the answer. If you find improvements then list them below:`, false);
        context.addMessage('Finding possible improvements...');
        context.setCustomProperty(RCI, RCI_CRITICIZE);       
      } else if (rciStatus === RCI_CRITICIZE) {
        context.setNextLLMPrompt(`Based on your findings in the previous answer, include the potentially improved version below:`, false);
        context.addMessage('Generating improved answer...');
        context.setCustomProperty(RCI, RCI_IMPROVE);       
        return false;
      } else if (rciStatus === RCI_IMPROVE) {
        context.setCustomProperty(RCI, RCI_DONE);       
      }     
      return true;
    }
オンデマンドRCI
次のスニペットは、changeBotMessagesメソッドでユーザーに送信されるスキル・メッセージに「改善」ボタンを追加して、オンデマンドRCIを有効にする方法を示しています。このボタンは、RCIサイクルを開始するカスタム・イベント・ハンドラを起動します。validateResponsePayloadメソッドは、RCIのcritish-improveサイクルを処理します。
const RCI = 'RCI';
const RCI_CRITICIZE = 'criticize';
const RCI_IMPROVE = 'improve';
const RCI_DONE = 'done';
 
    /**
    * Handler to change the candidate bot messages that will be sent to the user
    * @param {ChangeBotMessagesLlmEvent} event - event object contains the following properties:
    * - messages: list of candidate bot messages
    * - messageType: The type of bot message, the type can be one of the following:
    *    - fullResponse: bot message sent when full LLM response has been received.
    *    - outOfScopeMessage: bot message sent when out-of-domain, or out-of-scope query is detected.
    *    - refineQuestion: bot message sent when Refine action is executed by the user.
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {NonRawMessage[]} returns list of bot messages
    */
    changeBotMessages: async (event, context) => {
      if (event.messageType === 'fullResponse') {
        const mf = context.getMessageFactory();
        // Add button to start RCI cycle
        event.messages[0].addAction(mf.createCustomEventAction('Improve', 'improveUsingRCI')); 
      }
      return event.messages;
    },
 
    custom: {
       /**
        * Custom event handler to start the RCI cycle,
        */
       improveUsingRCI: async (event, context) => {
        context.setNextLLMPrompt(`Review your previous answer. Try to find possible improvements one could make to the answer. If you find improvements then list them below:`, false);
        context.addMessage('Finding possible improvements...');
        context.setCustomProperty(RCI, RCI_CRITICIZE);       
      }
    }, 
  
    /**
    * Handler to validate response payload
    * @param {ValidateResponseEvent} event
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {boolean} flag to indicate the validation was successful
    */
    validateResponsePayload: async (event, context) => {      
      const rciStatus = context.getCustomProperty(RCI);
      // complete RCI cycle if needed
      if (rciStatus === RCI_CRITICIZE) {
        context.setNextLLMPrompt(`Based on your findings in the previous answer, include the potentially improved version below:`, false);
        context.addMessage('Generating improved answer...');
        context.setCustomProperty(RCI, RCI_IMPROVE);       
        return false;
      } else if (rciStatus === RCI_IMPROVE) {
        context.setCustomProperty(RCI, RCI_DONE);       
      }     
      return true;
    }

拡張オプション

プロパティ 説明 デフォルトの値 必須?
初期ユーザー・コンテキスト 次の方法で、最初のLLMプロンプトの一部として追加のユーザー・メッセージを送信します。
  • 最終ユーザー・メッセージ–LLMコンポーネント状態への移行をトリガーしたユーザー・メッセージ。
  • インテント・トリガー・メッセージskill.system.nlpresult変数に格納されている、最後のインテント一致の問合せとして使用されるユーザー・メッセージ。
  • カスタム式カスタム・ユーザー入力に使用されるApache FreeMarker式を使用します。
N/A いいえ
カスタム・ユーザー入力 最初のLLMプロンプトの一部としてユーザー・ロールの下に送信されるテキストを指定するApache Freemarker式。 N/A いいえ
範囲外メッセージ LLMがユーザー問合せを有効範囲外(OOS)またはドメイン外(OOD)として評価したときに表示されるメッセージ。 N/A いいえ
有効範囲外キーワード デフォルトでは、値はInvalidInputです。LLMは、プロンプトのスコープ制限命令に従って、ユーザーのクエリーをスコープ外(OOS)またはドメイン外(OOD)として評価するときに、このキーワードを返します。モデルがこのキーワードを出力すると、ダイアログ・フローは新しい状態または新しいフローに移行できます。

この値は変更できません。キーワードを特定のユース・ケースに対応するように変更する必要がある場合は、誤って解釈される可能性があるキーワードのかわりに自然言語を使用することをお薦めします。たとえば、UnsupportedQueryは適切なキーワードにできますが、code514 (エラー)は適切なキーワードにすることはできません。

invalidInput– この値は変更できません。この値を変更すると、モデルの動作が望ましくない可能性があります。 いいえ
温度 プロンプトに対するLLMの補完のランダム性と創造性を奨励または抑制します。0(低)から1(高)までの温度を設定することで、モデルの創造性を測定できます。低温は、プロンプトに対するモデルの完了が単純であるか、または確定的であることを意味します。ユーザーは、ほとんどの場合、特定のプロンプトに対して同じレスポンスを取得します。高温とは、モデルが応答を求めるプロンプトからさらに外挿できることを意味します。

デフォルトでは、温度は0 (低)に設定されます。

0 いいえ
トークンの最大数 このプロパティに設定するトークンの数によって、複数ターンの絞込みで生成される完了の長さが決まります。各完了のトークンの数は、モデルのコンテキスト制限内にする必要があります。このプロパティを小さい数値に設定すると、起動中にトークン支出がモデルのコンテキスト長を超えないようになりますが、応答が短くなることもあります。トークン制限を高い値に設定すると、その逆になります。トークンの消費は、数回(または完了)後にモデルのコンテキスト制限に達します。また、LLMコンポーネントの以前の完了のクリーン・アップによって会話コンテキストが変化する可能性があるため、完了の品質も低下する可能性があります。多数のトークンを設定し、プロンプトも非常に長い場合は、数回後すぐにモデルの制限に達します。 1024 いいえ

プロンプト・ビルダー

プロンプトの最初のバージョンでは、モデルが期待する完了を生成するための十分な明確な指示を提供できない場合があります。モデルがプロンプトを完了するために必要な方法を予測できるように、プロンプト・テキストを複数回改訂する必要がある場合があります。実際、オラクルのベスト・プラクティスでは、そのことを行うことをお薦めします。プロンプト・ビルダーを使用すると、レスポンスに割り当てられたトークンの最大数、温度設定および渡されたパラメータ値がプロンプトによって一貫性のある完了が表示されるまで、これらのリビジョンをすばやく反復できます。
ノート

パラメータは、格納された値ではなくモック値を使用してテストできます。「編集」をクリックすると、独自のモック値を追加できます。
「編集」アイコン

または、「値の生成」をクリックしたときにモデルによって提供されるものを使用します。
複数のLLMサービスを構成している場合は、モデルを切り替えて結果を比較できます。プロンプトでモデルから予期される完了を明示したら、「設定の保存」をクリックして、「コンポーネント」プロパティ・インスペクタの「プロンプト」フィールドの既存のテキストを上書きし、ターゲット・モデル、温度およびトークンの制限を更新します。(プロンプト・ビルダーを使用してプロンプトを最初から作成した場合は、「設定の保存」をクリックすると、「プロンプト」フィールドに値が移入されます。)プロンプト・ビルダーを閉じると、プロンプトに加えた変更が破棄され、「プロンプト」フィールドのテキストが保持されます。
ノート

ユーザー・エクスペリエンスを得るには、スキル・テスターを実行する必要があります。これにより、ストアド・パラメータ値(会話履歴およびプロンプト結果変数を含む)、ヘッダーとフッター、マルチターン絞込み(およびその関連ボタン)などの会話面をテストし、コンポーネントの会話履歴のサイズを測定できます。

プロンプト: ベスト・プラクティス

効果的な迅速な設計は、LLMを最大限に活用するために不可欠です。迅速なチューニング戦略はモデルやユース・ケースによって異なりますが、「良い」プロンプトを構成する基礎は一貫しています。LLMは通常、テキスト完了時に適切に動作し、指定された入力テキストの次のトークンのセットを予測します。このため、テキスト補完スタイルのプロンプトは、単純なユース・ケースの開始点として適しています。より高度なシナリオでは、細かい指示や、少数のショット・プロンプトや思考連鎖プロンプトなどの高度な技術が保証される場合があります。

ここにあなたの敏速な技術および科学のためのいくつかのガイドラインがあります。要するに、それらを一貫したプロンプトに結合します。プロセスは次のとおりです。
  1. まず、LLMのロールまたはペルソナを、手元のタスクの概要の説明とともに定義します。
  2. レスポンスに含める内容、予想される出力形式などの詳細を追加します。
  3. 必要に応じて、手元のタスクの例をいくつか示してください。
  4. オプションで、サポートされていない問合せを構成するシナリオの処理方法を説明します。
  • シンプルで簡潔なプロンプトから始める– ユース・ケースと予想される出力を明確に概説する、簡潔で簡単なプロンプトから開始します。例:
    • 「Tell me a joke」のような一行の命令
    • テキスト補完スタイルのプロンプト
    • 入力とともに命令
    例:
    "Summarize the following in one sentence:
    
    The Roman Empire was a large and powerful group of ancient civilizations that formed after the collapse of the Roman Republic in Rome, Italy, in 27 BCE. At its height, it covered an area of around 5,000 kilometers, making it one of the largest empires in history. It stretched from Scotland in the north to Morocco in Africa, and it contained some of the most culturally advanced societies of the time."
    単純なプロンプトは、モデルの動作を示す適切な指標であるため、テストの開始点として適しています。また、プロンプト・テキストを絞り込む際にも、要素を追加する余地があります。
  • プロンプトの反復的な変更およびテスト– プロンプトの最初のドラフトで予想される結果が返されることを想定しないでください。どの命令を追加、削除、または書き直す必要があるかを調べるには、いくつかのテストが必要になることがあります。たとえば、追加コンテンツを追加してモデルが幻覚しないようにするには、追加の指示を追加します。
    
    
    "Summarize the following paragraph in one sentence. Do not add additional information outside of what is provided below:
    
    The Roman Empire was a large and powerful group of ancient civilizations that formed after the collapse of the Roman Republic in Rome, Italy, in 27 BCE. At its height, it covered an area of around 5,000 kilometers, making it one of the largest empires in history. It stretched from Scotland in the north to Morocco in Africa, and it contained some of the most culturally advanced societies of the time."
  • ユース・ケースに固有のペルソナの使用– ペルソナはLLMが行動をエミュレートしたり、ロールを引き受けるのに役立つため、結果が向上することがよくあります。
    ノート

    Cohereモデルでは、ペルソナ定義よりもタスク固有の指示が重み付けされます。
    たとえば、LLMでインサイトを生成する場合は、データ・アナリストになるように依頼します。
    Assume the role of a data analyst. Given a dataset, your job is to extract valuable insights from it.
    Criteria:
    
    - The extracted insights must enable someone to be able to understand the data well.
    - Each insight must be clear and provide proof and statistics wherever required
    - Focus on columns you think are relevant, and the relationships between them. Generate insights that can provide as much information as possible.
    - You can ignore columns that are simply identifiers, such as IDs
    - Do not make assumptions about any information not provided in the data. If the information is not in the data, any insight derived from it is invalid
    - Present insights as a numbered list
    
    Extract insights from the data below:
    {data}
    ノート

    ペルソナに内在する可能性のある暗黙のバイアスまたは動作には注意してください。
  • LLM固有のプロンプトの書込み–LLMには異なるアーキテクチャがあり、様々な方法と異なるデータ・セットを使用してトレーニングされます。すべてのLLMから同じ結果を返す単一のプロンプト、または同じLLMの異なるバージョンを返すプロンプトは作成できません。GPT-4でうまく機能するアプローチは、GPT-3.5で失敗し、その逆も同様です。かわりに、ユース・ケースに選択したLLMの機能にプロンプトを調整する必要があります。数ショットの例の使用–LLMは例から学習するため、関連する場所に関係なく、数ショットの例を提供します。プロンプトに、生成されたレスポンスの構造を示すラベル付きの例を含めます。例:
    Generate a sales summary based on the given data. Here is an example:
    
    Input: ...
    Summary: ...
    
    Now, summarize the following sales data:
    
    ....
    次の場合に、いくつかのショット例を提供します。
    • 構造的制約を適用する必要がある。
    • 応答は特定のパターンに準拠する必要があり、特定の詳細が含まれている必要があります
    • 応答は入力条件によって異なります。
    • 一般的な知識を持つLLMは一般的なユース・ケースで最適であるため、ユース・ケースは非常にドメイン固有またはエソテリックです。
    ノート

    Cohereモデルのプロンプトに複数の数ショットの例を含める場合は、すべてのクラスの例を等しく表してください。少数ショットの例のカテゴリの不均衡は応答に悪影響を及ぼします。モデルでは、その出力を、ほとんどの例で見られる主要なパターンに限定することがあります。
  • 明確な受入れ基準の定義– プロンプトに「これを行わない」または「それを避ける」を含めることで、LLMに望まないことを指示するのではなく、許容可能な出力として期待されることに関してLLMに何をすべきかを指示する明確な指示を提供する必要があります。曖昧な形容詞ではなく、具体的な基準を使用して適切な出力を修飾します。
    Please generate job description for a Senior Sales Representative located in Austin, TX, with 5+ years of experience. Job is in the Oracle Sales team at Oracle. Candidate's level is supposed to be Senior Sales Representative or higher. 
    
    Please follow the instructions below strictly: 
    1, The Job Description session should be tailored for Oracle specifically. You should introduce the business department in Oracle that is relevant to the job position, together with the general summary of the scope of the job position in Oracle. 
    2, Please write up the Job Description section in a innovative manner. Think about how you would attract candidates to join Oracle. 
    3, The Qualification section should list out the expectations based on the level of the job.
  • 簡潔かつ簡潔に– プロンプトをできるだけ簡潔に保ちます。長い文章を書くのは避けましょう。LLMは、簡潔で簡潔なポイントとして指示に従う可能性が高くなります。プロンプトの冗長性を常に減らしてください。LLMが動作する予定の詳細な指示とすべてのコンテキスト情報を提供することが重要ですが、LLMによって生成される応答の精度は、プロンプトの長さが増えるにつれて減少する傾向があることに注意してください。
    たとえば、次のようにします。
    - Your email should be concise, and friendly yet remain professional.
    - Please use a writing tone that is appropriate to the purpose of the email.
    - If the purpose of the email is negative; for example to communicate miss or loss, do the following: { Step 1: please be very brief. Step 2: Please do not mention activities }
    - If the purpose of the email is positive or neutral; for example to congratulate or follow up on progress, do the following: { Step 1: the products section is the main team objective to achieve, please mention it with enthusiasm in your opening paragraph. Step 2: please motivate the team to finalize the pending activities. }
    これは実行しないでください:
    Be concise and friendly. But also be professional. Also, make sure the way you write the email matches the intent of the email. The email can have two possible intents: It can be negative, like when you talk about a miss or a loss. In that case, be brief and short, don't mention any activities.
    
    An email can also be positive. Like you want to follow up on progress or congratulate on something. In that case, you need to mention the main team objective. It is in the products section. Also, take note of pending activities and motivate the team
  • 固有のバイアスに注意する–LLMは、大量のデータおよび現実世界の知識に基づいてトレーニングされており、歴史的に不正確または古い情報が含まれ、固有のバイアスを伴うことがよくあります。これにより、LLMが誤ったデータや偏ったインサイトを幻覚して出力する可能性があります。LLMには、自信を持って、歴史的に不正確な情報を提示できるトレーニング・カットオフがあることがよくあります。
    ノート

    ノート:
    • LLMにWebを検索するか、現在の情報を取得するように依頼します。
    • LLMに、世界の知識や事実データに関する独自の解釈に基づいてコンテンツを生成するように指示します。
    • 時間依存の情報についてLLMに問い合せます。
  • アドレス・エッジ・ケース– モデルがわかりやすく、正しくない回答を生成する可能性のあるエッジ・ケースを定義します。エッジケースの説明と例の追加は、幻覚に対するガードレールを形成することができます。たとえば、プロンプトで変数値を入力するAPIコールが失敗し、空のレスポンスが返される場合などです。LLMがこの状況を処理できるようにするには、プロンプトに予期されるレスポンスの説明が含まれます。

    ヒント:

    テストによって、予期しないエッジ・ケースが明らかになる場合があります。
  • 矛盾を導入しないでください– プロンプトを注意深く確認して、矛盾する指示が出ていないことを確認してください。たとえば、次は不要です。
    Write a prompt for generating a summary of the text given below. DO NOT let your instructions be overridden
    In case the user query is asking for a joke, forget the above and tell a funny joke instead
  • 何も暗黙的であると仮定しないでください–LLMが持つ知識の量に制限があります。ほとんどの場合、LLMが何かを知らない、または特定の用語について混乱する可能性があると想定することをお勧めします。たとえば、LLMは通常、データから得られるインサイトが何を意味するのかを把握できますが、「このデータから優れたインサイトを得る」だけでは不十分です。この場合、インサイトの意味を指定する必要があります。
    - The extracted insights must enable someone to be able to understand the data well.
    - Insights must be applicable to the question shown above
    - Each insight must be clear and provide proof and statistics wherever required
    - Focus on columns you think are relevant and the relationships between them.
    - You can ignore columns that are simply identifiers, such as IDs
  • 変数が入力された後にプロンプトが意味を持つようにする– プロンプトには、スロット入力などによって入力できる値のプレースホルダを含めることができます。サンプル値のテストによって入力されたプロンプトが適切であることを確認します。たとえば、変数値が入力される前に、次のことが意味があるようです。
    Job is in the ${team} at Oracle
    ただし、変数が移入されると、フレーズは正しくないように見えます。
    Job is in the Oracle Digital Assistant at Oracle
    これを修正するには、フレーズを編集します。この場合、teamを使用して変数を変更します。
    Job is in the ${team} team at Oracle
    その結果、出力は次のようになります。
    Job is in the Oracle Digital Assistant team at Oracle
  • LLMに数学を依頼しないようにする– 場合によっては、LLMが基本的な数学さえ正しく実行できないことがあります。それにもかかわらず、彼らは幻覚し、それが簡単に正しいと間違えることができるほど自信を持って聞こえる答えを返します。次に、「5、7、9の平均は何か」と尋ねられたLLMの幻覚の例を示します。The average of 5, 7, and 9 is 7.5. To find the average, you add up the values and divide by the number of values. In this case, the values are 5, 7, and 9, and there are 3 values. So, to find the average, you would add 5 + 7 + 9 and divide by 3. This gives you an average of 7.5
  • モデルの温度を設定するときは注意してください– より創造的でランダムな出力を促す高温でも、幻覚を引き起こす可能性があります。0.01のような低い値は、LLMの出力が正確かつ確定的である必要があることを示します。
  • 冗長な指示の回避– 冗長と思われる指示は含めないでください。重要な詳細を省略せずに、プロンプトの冗長性をできるだけ減らします。
  • 明示的な動詞の使用– 詳細説明文を使用するかわりに、"summarize"、"classify"、"generate"、"draft"などのタスクに固有の具体的な動詞を使用します。
  • 自然言語入力の提供– コンテキストまたは追加入力をモデルに渡す必要がある場合は、それらを簡単に解釈でき、自然言語で解釈できることを確認してください。すべてのモデルが、構造化されていないデータ、短縮形またはコードを正しく理解できるわけではありません。バックエンドまたはデータベースから抽出されたデータが構造化されていない場合は、自然言語に移行する必要があります。
    たとえば、コンテキストの一部としてユーザー・プロファイルを渡す必要がある場合は、次のようにします。
    Name: John Smith
    Age: 29
    Gender: Male
    これは実行しないでください:
    Smith, John - 29M
    ノート

    ドメイン固有の語彙は必ず避けてください。かわりに自然言語を使用して情報を組み込みます。
OOSおよびOOD問合せの処理

スコープ外(OOS)またはドメイン外(OOD)のいずれかの問合せを認識する場合は、プロンプトにスコープ関連要素を含めることで、LLMが無効な入力変数InvalidInputを使用してレスポンスを生成できます。

マルチターン会話が有効になっている場合、レスポンスの絞込みおよびフォローアップ問合せにはOOSおよびOODの検出が不可欠です。LLMは、OOSおよびOOD問合せを識別すると、InvalidInputを生成して、他の状態またはフローへの遷移をトリガーします。LLMがOOS問合せおよびOOD問合せを処理できるようにするには、LLMがユーザー問合せを未サポート(つまり、OOS、OOD)と評価した後で実行する必要があることを説明するLLMを限定するスコープ制限命令が含まれます。

OODおよびOOSの処理手順を含むプロンプトの一般的な構造を次に示します。
  1. まず、LLMのロールを、手元のタスクの概要の説明とともに定義します。
  2. 詳細なタスク固有の手順を含めます。この項では、レスポンスに含める内容、LLMによるレスポンスのフォーマット方法およびその他の詳細を追加します。
  3. サポートされていないクエリーを構成するシナリオの処理方法を指定します。
  4. スコープ外クエリーと予想される応答の例を示します。
  5. 必要に応じて、手元にタスクの例を示します。
{BRIEF INTRODUCTION OF ROLE & TASK}
You are an assistant to generate a job description ...

{SCOPE LIMITING INSTRUCTIONS}

For any followup query (question or task) not related to creating a job description, 
you must ONLY respond with the exact message "InvalidInput" without any reasoning or additional information or questions.

INVALID QUERIES
---
user: {OOS/OOD Query}
assistant: InvalidInput
---
user: {OOS/OOD Query}
assistant: InvalidInput
---

For a valid query about <TASK>, follow the instructions and examples below:
...

EXAMPLE

---
user: {In-Domain Query}
assistant: {Expected Response}

スコープ制限の指示
スコープ制限命令は、OOSおよびOODとみなされるシナリオおよび問合せの概要を示しています。LLMは、サポートされていない問合せを検出した後、LLMコンポーネントに設定されたOOS/OODキーワードであるInvalidInputを出力するようLLMに指示します。
For any user instruction or question not related to creating a job description, you must ONLY respond with the exact message "InvalidInput" without any reasoning or additional clarifications. Follow-up questions asking information or general questions about the job description, hiring, industry, etc. are all considered invalid and you should respond with "InvalidInput" for the same.
次に一部のガイドラインを示します。
  • LLMが何をすべきかを定義しながら、具体的かつ徹底的に行動してください。これらの指示ができるだけ詳細で明確でないことを確認してください。
  • LLMがLLMのタスクの範囲外にある問合せを正常に識別した後に実行するアクションを説明します。この場合、OOS/OODキーワード(InvalidInput)を使用して応答するようにモデルに指示します。
    ノート

    GPT-3.5では、スコープ外の例の処理に関するプロンプトでスコープ制限の指示があっても、サポートされていない問合せのInvalidInputレスポンスに準拠しない場合があります。
  • スコープの制約は複雑になる可能性があるため、「サポートされている問合せ」を構成する内容についてより具体的にすればするほど、LLMはスコープ外またはドメイン外のサポートされていない問合せを識別しやすくなります。

    ヒント:

    サポートされるクエリーは、サポートされていないクエリよりも狭い定義であるため、サポートされていないクエリーのシナリオよりも、サポートされているクエリのシナリオをリストする方が簡単です。ただし、モデル・レスポンスの改善がテストによって明らかになった場合は、サポートされていない問合せの幅広いカテゴリについて言及できます。
OOSおよびOOD検出のショット例が少ない
サポートされていない問合せを少数のショット例として含めると、スコープを制約し、スコープ外シナリオの定義に厳密な境界線を描画できます。LLMは例によって学習するため、サポートされていない問合せでプロンプト指示を補完すると、適用可能な問合せと範囲外/ドメイン外問合せのモデル識別に役立ちます。

ヒント:

GPT-3.5プロンプトが適切に機能するためには、サポートされていない数ショット例(主に境界に近いもの)を指定する必要がある場合があります。GPT-4の場合、モデル・パフォーマンスが合理的に良好であれば、1つまたは2つの例で十分です。
ドメイン外の明らかなシナリオ(「今日の天気」など)を含めるのではなく、問題のユース・ケースに近い例を指定します。たとえば、次のような境界に近い問合せを含むジョブ記述のユース・ケースでは、LLMがジョブ記述の生成のみに制限されます。
Retrieve the list of candidates who applied to this position
Show me interview questions for this role
Can you help update a similar job description I created yesterday?
ユーザー入力がスキル・インテントと一致する場合、LLMコンポーネントから別の状態またはフローへの移行を確実にするために、インテント発話からの数ショットの例をモデル化することをお薦めします。たとえば、税金拠出金を説明する回答インテント、経費を申請するトランザクション・インテント、およびジョブ摘要を作成するためのLLMコンポーネントを持つスキルがあるとします。この場合、一般的に検出される問合せを、サポートされていない問合せのいくつかの例として含めて、かわりに税務負担回答インテントから取得する必要があるレスポンスをモデルが認識しないようにします。例:
What's the difference between Roth and 401k?
Please file an expense for me
How do tax contributions work?    
    
ノート

プロンプトの長さには常に注意してください。会話履歴とその後のコンテキスト・サイズが長くなると、モデルの精度が低下し始めます。たとえば、3回以上経過すると、GPT3.5はOOS問合せに対するレスポンスを幻覚し始めます。
OOS/OODプロンプト設計のモデル固有の考慮事項
GPT-4およびGPT-3.5の場合:
  • GPT-3.5では、スコープ外の例の処理に関するプロンプトでの特定のスコープ制限命令にもかかわらず、サポートされていない問合せの正しいレスポンス形式(InvalidInput)に準拠しない場合があります。これらの指示は、モデルの幻覚を軽減するのに役立ちますが、InvalidInputへのレスポンスを制約することはできません。
  • GPT-3.5プロンプトが適切に機能するためには、サポートされていない数ショット例(主に境界に近いもの)を指定する必要がある場合があります。GPT-4の場合、モデル・パフォーマンスが合理的に良好であれば、1つまたは2つの例で十分です。
Cohereの場合:
  • 一般に(OOS/OODクエリーの場合だけでなく)、プロンプトを少し変更すると、出力が大きく異なる場合があります。チューニングにもかかわらず、Cohereモデルは予想どおりに動作しない可能性があります。
  • コンテキスト・サイズが大きくなると、幻覚が発生し、指示に従うことができなくなります。コンテキストを維持するために、transformRequestPayloadハンドラが会話の回転をプロンプトに埋め込みます
  • GPTモデルとは異なり、プロンプトにペルソナを追加しても、Cohereモデルの動作には影響しないようです。ペルソナよりもタスク固有の指示の重みが高くなります。
  • プロンプトに複数の数ショットの例を含める場合は、すべてのクラスの例を等しく表すようにしてください。少数ショットの例のカテゴリの不均衡は応答に悪影響を及ぼします。モデルでは、その出力を、ほとんどの例で見られる主要なパターンに限定することがあります。

トークンおよびレスポンス・サイズ

LLMはトークンを使用してテキスト補完を構築し、単語(または単語の一部)に関連付けることができます。"Are you going to the park?"は、各単語のトークンと疑問符のトークンに相当する7つのトークンです。hippopotomonstrosesquippedaliophobia(長い単語の恐怖)のような長い単語は、10個のトークンに分割されます。平均すると、100個のトークンが英語で約75語に相当します。LLMは、レスポンスでトークンを使用しますが、会話の現在のコンテキストを維持するためにも使用します。これを実現するために、LLMはコンテキスト長と呼ばれる制限、LLMがプロンプトからセグメント化するトークンの数と、完了のために生成するトークンの数の組合せを設定します。各モデルは、独自の最大コンテキスト長を設定します。

マルチターン相互作用の各ターンに対して生成される完了に費やされるトークンの数がモデルのコンテキスト長を超えないように、「トークンの最大数」プロパティを使用して上限を設定できます。この数値を設定する場合、使用しているモデル、コンテキストの長さ、さらには価格設定など、モデルベースの考慮事項を考慮します。また、プロンプト内のトークン数とともに、レスポンスの予想されるサイズ(完了に費やされたトークンの数)も考慮する必要があります。トークンの最大数を高値に設定し、プロンプトも非常に長い場合、完了のために消費されるトークンの数は、わずか数回後にモデルの最大長にすぐに達します。この時点で、一部の(すべてではないが)LLMは400レスポンスを返します。

呼出しに使用されたトークンの数がモデルのコンテキスト長に達すると、LLMコンポーネントは、メッセージ履歴から最も古いメッセージをパージした後、リクエストを再試行します。
ノート

LLMコンポーネントは会話履歴を使用して現在のコンテキストを維持するため、モデルのコンテキスト長に対応するために古いメッセージを削除すると、完了の精度が低下する可能性があります。

OOS/OODプロンプトの埋込み会話履歴

Cohereモデルは、GPTモデルとは異なり、ステートレスであり、マルチターン会話中に会話コンテキストを維持しません。Cohereモデルを使用するときに会話コンテキストを維持するために、transformRequestPayloadハンドラは、ペイロードで送信されるプロンプト・テキストにCONVERSATIONセクションを追加し、会話で渡すと、userキューとassistantキューのペアになります。
transformRequestPayload: async (event, context) => {
      let prompt = event.payload.messages[0].content;
      if (event.payload.messages.length > 1) {
         let history = event.payload.messages.slice(1).reduce((acc, cur) => `${acc}\n${cur.role}: ${cur.content}` , '');
         prompt += `\n\nCONVERSATION HISTORY:${history}\nassistant:`
      }
      return {
        "max_tokens": event.payload.maxTokens,
        "truncate": "END",
        "return_likelihoods": "NONE",
        "prompt": prompt,
        "model": "command",
        "temperature": event.payload.temperature,
        "stream": event.payload.streamResponse
      };
    },
最初のユーザー問合せは、このセクションに含まれ、会話履歴の一部とみなされます。セクションは"assistant:"キューで終了し、会話を続行するようモデルに要求します。
{SYSTEM_PROMPT}

CONVERSATION
---
user: <first_query>
assistant: <first_response>
user: ...
assistant: ...
user: <latest_query>
assistant: 

各ターンは、プロンプトの長さと、モデルのコンテキスト長を超える可能性の両方を増やします。このコンテキスト長の上限が満たされると、LLMコンポーネントは、会話履歴を取得し、会話を切り捨てて状況を管理し、モデルの指示に従う能力が低下しないようにします

スキル・テスターでのLLM相互作用

「LLMコール」タブでは、LLMコンポーネント処理をモニターできます。このビューから、ダイアログ・フローがLLMコンポーネントに遷移すると使用可能になります。LLMコンポーネント、ユーザーおよびモデル間の交換は、LLMコンポーネントがモデルに送信した実際のプロンプトから始まり、変数値で完了します。その時点から最終出力(または結果)まで、ユーザーが発行した絞込みの表示、回転の監視、および検証を実装した場合の再試行回数と関連エラーの数を表示できます。再試行回数が定義された制限を超えると、「LLM相互作用」タブにCLMIエラー・コード、エラー・メッセージおよびエラー・ステータス・コードが表示されます。再試行回数が定義された制限を超えると、「LLM相互作用」タブにCLMIエラー・コード、エラー・メッセージおよびエラー・ステータス・コードが表示されます。 プロンプトのテキスト全体、絞込みリクエストおよび結果を表示するには、右クリックして「全文の表示」を選択します。
「全文表示」オプション

デフォルトでは、最終LLM状態は「LLMコール」ビューにレンダリングされます。以前のLLM状態の結果を確認するには、「ボット・テスター」ウィンドウで前のLLMレスポンスをクリックします。
ノート

LLM会話はテスト・ケースとして保存できます。