独自の生成 AI アシスタントを構築する

独自の生成 AI アシスタントを構築すると、テキスト生成ツールを作成して Agent Assist と統合できます。テキスト生成ツールは、Text Bison や Gemini などの高度な大規模言語モデル(LLM)を使用して候補を生成します。これらの候補を使用すると、カスタマー サービス会話の両端の参加者(人間のエージェントや人間のユーザーなど)をサポートできます。生成ツールは、ほとんどの LLM タスク用に構成できる Agent Assist の組み込み LLM 呼び出しを使用できます。Agent Assist の生成ツールの詳細については、Vertex AI のドキュメントをご覧ください。

発電機の入力

テキスト生成ツールには、次の入力が必要です。

  • 指示: テキスト生成ツールに実行してほしいタスクを説明するテキスト。Vertex AI では、この命令をプロンプトと呼びます。

  • モデル オプション: モデルの選択と、モデルのパフォーマンスを最適化するために必要な設定(温度、出力トークンの上限、TopK、TopP など)。生成される出力は、これらの設定によって制限されます。モデルを選択してモデル オプションを設定するには、生成ツールを作成するときに [モデル オプション] をクリックします。または、デフォルト設定を使用することもできます。Vertex AI では、モデル オプションはパラメータ値と呼ばれます。

  • トリガー イベント: 発電機を開始するタイミングを示す次のいずれかのイベント。

    • END_OF_UTTERANCE: 各発話が入力された後に生成ツールをトリガーします。
    • MANUAL_CALL: 明示的に API 呼び出しを行って呼び出す場合にのみ、ジェネレータをトリガーします。
    • CUSTOMER_MESSAGE: お客様からのメッセージの後にのみ生成ツールをトリガーします。
    • AGENT_MESSAGE: エージェント メッセージの後にのみ生成ツールをトリガーします。

発電機の出力

テキスト生成ツールに入力を提供するだけで、独自の生成 AI アシスト生成ツールが、記事のリンク、適切な回答、プロモーション特典に関するバックエンド情報などの候補を提案します。これらの候補はテキスト形式で提供され、生成された時点でのカスタマー サービスの会話のコンテキスト内で関連性があります。

ユースケース

このセクションでは、独自の生成 AI アシスト生成ツールを実装する方法の例として、3 つのユースケースについて説明します。モデルが生成した出力は、次の例とは異なる場合があります。

プロによる書き直し

次のように、生成エージェントに、人間エージェントの発話を専門的で礼儀正しく、共感のある言い回しに置き換えてから顧客に返信するように指示できます。

  • 生成ツール名: プロによる書き換え
  • トリガー イベント: エージェント メッセージ
  • 手順:

    # TASK DESCRIPTION:
    Output the agent's response under ## LAST UTTERANCE rewritten in a professional, polite and empathetic way in EXAMPLE 4.
    - DO NOT miss any information mentioned by the original text.
    - Only output rewritten response.
    - You're provided with EXAMPLE 1-3. Follow the format.
    
    # EXAMPLE 1
    ## CONVERSATION:
    AGENT: Yo what's up it's Akshay. This is Amazon customer service. What do you want?
    
    ## LAST UTTERANCE:
    Yo what's up it's Akshay. This is Amazon customer service. What do you want?
    
    ## OUTPUT:
    Hi I'm Akshay. Thank you for choosing Amazon customer service. How can I assist you today?
    
    # EXAMPLE 2
    ## CONVERSATION:
    CUSTOMER: Hi, I'm having some trouble with my Apple Music subscription.
    AGENT: Hey, I'm [name]. I can help, I guess. What's your name and account number?
    CUSTOMER: Sure, my name is [name] and my account number is [number].
    AGENT: Alright. Checked that out. You are on Apple Music Individual plan, right?
    
    ## LAST UTTERANCE:
    Alright. Checked that out. You are on Apple Music Individual plan, right?
    
    ## OUTPUT:
    Thank you. I see that you're currently subscribed to the Apple Music Individual plan. Is that correct?
    
    # EXAMPLE 3
    ## CONVERSATION:
    AGENT: What is your order number?
    CUSTOMER: 12345
    AGENT: Hang on a sec. Looking.
    CUSTOMER: I'll wait.
    AGENT: Alright, it appears your order is not registered. Did you even submit the order?
    CUSTOMER: Let me double check. Shoot, someone canceled it. Must be the kids.
    AGENT: Yeah, watch your kids will you?
    CUSTOMER: I'm so sorry.
    AGENT: All good. Have a good one.
    
    ## LAST UTTERANCE:
    All good. Have a good one.
    
    ## OUTPUT:
    No problem. I'm glad I can help. Please have a good day!
    
    # EXAMPLE 4
    ## CONVERSATION:
    ${parameter:transcript}
    
    ## LAST UTTERANCE:
    ${parameter:transcript_last_utterance}
    
    ## OUTPUT:
    

