構造化プロシージャ

エージェントが毎回同じ方法で実行する、型付きステップの固定シーケンス

概要

構造化プロシージャは、固定された順序のステップを実行するプロシージャです。自由形式プロシージャは、エージェントが解釈し、状況に応じて調整する自然言語のガイダンスです。構造化プロシージャは、プロシージャが適用されるたびにエージェントが順番に実行する、型付きステップの順序付きリストです。

発信者の本人確認、チケットのエスカレーション、支払いの受付など、特定のステップをすべての通話で同じ方法で行う必要がある場合は、構造化プロシージャを使用します。簡潔な平易な言葉のステップリストとして作成できます。

すべてのプロシージャと同様に、構造化プロシージャには適用するタイミングを説明するトリガーがあります。会話がトリガーに一致すると、エージェントはプロシージャのステップを順番に実行し、その後会話の残りに戻ります。

構造化プロシージャエディター

構造化プロシージャを使用する場合

特定のステップを毎回同じ方法で実行する必要がある一方で、平易なステップで素早く作成したい場合は、構造化プロシージャを使用します。自由形式プロシージャ、ワークフロー、システムプロンプトとの比較については、プロシージャを使用する場合を参照してください。

構造化プロシージャの構成

構造化プロシージャは、名前、トリガー、順序付きステップリストの3つで構成されます。

名前

ダッシュボードでプロシージャを識別するための短いラベルです。名前がLLMに送信されることはないため、エージェントの動作には影響しません。

トリガー

たとえば「ユーザーが注文の返金を求めた場合」のように、エージェントがこのプロシージャを実行すべきタイミングを平易な言葉で説明します。エージェントはユーザーの意図を各プロシージャのトリガーと比較して一致するものを実行するため、トリガーは具体的で区別しやすいものにしてください。トリガーはすべてのプロシージャで同じように機能します。トリガーの書き方を参照してください。

ステップ

プロシージャ本文は、型付きステップの順序付きリストです。複数のステップタイプがあり、それらを組み合わせてタスクを説明します。

ステップ内容
Askユーザーに情報を求め、適切な回答を待ちます。
Tell指示に基づき、エージェント自身の言葉でメッセージを生成します。
Say正確なメッセージを一言一句そのまま発話します。
Tool特定のツールまたはAPIを呼び出します。
If最初に一致したif/else-if分岐、または任意のelse分岐を選択します。
Sub-procedure別の構造化プロシージャを実行し、次のステップに戻ります。
System tool組み込みのシステムアクションを実行します。現在は通話の終了のみ対応しています。
Retry失敗したツール呼び出しを再試行します。ツールの失敗処理内でのみ使用できます。

構造化プロシージャのステップタイプメニュー

APIステップリファレンス

構造化プロシージャのcontentは、steps配列を含むJSONエンコード済みドキュメントです。各ステップはtypeで識別されるオブジェクトです。

Ask

Askステップは、情報を求め、ユーザーが適切な回答を提供するまで待つようエージェントに指示します。

  • APIタイプ:ask
  • instruction:必須の空でない文字列。
{
"type": "ask",
"instruction": "Ask the user for their order ID."
}

Tell

Tellステップは、自身の言葉で1つのメッセージを生成するようエージェントに指示します。Askとは異なり、続行する前にユーザーの応答を待ちません。

  • APIタイプ:tell
  • instruction:必須の空でない文字列。
{
"type": "tell",
"instruction": "Explain that the refund normally takes five to ten business days."
}

Say

Sayステップは、指定されたテキストを記載どおりに正確に発話します。

  • APIタイプ:say
  • message:必須の空でない文字列。
{
"type": "say",
"message": "Your refund has been submitted."
}

If、else if、else

Ifステップには、1つ以上の順序付き条件分岐が含まれます。最初に一致した分岐が実行されます。任意のfallback配列はelse分岐として機能します。

  • APIタイプ:branch
  • branches:必須の空でない条件分岐リスト。
  • fallback:任意のelseステップリスト。
  • 各分岐にはconditionと空でないstepsリストが必要です。
{
"type": "branch",
"branches": [
{
"condition": {
"type": "llm",
"condition": "The user is on an annual plan."
},
"steps": [
{
"type": "say",
"message": "Your annual plan is eligible for a prorated refund."
}
]
}
],
"fallback": [
{
"type": "tell",
"instruction": "Explain that the account's plan could not be determined."
}
]
}