顧客維持

次の例のように、顧客維持のためのエージェント レスポンスを生成するように指示することもできます。たとえば、商品の割引、商品のアップセルやクロスセル、問題の解決などです。生成ツールは、IngestContextReferences API を使用して、割引と特典に関するコンテキスト参照として提供された情報にアクセスします。

  • 生成ツール名: 顧客離れと維持
  • トリガー イベント: お客様からのメッセージ
  • コンテキスト リファレンス: 特典
    • 1 つ: 11% 割引
    • Google Nest: 5% 割引
    • 新規顧客割引: 10%
  • 手順:

    # TASK DESCRIPTION:
    You are an Agent who is helping a customer resolve an issue with complete understanding of the same.
    - Make sure you wait to understand the concern or query before making any suggestions.
    - If the customer informs about the issue, you need to ask the exact reason. If the reason is valid, you can give appropriate credit from the OFFERS section.
    - If the customer is about to cancel an order or subscription, make sure you offer something from the OFFERS section and try to retain the customer.
    - If a customer is inquiring about a new product, offer some combo for upselling another product.
    Below are two examples for detecting churn and generating suggestions for mitigation.
    The output should be a single message suggested to the agent according to the context of the conversation.
    
    # EXAMPLE 1
    Customer: Hello
    Agent: Welcome to Google. How may I help you?
    Customer: I want to cancel order.
    Agent: Sure Let me have an order ID.
    Customer: Its 123321
    Agent: I could see that you placed an order for Google Nest. May I know the reason for cancellation?
    Customer: It's available at cheaper rate now. 
    Agent: Ohh.! I see. Let me check the current price and adjust the order price. Is it okay ?
    Customer: Sure..! I can purchase the product  as long as I can get it at the discounted price. I'd definitely go with it
    Agent: Google Nest costs $200 at present. I can see that you paid $230.
    Customer: Yeah. Can you request to refund $30. I can buy it at $200.
    Agent : Sure. I have updated. You will get $30 refund once your order is delivered.
    Customer: Thanks.
    Agent : Welcome
    
    # EXAMPLE 2
    Customer: Hello
    Agent: Welcome to Google. How may I help you?
    Customer: I am having Google One Subscription. I think I may need some more space in future. 
    Agent: Okay. May I have your customer Id:
    Customer: Its 123321
    Agent: I could see that you have 100GB Plan at present. How much are you expecting to need in future?
    Customer: I think I may need 100GB or more.
    Agent: I could check that you are a loyal customer who had subscriptions since last 6 months. I can provide you 10% discount. 
    Customer: Sure..! That would be great. 
    Agent: 200GB Subscription costs $180 per annum which I can offer you at $162.
    Customer: That's cool. Thank you.
    Agent: Is there anything else I can help you with?
    Customer: No thanks.
    
    ## CONTEXT
    ${parameter:transcript}
    
    ## OFFERS
    ${parameter:offers}
    

生成ツールを作成する

次のサンプルは、独自の GenAI アシスト テキスト生成ツールを作成する方法を示しています。

Console

エージェント アシスト コンソールを使用して生成ツールを作成するには、次の操作を行います。

  1. コンソールで、[Build-your-own-assist] ページに移動します。

    [Build-your-own-assist] に移動

  2. [作成] をクリックします。

  3. 生成ツールの名前を入力します。

  4. リストからトリガー イベントを選択します。

  5. タスクを定義する手順を入力します。

  6. [モデル オプション] をクリックし、リストからモデルを選択します。

  7. パラメータを設定するか、デフォルトの設定を使用します。

  8. [保存]、[保存] の順にクリックして、ジェネレータを保存します。

REST

API を使用して生成ツールを作成するには、次の操作を行います。

  1. Generator リソースから CreateGenerator メソッドを呼び出します。
  2. description フィールドにジェネレータの名前を入力します。
  3. トリガー イベントを入力します。
  4. FreeFormContext.text に、タスクを定義する指示を入力します。
  5. published_model フィールドにモデル名を入力するか、空白にしてデフォルト モデルを使用します。
  6. モデル パラメータを inference_parameter フィールドに指定するか、空にしてデフォルト値を使用します。

パラメータ

${parameter:<parameter_name>} の形式を使用して単語をパラメータとしてマークすることで、指示をコンテキストにできます。Data Ingestion API を使用して、会話で IngestContextReferences メソッドを呼び出して、パラメータの実際の値をインポートすることもできます。この方法では、命令のパラメータが実行時に値に置き換えられます。

IngestContextReferences を呼び出してパラメータの値をインポートする方法の JSON の例を次に示します。

{
  "contextReferences": {
    "glossary": {
      "contextContents": [
        {
          "content": "east one",
          "contentFormat": "PLAIN_TEXT"
        }
      ]
    }
  }
}

取り込む必要のない生成ツール パラメータもあります。組み込みパラメータは次のとおりです。

  • ${parameter:transcript}: ユーザーの最後の発話を含む、エージェントとユーザー間の会話。
  • ${parameter:transcript_last_utterance}: 会話の最後の発話。

命令では、少なくとも 1 つの組み込みパラメータを使用する必要があります。

組み込みまたは取り込まれたかどうかにかかわらず、生成ツールのパラメータは、生成ツールの作成時に設定されるモデル オプションとは異なります。これらの生成パラメータの値は、会話の文字起こしまたは取り込まれたデータから取得されます。一方、モデル オプションの値は、生成ツール全体に対して設定します。

生成ツールをテストする

生成 AI アシスト コンソールの [生成ツールをテスト] セクションで、生成ツールをテストできます。

Build your own GenAI assist コンソールで生成ツールをテストする手順は次のとおりです。

Console

  1. 会話の文字起こしを追加します。発話を手動で入力するか、[アップロード] をクリックして音声文字変換を JSON 形式でアップロードします。
  2. 取り込む必要があるデータを追加するには、more_vertnote_add [取り込まれたデータを追加] をクリックします。

生成 AI アシスト コンソールには、生成された回答と生成ツールの名前が表示されます。

REST

API を使用してジェネレータをテストする手順は次のとおりです。

  1. generatorName フィールドにジェネレータ名を入力します。
  2. conversationContext フィールドに会話を指定します。
  3. パラメータ値がある場合は、contextReferences フィールドに指定します。
  4. 候補を生成するトリガーを triggerEvents フィールドに入力します。生成された候補は generatorSuggestion フィールドで確認できます。

会話プロファイル

会話プロファイルでは、会話中に提示される候補を制御する一連のパラメータを定義します。次の手順では、HumanAgentAssistantConfig オブジェクトを使用して conversationProfile リソースを作成します。

Console

  1. Agent Assist コンソールで、[会話プロファイル] ページに移動します。
  2. [+ 作成] をクリックします。
  3. 表示名を入力します。
  4. 候補の種類のチェックボックス [Build-your-own-assist] を選択します。
  5. ジェネレータの名前を入力するか、リストからジェネレータの名前を選択します。

REST

  1. 会話プロファイル リソースから create メソッドを呼び出します。
  2. 新しい会話プロファイルの名前を入力します。
  3. 言語コードを入力します。
  4. human_agent_suggestion_config に生成ツールの名前を入力します。

会話プロファイルの JSON の例を次に示します。