これはif/else-if/elseのように動作します。

  1. 条件は順番に評価されます。
  2. 最初に一致した分岐が実行されます。
  3. 一致する条件がない場合は、fallbackが実行されます。
  4. 分岐が終了すると、プロシージャはメインシーケンスに戻ります。

上記の例では自然言語の条件を使用しています。条件にはワークフロー式も使用できます。

{
"type": "expression",
"expression": {
"type": "eq_operator",
"left": {
"type": "dynamic_variable",
"name": "plan_tier"
},
"right": {
"type": "string_literal",
"value": "annual"
}
}
}

1つのIfステップ内のすべての分岐では、同じ条件タイプ、つまりllmまたはexpressionのいずれかを使用する必要があります。

Ifステップはプロシージャの最初のステップにできます。ただし、次の制限があります。

  • Ifステップはネストできません。
  • 2つのIfステップを連続して配置することはできません。
  • 式条件をAskステップの直後に置くことはできません。ユーザーの自由形式テキストの応答を評価するには、LLM条件を使用してください。

Tool

Toolステップは特定のツールを呼び出します。

  • APIタイプ:tool_call
  • tool_id:必須の空でないツールID。
  • tool_name:必須のツール名。
  • instruction:ツールの呼び出し方法を説明する任意の指示。
  • on_failure:任意の失敗ハンドラー。
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "lookup_order",
"instruction": "Look up the order using the order ID provided by the user."
}

on_failureがない場合、ツール呼び出しが失敗するとプロシージャは停止します。特定の失敗を処理したり、ツールを再試行したり、フォールバックステップに進んだりするには、on_failureを追加してください。

  • branches:任意の順序付き条件リスト。最初に一致した分岐が実行されます。
  • fallback:必須の空でないステップリスト。どの分岐にも一致しない場合に実行されます。
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "lookup_order",
"on_failure": {
"fallback": [
{
"type": "tell",
"instruction": "Explain that the order could not be retrieved and offer to connect the user with support."
}
]
}
}

失敗ハンドラーの分岐には、Ask、Tell、Say、Sub-procedure、System tool、Retryステップを含められます。ToolまたはIfステップは含められません。1つの失敗ハンドラー内のすべての条件分岐では、同じ条件タイプを使用する必要があります。

Retry

Retryステップは、それを含む失敗ハンドラーのToolステップを再試行します。

  • APIタイプ:retry
  • max_retries:1~3の任意の整数。デフォルトは1です。
  • 値は、元のツール呼び出し後の再試行回数を数えます。
  • Retryはon_failure内でのみ有効です。
  • 後続のステップには到達できないため、Retryは失敗ハンドラー分岐の最後のステップである必要があります。
  • すべての試行が失敗すると、プロシージャは停止します。
{
"type": "retry",
"max_retries": 2
}

Sub-procedure

Sub-procedureステップは別の構造化プロシージャを実行します。終了すると、Sub-procedureステップの次のステップに実行が戻ります。

  • APIタイプ:sub_procedure
  • procedure_id:必須の空でないプロシージャID。
  • 対象は同じエージェント上に存在する必要があります。
  • 対象は構造化プロシージャである必要があります。
  • プロシージャが自身を呼び出すことはできません。
{
"type": "sub_procedure",
"procedure_id": "agtprc_6qbpwdq8n01bxhk44bgjy6f10ck3"
}

System tool

System toolステップは組み込みのシステムアクションを実行します。

  • APIタイプ:system_tool
  • system_tool_name:必須のシステムツール名。
  • 現在サポートされているのはend_callのみです。今後、さらにシステムツールが追加される可能性があります。
  • end_callは終端であるため、それを含むシーケンスまたは分岐の最後のステップである必要があります。
{
"type": "system_tool",
"system_tool_name": "end_call"
}

完全なAPI例

この例では、配送ステータスに基づいて注文キャンセルを処理します。失敗したツール呼び出しを再試行し、別の構造化プロシージャを呼び出してから、通話を終了します。