{
  "displayName": "build-your-own-assist-test",
  "humanAgentAssistantConfig": {
    "humanAgentSuggestionConfig": {
      "generators": "projects/PROJECT_ID/locations/global/generators/GENERATOR_ID"
    }
  }
}

シミュレータで確認する

会話プロファイルは Agent Assist シミュレータで確認できます。シミュレータには、生成されたレスポンスと生成ツールの名前が表示されます。

プロンプトをテストする

独自の GenAI アシスト コンソールでは、会話プロファイルを確認する場合と同じように、シミュレータでプロンプトをテストできます。次の画像に示す生成された出力は、freeform-tool-test1 ジェネレータがサンプル プロンプトにどの程度従ったかを示しています。

実行時の会話

会話は、エージェント(人間エージェントと仮想エージェントを含む)とサポートの顧客またはエンドユーザーとのやり取りとして定義されます。実行時に、エンドユーザーと人間のエージェントとの会話が開始されると、会話が作成されます。候補を表示するには、エンドユーザーの参加者と人間のエージェントの参加者を両方とも作成して、会話に加える必要があります。

会話を作成する

会話を作成する手順は次のとおりです。

  1. conversation resource から create メソッドを呼び出します。
  2. リクエストのデータを使用する前に、次のように置き換えます。
    • PROJECT_ID: プロジェクト ID
    • CONVERSATION_PROFILE_ID: 会話プロファイル ID

HTTP メソッドと URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations

リクエストの本文(JSON):

{
  "conversationProfile": "projects/PROJECT_ID/conversationProfiles/CONVERSATION_PROFILE_ID",
}

JSON レスポンス内の conversations の後のパスセグメントには、新しい会話 ID が含まれます。JSON レスポンスは次のようになります。

{
  "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID",
  "lifecycleState": "IN_PROGRESS",
  "conversationProfile": "projects/PROJECT_ID/conversationProfiles/CONVERSATION_PROFILE_ID",
  "startTime": "2023-11-05T21:05:45.622Z"
}

エンドユーザーの参加者を作成する

エンドユーザーの参加者を作成するには、次の操作を行います。

  1. participants リソースから create メソッドを呼び出します。
  2. リクエストのデータを使用する前に、次のように置き換えます。
    • PROJECT_ID: プロジェクト ID
    • CONVERSATION_ID: 会話 ID

次のように、会話 ID とロール フィールドに「END_USER」を指定します。

HTTP メソッドと URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants

リクエストの本文(JSON):

{
  "role": "END_USER",
}

JSON レスポンス内の participants の後のパスセグメントには、新しいエンドユーザー参加者 ID が含まれます。JSON レスポンスは次のようになります。

{
 "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/USER_PARTICIPANT_ID", "role": "END_USER"
}

人間のエージェントの参加者を作成する

人間のエージェントの参加者を作成するには、次の操作を行います。

  1. participants リソースから create メソッドを呼び出します。
  2. リクエストのデータを使用する前に、次のように置き換えます。
    • PROJECT_ID: プロジェクト ID
    • CONVERSATION_ID: 会話 ID

次のように、会話 ID と HUMAN_AGENT ロールをフィールドに指定します。

HTTP メソッドと URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants

リクエストの本文(JSON):

{
  "role": "HUMAN_AGENT",
}

JSON レスポンス内の participants の後のパスセグメントには、新しい人間エージェントの参加者 ID が含まれます。レスポンスは次のようになります。

{
"name": "projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/AGENT_PARTICIPANT_ID", "role": "HUMAN_AGENT"
}

メッセージを分析する

生成ツールは、会話内のメッセージを分析することもできます。会話中にメッセージを追加できます。生成ツールは、participants リソースの analyzeContent メソッドを使用して、人間のエージェントとエンドユーザーの両方のメッセージを分析できます。

人間のエージェント メッセージを追加して分析する手順は次のとおりです。

  1. analyzeContent メソッドを呼び出します。
  2. リクエストのデータを使用する前に、次のように置き換えます。
    • PROJECT_ID: プロジェクト ID
    • CONVERSATION_ID: 会話 ID
    • PARTICIPANT_ID: 人間のエージェントの参加者 ID