{
"trigger": "When the user asks to cancel an order and request a refund.",
"steps": [
{
"type": "ask",
"instruction": "Ask the user for their order ID."
},
{
"type": "branch",
"branches": [
{
"condition": {
"type": "llm",
"condition": "The user says the order has already shipped."
},
"steps": [
{
"type": "tell",
"instruction": "Explain that shipped orders must be returned before they can be refunded."
}
]
},
{
"condition": {
"type": "llm",
"condition": "The user says the order has not shipped."
},
"steps": [
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "cancel_order",
"instruction": "Cancel the order using the order ID provided by the user.",
"on_failure": {
"fallback": [
{
"type": "retry",
"max_retries": 2
}
]
}
}
]
}
],
"fallback": [
{
"type": "ask",
"instruction": "Ask whether the order has already shipped."
}
]
},
{
"type": "sub_procedure",
"procedure_id": "agtprc_6qbpwdq8n01bxhk44bgjy6f10ck3"
},
{
"type": "say",
"message": "Thank you for contacting us. Goodbye."
},
{
"type": "system_tool",
"system_tool_name": "end_call"
}
]
}

構造化プロシージャの実行方法

会話中にユーザーのリクエストがプロシージャのトリガーに一致すると、エージェントはプロシージャに入り、毎回同じ方法でステップを順番に実行します。プロシージャ内では、エージェントはそれらのステップに集中し、最後に到達すると会話で中断した場所に戻ります。

Toolステップが失敗し、on_failureが定義されていない場合、残りのステップを実行せずにプロシージャは停止します。on_failureが設定されている場合、プロシージャは最初に一致した失敗分岐または必須のフォールバックを実行します。選択されたハンドラーがツールを再試行する、通話を終了する、または別の終端パスを呼び出す場合を除き、処理済みの失敗後は次のプロシージャステップに進みます。

構造化プロシージャを管理する

ダッシュボードでエージェントを開き、プロシージャを選択します。 **+**を使用して構造化プロシージャを作成します。トリガーを追加し、各ステップのタイプを選択して、 エージェントの変更を公開します。

ベストプラクティス

各ステップタイプは固有の動作をすでに強制するため、詳細を明示する必要はほとんどありません。各ステップの 意図を書き、残りはステップタイプに任せてください。以下のガイダンスでは、適切に設定する価値があるケースを説明します。

ステップの記述

Askステップは、質問を行い、適切な回答を受け取るまで進みません。情報が収集されたことを確認するための 後続ステップは不要です。Askステップは、次に進む前にそれを保証します。

Toolステップはツールの実行のみを行います。この間、エージェントは発話や判断を行えません。ユーザーに話しかける、 またはツールの返却内容に基づいて分岐する場合は、Toolステップの前後に別のステップとして配置してください。

エージェント自身にメッセージを作成させる場合はTellステップを、文言をそのまま使用する必要がある場合は Sayステップを使います。どちらも送信するメッセージは1つだけなので、1つのメッセージを送るようステップに指示する必要はありません。

プロシージャの構成

プロシージャの構成に関する一般的なガイダンスは、構造化プロシージャにも適用されます。詳細は、自由形式プロシージャのページにあるプロシージャの構成を参照してください。

タイプを組み合わせる場合に固有のパターンとして、自由形式プロシージャから構造化プロシージャを参照できます。オープンエンドな処理は自由形式プロシージャで行い、本人確認やエスカレーションのように毎回同じ方法で実行する必要がある部分は、構造化プロシージャに委任してください。

制限事項

  • Ifステップはネストできず、2つのIfステップを連続して配置することもできません。

モデルプロバイダーのサポート

構造化プロシージャでは、サブプロシージャへの移行時とプロシージャ完了時に内部ツール呼び出しが強制されます。主要なOpenAI、Anthropic、Gemini、Grokのモデルファミリーは、ツール選択の強制をサポートしています。その他のモデルやカスタムプロバイダーでは保証されない場合があり、サブプロシージャの移行やプロシージャの完了の信頼性が低下する可能性があります。別のモデルプロバイダーを使用する場合は、ツール選択の強制がサポートされていることを確認してください。

コンテンツサイズの上限や、構造化プロシージャと自由形式プロシージャの違いなど、すべてのプロシージャに適用される制限についてはプロシージャを参照してください。