会話 ID と人間のエージェントの参加者 ID を指定します。リクエストは次のようになります。

HTTP メソッドと URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/PARTICIPANT_ID:analyzeContent

リクエストの本文(JSON):

{
  "textInput": {
    "text": "Bonjour, ici le service client d'ABC fishing, comment puis-je vous aider aujourd'hui ?",
    "languageCode": "en-US"
  }
}

次のような JSON レスポンスが返されます。

{
  "message": {
    "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID/messages/MESSAGE_ID",
    "content": "Bonjour, ici le service client d'ABC fishing, comment puis-je vous aider aujourd'hui ?",
    "languageCode": "en-US",
    "participant": "PARTICIPANT_ID",
    "participantRole": "HUMAN_AGENT",
    "createTime": "2023-02-13T00:01:30.683Z"
  },
  "humanAgentSuggestionResults": [{
    "generateSuggestionsResponse": {
      "generatorSuggestionAnswers": [{
        "generatorSuggestion": {
          "freeFormSuggestion": {
            "response": "Hello, this is ABC fishing customer service, how can I help you today?"
          }
        },
        "sourceGenerator": "projects/PROJECT_ID/locations/global/generators/GENERATOR_ID",
        "answerRecord": "projects/PROJECT_ID/locations/global/answerRecords/ANSWER_RECORD_ID"
      }],
      "latestMessage": "projects/PROJECT_ID/locations/global/conversations/CONVERSATION_ID/messages/MESSAGE_ID"
    }
  }]
}

エンドユーザー メッセージを追加して分析する

  1. analyzeContent メソッドを呼び出します。他のエージェント アシスト機能で呼び出されているメソッドを重複して呼び出さないでください。
  2. リクエストのデータを使用する前に、次のように置き換えます。
    • PROJECT_ID: プロジェクト ID
    • CONVERSATION_ID: 会話 ID
    • PARTICIPANT_ID: 人間のエージェントの参加者 ID

会話 ID と人間のエージェントの参加者 ID を指定します。リクエストは次のようになります。

HTTP メソッドと URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/PARTICIPANT_ID:analyzeContent

リクエストの本文(JSON):

{
  "textInput": {
    "text": "Hi",
    "languageCode": "en-US"
  }
}

次のような JSON レスポンスが返されます。

{
  "message": {
    "name": "projects/PROJECT_ID/conversations/CONVERSATION_ID/messages/MESSAGE_ID",
    "content": "Hi",
    "languageCode": "en-US",
    "participant": "PARTICIPANT_ID",
    "participantRole": "END_USER",
    "createTime": "2020-02-13T00:07:35.925Z"
  },
  "humanAgentSuggestionResults": [{
    "generateSuggestionsResponse": {
      "generatorSuggestionAnswers": [{
        "generatorSuggestion": {
          "freeFormSuggestion": {
            "response": "Salut"
          }
        },
        "sourceGenerator": "projects/PROJECT_ID/locations/global/generators/GENERATOR_ID",
        "answerRecord": "projects/PROJECT_ID/locations/global/answerRecords/ANSWER_RECORD_ID"
      }],
      "latestMessage": "projects/PROJECT_ID/locations/global/conversations/CONVERSATION_ID/messages/MESSAGE_ID"
    }
  }]
}

会話が完了し、analyzeContent が使用されていない場合は、messages リソースの batchCreate メソッドを使用して、会話の過去のメッセージをインポートして分析できます。

候補を取得する

また、会話のどの時点でも、メッセージに対する返信の候補も生成されます。デフォルトでは、どちらか一方の参加者からの最新のメッセージが候補として表示されます。候補を取得するメッセージを指定することもできます。デフォルトで候補を取得するか、次のいずれかのリソースを使用して候補を取得します。

付属の候補を使用する

analyzeContent のレスポンスには候補が付いています。トリガーされた生成ツールがこれらの候補を生成します。JSON リクエストには次のような内容を含める必要があります。

HTTP メソッドと URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_ID/participants/PARTICIPANT_ID:analyzeContent

リクエストの本文(JSON):

{
  "textInput": {
    "text": "I want to reserve a room.",
    "languageCode": "en-US"
  }
}

suggestions リソースを使用する

候補を取得する別の方法は次のとおりです。

  1. suggestions リソースから generate メソッドを呼び出します。
  2. リクエストのデータを使用する前に、次のように置き換えます。
    • PROJECT_ID: プロジェクト ID
    • CONVERSATION_ID: 会話 ID
    • PARTICIPANT_ID: 人間のエージェントの参加者 ID

会話 ID、いずれかの参加者の最新のメッセージ ID、トリガー イベントを指定します。メッセージ ID フィールドが設定されていない場合、デフォルトでは、どちらかの参加者からの最新のメッセージに基づいて候補が生成されます。トリガー イベントに関連付けられたジェネレータが開始されます。JSON リクエストには次のような内容を含める必要があります。

HTTP メソッドと URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/conversations/CONVERSATION_IDsuggestions:generate

リクエストの本文(JSON):

{
  "latestMessage": "projects/PROJECT_ID/conversations/CONVERSATION_IDmessages/Message_ID",
  "triggerEvents": [ "END_OF_UTTERANCE" ]
}

statelessSuggestion リソースを使用する

候補を取得するもう 1 つの方法は、次の手順に沿って操作することです。

  1. statelessSuggestion リソースから generate メソッドを呼び出します。
  2. リクエストのデータを使用する前に、次のように置き換えます。
    • PROJECT_ID: プロジェクト ID
    • LOCATION_ID: ロケーション ID

生成元、会話のメッセージ、取り込まれたデータを含むコンテキスト参照を指定します。取り込まれたデータは、生成ツールの指示のパラメータに置き換えられます。JSON リクエストは次のようになります。

HTTP メソッドと URL:

https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION_ID/statelessSuggestion:generate

リクエストの本文(JSON):

{
  "generator": {
    "description": "Translation",
    "triggerEvent": "END_OF_UTTERANCE",
    "freeFormContext": {
      "text": "Read the conversation between agent and customer, and the last utterance. Output the last utterance from customer by following these instructions:
      - If the last utterance from AGENT, output the utterance by translating it to English.
      - If the last utterance from CUSTOMER, output the utterance by translating it to French.
      - Specific brand names and technical terms specified under 'GLOSSARY' section, such as 'Google Home,' should remain unchanged as per the glossary guidelines.

# GLOSSARY
${parameter:glossary}

# CONVERSATION:
${parameter:transcript}

# LAST UTTERANCE:
${parameter:transcript_last_utterance}

# OUTPUT: "
    }
  },
  "contextReferences": {
    "glossary": {
      "contextContents": {
        "content": "east one",
        "contentFormat": "PLAIN_TEXT"
      }
    }
  },
  "conversationContext": {
    "messageEntries": [
      {
        "text": "hi",
        "languageCode": "en-US",
        "role": "END_USER",
        "createTime": {
          "seconds": "1400000000",
          "nanos": "10000000"
        }
      },
      {
        "text": "Bonjour, comment puis-je vous aider aujourd\\'hui ?",
        "languageCode": "en-US",
        "role": "HUMAN_AGENT",
        "createTime": {
          "seconds": "1400000010",
          "nanos": "10000000"
        }
      }
    ]
  },
  "triggerEvents": [
    "END_OF_UTTERANCE"
  ]
}

割り当て上限

Agent Assist の割り当てと上限は、Dialogflow の割り当てページで確認できます。独自の GenAI アシスタントには、次の割り当て上限が適用されます。

名前 説明 上限
1 分あたりのジェネレータ マネージャー オペレーション(リージョンごと) ジェネレータの作成、一覧表示、削除など、1 分間に実行できるジェネレータ マネージャー オペレーションの数の上限。 300
生成ツール(リージョンごと) 1 つのプロジェクトで作成できるジェネレータの最大数の上限。 200
モデルタイプ(リージョン)あたりの 1 分あたりの生成候補オペレーション数 モデルタイプごとに 1 分あたりに受信できる生成候補オペレーション リクエスト数の上限。 10