BIZTEL API使ってみた vol.17 コールアクション×生成AIでコールリーズンを自動分類!Salesforce連携で見える化と分析も可能に
「BIZTEL API使ってみた」シリーズでは、BIZTELがもっと便利に使えるようになる
API連携機能を活用して、サービス担当者が様々な機能の実装にチャレンジします。
前回の記事はこちら
目次
やってみたいこと
コールリーズンとは「お客さまが、なぜコールセンターに問い合わせしたのか」の理由のことです。このコールリーズンを分析することで「どういった内容の問い合わせが多いのか」などが把握でき、商品・サービスの改善につなげたり、センター運営ではFAQ改善、IVR・ACDルーティングの最適化に活かしたりすることができます。
メリットの多いコールリーズン分析ですが、こんなお悩みはありませんか?
- オペレーターの負担: 通話後の登録作業に時間がかかり、業務効率が低下している
- データのばらつき: オペレーターごとで判断基準が異なり、データに一貫性がない
- 入力漏れやミス: 業務が多忙で、入力漏れや設定ミスが発生している
- 「その他」の多発:どこに分類して良いか判断できず「その他」ばかりになっている
こうした課題を解決するため、今回はBIZTELの「API連携コールアクション」と「生成AI」を組み合わせ、コールリーズンの自動分類に挑戦します!
なお今回の挑戦では、コールリーズン分類に加え、vol.16のブログでご紹介した「カスハラの自動判定」や、問い合わせの解決状況の評価、通話内容の要約まで、まるっと自動化させる内容となっています。
コールリーズンの登録作業が大幅に削減され、顧客対応に集中できるようになることはもちろん、自動分類により一貫性の高いデータが蓄積されるため、顧客ニーズの正確な把握と業務改善への有効活用も可能になります。
コールセンター業務のさらなるDXに向けて、ぜひ一緒にチャレンジしてみましょう!
チャレンジャー
使用するツール
BIZTELの利用ライセンス
・コールセンタープランのご契約
※今回紹介するシステム連携を行うためには、BIZTELのバージョンが3.12.10以上である必要があります。
BIZTELで必要なオプション
・API連携コールアクション
・音声認識連携(AmiVoice API)
※詳細はこちらの「1.音声認識連携(AmiVoice API)」をご覧ください。
BIZTEL以外に必要なもの
・Salesforce
・OpenAI API
※OpenAI APIの使用には、従量制の料金が適用されます。
料金に関する詳細は、OpenAIのWebサイトをご覧ください。
・AmiVoice API
※AmiVoice APIの使用には、従量制の料金が適用されます。
料金に関する詳細は、AmiVoice APIのWebサイトをご覧ください。
動作の全体像

※今回の記事では「インターネット銀行のコールセンター」を例として、通話テキストの内容から、あらかじめ定義したコールリーズンに自動で分類する仕組みを構築します。
コールリーズンのサンプル(例:インターネット銀行のコールセンター)

設定の流れ
OpenAI 事前準備
OpenAI APIを利用して、お客さまとの会話の要約やコールリーズンの自動分類などを行うため、APIキーの発行します。
Salesforce 事前準備
SalesforceのAPIを利用して通話内容を記録するため、OAuth認証接続アプリケーションの作成やToDoオブジェクトの項目設定、ページレイアウト変更を行います。
BIZTEL 事前設定
お客さまとの会話をテキスト化するため、音声認識連携の設定を行います。さらに、会話の要約・コールリーズン分類・解決状況判定・カスハラ判定を行い、Salesforceに記録するため「コールアクションテンプレート機能」を利用してコールアクションを設定します。
設定の実践
OpenAI 事前準備
OpenAIのAPIキーを発行
OpenAIのアカウント作成および、OpenAI APIキー発行が必要となります。発行手順はこちらの「設定の実践 OpenAI 事前準備」をご参照ください。
Salesforce 事前準備
1. OAuth認証の接続アプリケーションを作成
こちらの「設定の実践 1.Salesforce 設定準備」を参照しながら、SalesforceのOAuth認証のアプリケーション作成と鍵情報の確認を行います。
2. 活動オブジェクトにカスタム項目を新規作成
抽出した情報を格納する項目が必要なので、以下に従って作成してください。作成方法については、こちらの「2.3 カスタム項目の作成」を参考に作成してください。
3. ToDoオブジェクトのページレイアウトを変更
以下が連携に必要な項目なので、任意のレイアウトを定義してください。

BIZTELの設定
1. 音声認識連携
お客さまの音声をテキスト化するための設定を行います。設定方法については、こちらの「2. 音声認識連携の設定方法」をご参照ください。
※別途、アドバンスト・メディア社の「AmiVoice API」 のご契約が必要です。
2. OAuthアカウント設定
BIZTELとSalesforceを連携するためのOAuth設定を行います。こちらの「設定の実践 2.BIZTELでのOAuth設定」をご参照ください。
3. コールアクション連携
通話内容の要約結果やコールリーズン分類の結果を、Salesforceに記録するコールアクションの設定を「コールアクションテンプレート機能」を利用して行います。
<コールアクション連携 手順の概要>
Ⅰ テキストエディタを利用して、コールアクションテンプレートを作成
Ⅱ BIZTEL管理画面から、コールアクションテンプレートをインポート
Ⅲ BIZTEL管理画面から、コールアクション連携を編集
OAuthアカウント設定 :4件編集
紐づけ先が特定できない時のレコードID:1件編集
OpenAI APIキー:1件編集
※合計6件修正することで設定が完了します。
Ⅳ お客さまの業務に応じて、OpenAI APIへの指示を調整
Ⅴ 連携対象とする電話番号を選択
Ⅵ コールアクションの設定を有効化
<コールアクション連携 手順の詳細>
Ⅰ コールアクションテンプレートを作成
以下のテキストをすべてコピーして、テキストエディタにペーストして保存してください。
注意事項
●ファイルはJSON形式であるため、ファイルの拡張子は「.json」にしてください。
●文字コードはUTF8で保存してください。
{
"version_name": "unknown",
"version_hash": "df34bc1",
"server_id": "f6c873a3ee5ea9a9c8891aa8596083c8b9943e21ecf8b43f9590461017c9040e",
"name": "コールリーズン自動判定対応",
"memo": "gpt-4.1-mini対応版",
"api_nodes": [
{
"api_event_type": 100,
"api_link_type": 2,
"error_response_status_code_pattern": null,
"execution_order": 1,
"max_retry_count": 3,
"oauth_account_id": null,
"precondition_pattern": null,
"precondition_target_text": null,
"request_body": null,
"request_header": null,
"request_method": "GET",
"request_url": "{OAUTH_INSTANCE_URL}/services/data/v45.0/parameterizedSearch/?q={TEL}&sobject=Account&sobject=Contact&sobject=Lead",
"response_variable_pattern": "/\"attributes\":\\{\"type\":\"(?P<TYPE>[a-zA-Z]*)\".*?\"Id\":\"(?P<NOID>[a-zA-Z0-9]*)\"/",
"result_entry_information_label": null,
"result_entry_information_text": null,
"result_entry_prompt_text": null,
"result_entry_sms_template_id": null,
"result_entry_summary_text": null,
"result_entry_tag_code": null,
"result_entry_tag_id": null,
"result_entry_tag_pattern": null,
"result_entry_type": null,
"retry_interval_milli_sec": 3000,
"timeout_num": 10,
"memo": null
},
{
"api_event_type": 5000,
"api_link_type": 1,
"error_response_status_code_pattern": null,
"execution_order": 1,
"max_retry_count": 3,
"oauth_account_id": null,
"precondition_pattern": null,
"precondition_target_text": null,
"request_body": "{\r\n \"model\": \"gpt-4.1-mini\",\r\n \"messages\": [\r\n {\r\n \"role\": \"system\",\r\n \"content\": \"**【通話テキスト分析タスク】**\\n以下の手順で、通話テキストのコールリーズン分類とカスハラ判定と解決状況判定を行ってください。\\n**## PART1: コールリーズン分類**\\n**STEP1-3: 段階的分類**\\n1. 大分類を特定\\n2. 該当する中分類を特定\\n3. 該当する小分類を特定\\n判断基準:\\n- 複数の分類にまたがる場合は、顧客の最終的な目的・ゴールを重視\\n- 会話の大部分を占める内容で判断\\n- 1つの分類のみを選択\\n- どの分類にも該当しない場合は「なし」と出力\\n**【分類体系】(要修正:業務にあわせて修正)**\\n[大分類1] 検討・情報収集[大分類2] 申し込み[大分類3] 操作方法[大分類4] 解約[中分類1-1] 条件[中分類2-1] 口座開設[中分類3-1] ログイン[中分類4-1] 解約手続き[小分類1-1-1] 利用者の年齢[小分類2-1-1] Webでの手続き[小分類3-1-1] ログイン操作[小分類4-1-1] Webでの手続き[小分類1-1-2] 店舗・口座[小分類2-1-2] 来店での手続き・持ち物[小分類3-1-2] IDが分からない[小分類4-1-2] 来店での手続き・持ち物[小分類2-1-3] 本人確認書類[小分類3-1-3] パスワードが分からない[小分類4-1-3] 郵送での手続き[中分類1-2] サービス内容[小分類3-1-4] パスワードのリセット方法[小分類1-2-1] 定期預金[中分類2-2] インターネットバンキング申し込み[小分類1-2-2] 投資信託[小分類2-2-1] Webでの手続き[中分類3-2] 定期預金[小分類1-2-3] 普通預金・振込[小分類2-2-2] 来店での手続き・持ち物[小分類3-2-1] 預金の操作方法[小分類1-2-4] 住宅ローン[小分類2-2-3] 郵送での手続き[小分類3-2-2] 中途解約の操作[小分類2-2-4] 本人確認書類[小分類3-2-3] 満期手続きの操作[小分類2-2-5] 印鑑が分からない・見つからない[小分類3-2-4] 契約内容の確認[小分類2-2-6] 通帳が分からない・見つからない[小分類3-2-5] 金利[中分類2-3] 会員証・暗証番号の発送[中分類3-3] 投資信託[小分類2-3-1] 発送方法[小分類3-3-1] 購入の操作方法[小分類2-3-2] 発送時期[小分類3-3-2] 解約の操作[小分類2-3-3] 発送状況の確認[小分類3-3-3] 償還の操作[小分類3-3-4] 契約内容の確認[小分類3-3-5] ファンドの質問(転送含む)[中分類3-4] 普通預金・振り込み[小分類3-4-1] 入出金明細の操作[小分類3-4-2] 振り込みの操作[小分類3-4-3] 振り込みの手数料[小分類3-4-4] 振り込み用の暗証番号[中分類3-5] 住宅ローン[小分類3-5-1] 残高照会[小分類3-5-2] 一部繰上返済[小分類3-5-3] 金利コース変更[小分類3-5-4] 相談(転送)[中分類3-6] 会員証・暗証番号の喪失[小分類3-6-1] 利用停止・再発行受付[小分類3-6-2] 再発行状況の確認\\n**## PART2: カスハラ・クレーム判定**\\n**## 【最優先判定ルール】**\\n1. 会話全体から[A][B]に該当する発言を探す\\n2. 該当発言があれば必ず「カスハラ」と判定\\n3. 該当発言がない場合のみ、クレームまたは通常会話と判定\\n**## [A] カスハラの定義(必要に応じてカスタマイズ)**\\n① 従業員に苦痛を与える迷惑行為\\n② 人格・尊厳を侵害し安全を損なう行為\\n**## [B] カスハラのタイプ(業界特性に応じて調整可能だが注意必要!)**\\n1. 精神的攻撃型:暴言・脅迫・人格否定\\n2. 過剰要求型:制度外の要求\\n3. 差別型:差別的発言\\n4. 身体的攻撃型:物理的危害の示唆\\n**## カスハラの明確な事例(必要に応じてカスタマイズ)**\\n### 精神的攻撃型\\n* 「あなたはバカなの?」\\n* 「無能だね」\\n* 「あなたの名前と顔を覚えておくからね」\\n* 「あなた個人に責任を取らせる」\\n### 過剰要求型\\n* 「24時間以内に対応しないと訴える」\\n* 「規約は関係ない、今すぐ特別対応しろ」\\n### 差別型\\n* 「男性スタッフに代われ」\\n* 「若い人より年配の人に代わってほしい」\\n### 身体的攻撃型\\n* 「殴るぞ」\\n* 「あなたの住所を調べるからな」\\n* 「SNSに顔写真を晒すぞ」\\n## [C] クレームの判定基準(業界特性に応じて調整可能)\\nクレームとは、製品・サービスへの不満や改善要望で、感情的表現を含むことがあっても社会通念内であり、業務内容に対する批判や問題指摘を含むものです。\\nクレームと判定する基準:\\n- 製品・サービスの具体的な問題点への言及\\n- 改善や対応を求める明確な意思表示\\n- 具体的な商品不良、不具合の指摘\\n- 交換、返品、修理などの改善要求\\n- サービスの品質に対する明確な不満表明\\n※単なる一般的な問い合わせや軽微な質問は「通常会話」とするが、実質的な不満や改善要求がある場合はクレームとして扱う\\n**## [D] 分析タスク**\\n1. 会話を判定:\\n- タイプ[B]のいずれか\\n- クレーム\\n- なし\\n2. 判定に応じて記載:\\n- カスハラ:[E]の優先順位に基づき、最も深刻な単一のタイプのみ選択\\n * 該当タイプ、発言引用、理由\\n- クレーム:発言引用、内容\\n- 通常会話:「なし」\\n3. 複数のカスハラタイプに該当する場合の判定方法:\\n- [E]の優先順位に従い、最上位の単一タイプのみを選択\\n- 例:身体的攻撃型と精神的攻撃型に該当する場合、「身体的攻撃型」のみ記載\\n**## [E] 優先順位(必要に応じて順序を調整可能)**\\n身体的攻撃型 > 精神的攻撃型 > 差別型 > 過剰要求型\\n**## PART3: 解決状況判定(必要に応じてカスタマイズ)**\\n【解決状況の判定基準】\\n通話終了時点での顧客の問題解決レベルを以下の4段階で判定してください:\\n重要:顧客が具体的な問題や困りごとを抱えている場合は「解決不要」ではありません。必ず問題解決の観点で判定してください。\\n1. 完全解決\\n- 顧客の全ての要求・問題が解決された\\n- 顧客が満足して通話を終了している\\n- 追加の対応や連絡が不要な状態\\n- 判定キーワード例:「ありがとうございました」「助かりました」「よく分かりました」「解決しました」\\n2. 一部解決\\n- 主要な問題は解決したが、軽微な課題や追加の疑問が残る\\n- 顧客は基本的に満足しているが、小さな不明点がある\\n- 判定キーワード例:「これについては分かりましたが」「もう一つ確認したいことが」「基本的には理解できました」\\n3. 未解決\\n- 顧客の主要な問題が解決されていない\\n- 具体的な解決策や対応方法が提示されていない\\n- 問題を抱えたまま通話が終了している\\n- 判定キーワード例:「まだよく分からない」「解決していない」「また連絡します」「どうすればいいですか」\\n- ※顧客が困りごとを相談したが解決策が提示されない場合も「未解決」\\n4. 解決不要\\n- そもそも解決すべき問題や困りごとがない\\n- 単純な情報確認や現状照会のみの通話\\n- 顧客に困りごとがなく、確認事項に対して適切に回答済み\\n- 判定キーワード例:「確認できました」「情報をいただきありがとうございます」「現在の状況が分かりました」\\n- ※重要:顧客が「〜が分からない」「〜できない」等の問題を抱えている場合は「解決不要」ではない\\n**## 出力フォーマット(必要に応じて調整可能だが注意必要!)**\\n【解決状況】:完全解決/一部解決/未解決/解決不要\\n【解決状況の根拠】:[判定理由と該当する顧客発言を簡潔に説明]\\n大分類: [番号] - [選択した大分類]\\n中分類: [番号] - [選択した中分類]\\n小分類: [番号] - [選択した小分類]\\n理由: [判断根拠を簡潔に説明]\\n【カスハラ判定結果】:[精神的攻撃型/過剰要求型/差別型/身体的攻撃型/クレーム/なし]\\n【該当発言】:[カスハラまたはクレームの場合は発言引用、なしの場合は「なし」]\\n【要約結果】:\\n・~~~~\\n・~~~~\\n・~~~~\\n**## 重要な出力ルール(必要に応じてカスタマイズ)**\\n- 要約結果は500文字以内で記載する\\n- 【カスハラ判定結果】にはタイプ名のみを記載(「カスハラ・」は付けない)\\n- カスハラの場合は「精神的攻撃型」「過剰要求型」「差別型」「身体的攻撃型」のいずれか1つのみ\\n- 【カスハラ判定結果】の直後に【該当発言】を記載\\n- 【該当発言】と【要約結果】の間に余計な説明や空行を入れない\\n- クレームの場合、【該当発言】には発言引用のみを記載し、理由説明は含めない\\n- カスハラの場合、【該当発言】には「発言引用:\\\"~\\\" 理由:~ 重度レベル:○○」の形式で記載\"\r\n },\r\n {\r\n \"role\": \"user\",\r\n \"content\": \"{VOICE_LOG.JSON_ESCAPE()}\"\r\n }\r\n ],\r\n \"max_tokens\": 700,\r\n \"temperature\": 0.7\r\n}",
"request_header": "Authorization:Bearer XXXXXXXX\r\nContent-Type:application/json",
"request_method": "POST",
"request_url": "https://api.openai.com/v1/chat/completions",
"response_variable_pattern": "/【解決状況】:\\s*(?P<RESOLUTION_STATUS>[^\\n]+)\\s*【解決状況の根拠】:\\s*(?P<RESOLUTION_REASON>[\\s\\S]*?)大分類:\\s*(?P<DAI_FULL>[^\\n]+)\\s*中分類:\\s*(?P<CHU_FULL>[^\\n]+)\\s*小分類:\\s*(?P<SHO_FULL>[^\\n]+)\\s*理由:\\s*(?P<CATEGORY_REASON>[\\s\\S]*?)【カスハラ判定結果】:\\s*(?P<HARASSMENT>[^\\n]+)\\s*【該当発言】:\\s*(?P<HARASSMENT_DETAIL>[\\s\\S]*?)【要約結果】:\\s*(?P<SUMMARY>[\\s\\S]*?)(?=,\"refusal\":null,\"annotations\":\\[\\]}|\")/",
"result_entry_information_label": null,
"result_entry_information_text": null,
"result_entry_prompt_text": null,
"result_entry_sms_template_id": null,
"result_entry_summary_text": null,
"result_entry_tag_code": null,
"result_entry_tag_id": null,
"result_entry_tag_pattern": null,
"result_entry_type": null,
"retry_interval_milli_sec": 3000,
"timeout_num": 60,
"memo": null
},
{
"api_event_type": 5000,
"api_link_type": 2,
"error_response_status_code_pattern": null,
"execution_order": 2,
"max_retry_count": 3,
"oauth_account_id": null,
"precondition_pattern": "/Contact|Lead/",
"precondition_target_text": "{RESPONSE_TYPE}",
"request_body": "{\r\n \"WhoId\": \"{RESPONSE_NOID}\",\r\n \"Subject\": \"{STARTTIME}に通話(着信)\",\r\n \"Description\": \"{VOICE_LOG.JSON_ESCAPE()}\\r\\n------------\\r\\n【解決状況】:{RESPONSE_RESOLUTION_STATUS}\\r\\n【解決状況の根拠】:{RESPONSE_RESOLUTION_REASON}\\r\\n------------\\r\\n【コールリーズン大分類】:{RESPONSE_DAI_FULL}\\r\\n【コールリーズン中分類】:{RESPONSE_CHU_FULL}\\r\\n【コールリーズン小分類】:{RESPONSE_SHO_FULL}\\r\\n【分類理由】:{RESPONSE_CATEGORY_REASON}\\r\\n------------\\r\\n【カスハラ判定結果】:{RESPONSE_HARASSMENT}\\r\\n【該当発言・理由】:{RESPONSE_HARASSMENT_DETAIL}\\r\\n------------\\r\\n【要約結果】:{RESPONSE_SUMMARY}\",\r\n \"CallDisposition\": \"■発信電話番号:{TEL}■着信電話番号:{CALLED}■着信アカウント名:{AGENT_NAME}\\\\r\\\\n■着信内線番号:{AGENT_EXTEN_NO}■通話開始時間:{START_TIME}\\\\r\\\\n■通話終了時間:{END_TIME}\\\\r\\\\n■通話時間:{CALL_SEC}\",\r\n \"Resolution_Level__c\": \"{RESPONSE_RESOLUTION_STATUS}\",\r\n \"Call_Reason_Large__c\": \"{RESPONSE_DAI_FULL}\",\r\n \"Call_Reason_Medium__c\": \"{RESPONSE_CHU_FULL}\",\r\n \"Call_Reason_Small__c\": \"{RESPONSE_SHO_FULL}\",\r\n \"Conversation_Category__c\": \"{RESPONSE_HARASSMENT}\",\r\n \"WavUrl__c\": \"https://{HOST}:8000/monitor_link/{ID}\"\r\n}",
"request_header": "Content-Type: application/json",
"request_method": "POST",
"request_url": "{OAUTH_INSTANCE_URL}/services/data/v45.0/sobjects/Task/",
"response_variable_pattern": null,
"result_entry_information_label": null,
"result_entry_information_text": null,
"result_entry_prompt_text": null,
"result_entry_sms_template_id": null,
"result_entry_summary_text": null,
"result_entry_tag_code": null,
"result_entry_tag_id": null,
"result_entry_tag_pattern": null,
"result_entry_type": null,
"retry_interval_milli_sec": 3000,
"timeout_num": 10,
"memo": null
},
{
"api_event_type": 5000,
"api_link_type": 2,
"error_response_status_code_pattern": null,
"execution_order": 3,
"max_retry_count": 3,
"oauth_account_id": null,
"precondition_pattern": "/Account/",
"precondition_target_text": "{RESPONSE_TYPE}",
"request_body": "{\r\n\t\"WhatId\": \"{RESPONSE_NOID}\",\r\n\t\"Subject\": \"{STARTTIME}に通話(着信)\",\r\n\t\"Description\": \"{VOICE_LOG.JSON_ESCAPE()}\\r\\n------------\\r\\n【解決状況】:{RESPONSE_RESOLUTION_STATUS}\\r\\n【解決状況の根拠】:{RESPONSE_RESOLUTION_REASON}\\r\\n------------\\r\\n【コールリーズン大分類】:{RESPONSE_DAI_FULL}\\r\\n【コールリーズン中分類】:{RESPONSE_CHU_FULL}\\r\\n【コールリーズン小分類】:{RESPONSE_SHO_FULL}\\r\\n【分類理由】:{RESPONSE_CATEGORY_REASON}\\r\\n------------\\r\\n【カスハラ判定結果】:{RESPONSE_HARASSMENT}\\r\\n【該当発言・理由】:{RESPONSE_HARASSMENT_DETAIL}\\r\\n------------\\r\\n【要約結果】:{RESPONSE_SUMMARY}\",\r\n\t\"CallDisposition\": \"■発信電話番号:{TEL}■着信電話番号:{CALLED}■着信アカウント名:{AGENT_NAME}\\\\r\\\\n■着信内線番号:{AGENT_EXTEN_NO}■通話開始時間:{START_TIME}\\\\r\\\\n■通話終了時間:{END_TIME}\\\\r\\\\n■通話時間:{CALL_SEC}\",\r\n\t\"Resolution_Level__c\": \"{RESPONSE_RESOLUTION_STATUS}\",\r\n\t\"Call_Reason_Large__c\": \"{RESPONSE_DAI_FULL}\",\r\n\t\"Call_Reason_Medium__c\": \"{RESPONSE_CHU_FULL}\",\r\n\t\"Call_Reason_Small__c\": \"{RESPONSE_SHO_FULL}\",\r\n\t\"Conversation_Category__c\": \"{RESPONSE_HARASSMENT}\",\r\n\t\"WavUrl__c\": \"https://{HOST}:8000/monitor_link/{ID}\"\r\n}",
"request_header": "Content-Type: application/json",
"request_method": "POST",
"request_url": "{OAUTH_INSTANCE_URL}/services/data/v45.0/sobjects/Task/",
"response_variable_pattern": null,
"result_entry_information_label": null,
"result_entry_information_text": null,
"result_entry_prompt_text": null,
"result_entry_sms_template_id": null,
"result_entry_summary_text": null,
"result_entry_tag_code": null,
"result_entry_tag_id": null,
"result_entry_tag_pattern": null,
"result_entry_type": null,
"retry_interval_milli_sec": 3000,
"timeout_num": 10,
"memo": null
},
{
"api_event_type": 5000,
"api_link_type": 2,
"error_response_status_code_pattern": null,
"execution_order": 4,
"max_retry_count": 3,
"oauth_account_id": null,
"precondition_pattern": "/^(?!.*(Contact|Lead|Account)).*$/",
"precondition_target_text": "{RESPONSE_TYPE}",
"request_body": "{\r\n\t\"WhoId\": \"XXXXXXXX\",\r\n\t\"Subject\": \"{STARTTIME}に通話(着信)\",\r\n\t\"Description\": \"{VOICE_LOG.JSON_ESCAPE()}\\r\\n------------\\r\\n【解決状況】:{RESPONSE_RESOLUTION_STATUS}\\r\\n【解決状況の根拠】:{RESPONSE_RESOLUTION_REASON}\\r\\n------------\\r\\n【コールリーズン大分類】:{RESPONSE_DAI_FULL}\\r\\n【コールリーズン中分類】:{RESPONSE_CHU_FULL}\\r\\n【コールリーズン小分類】:{RESPONSE_SHO_FULL}\\r\\n【分類理由】:{RESPONSE_CATEGORY_REASON}\\r\\n------------\\r\\n【カスハラ判定結果】:{RESPONSE_HARASSMENT}\\r\\n【該当発言・理由】:{RESPONSE_HARASSMENT_DETAIL}\\r\\n------------\\r\\n【要約結果】:{RESPONSE_SUMMARY}\",\r\n\t\"CallDisposition\": \"■発信電話番号:{TEL}■着信電話番号:{CALLED}■着信アカウント名:{AGENT_NAME}\\\\r\\\\n■着信内線番号:{AGENT_EXTEN_NO}■通話開始時間:{START_TIME}\\\\r\\\\n■通話終了時間:{END_TIME}\\\\r\\\\n■通話時間:{CALL_SEC}\",\r\n\t\"Resolution_Level__c\": \"{RESPONSE_RESOLUTION_STATUS}\",\r\n\t\"Call_Reason_Large__c\": \"{RESPONSE_DAI_FULL}\",\r\n\t\"Call_Reason_Medium__c\": \"{RESPONSE_CHU_FULL}\",\r\n\t\"Call_Reason_Small__c\": \"{RESPONSE_SHO_FULL}\",\r\n\t\"Conversation_Category__c\": \"{RESPONSE_HARASSMENT}\",\r\n\t\"WavUrl__c\": \"https://{HOST}:8000/monitor_link/{ID}\"\r\n}",
"request_header": "Content-Type: application/json",
"request_method": "POST",
"request_url": "{OAUTH_INSTANCE_URL}/services/data/v45.0/sobjects/Task/",
"response_variable_pattern": null,
"result_entry_information_label": null,
"result_entry_information_text": null,
"result_entry_prompt_text": null,
"result_entry_sms_template_id": null,
"result_entry_summary_text": null,
"result_entry_tag_code": null,
"result_entry_tag_id": null,
"result_entry_tag_pattern": null,
"result_entry_type": null,
"retry_interval_milli_sec": 3000,
"timeout_num": 10,
"memo": null
}
]
}
Ⅱ コールアクションテンプレートをインポート
BIZTEL管理画面より「連携オプション>コールアクション連携」をクリックして、画面右上の「インポート」をクリックします。詳細はこちらの「6.2 コールアクションのインポート」をご参照ください。
Ⅲ コールアクション連携を編集
作成されたコールアクション連携の「API連携」タブをクリックしてください。各設定情報を編集していきます。
【必須で修正する箇所(合計6件)】
・!マークが出ている設定は、OAuthアカウントが未設定のため、「BIZTELの設定 2. OAuthアカウント設定」で登録したSalesforce用のOAuthアカウントを選択します(計4件)。
・以下のイベントURL内「XXXXXXXX」で表示されている箇所は、適切な値に書き換えます(計2件)。
<録音完了/音声認識連携完了>実行順1:OpenAI APIキー
<録音完了/音声認識連携完了>実行順4:紐づけ先が特定できない時のレコードID
(録音完了/音声認識連携完了イベント 実行順1:OpenAI APIキー設定例)

(録音完了/音声認識連携完了イベント 実行順4:レコードID設定例)
下の画像の赤線部分には、発信番号から履歴を紐づけるレコードが特定できなかった場合にデータの受け渡し先となる、リードのレコードIDを記載します。

※レコードIDの確認方法(以下の赤線部分がレコードIDです)

Ⅳ お客さまの業務に応じて、OpenAI APIへの指示を調整
<録音完了/音声認識連携完了>実行順1にて、OpenAI APIへ要約や各種判定の指示をしているので、業務にあわせて修正してください。
なお、本プロンプトのコールリーズン事例・カスハラ事例・判断基準などはあくまでも参考情報としてご活用ください。
▼OpenAI APIへの指示内容(APIリクエストボディのcontentを整形して表示したもの)
【通話テキスト分析タスク】
以下の手順で、通話テキストのコールリーズン分類とカスハラ判定と解決状況判定を行ってください。
## PART1: コールリーズン分類
STEP1-3: 段階的分類
- 大分類を特定
- 該当する中分類を特定
- 該当する小分類を特定
判断基準:
– 複数の分類にまたがる場合は、顧客の最終的な目的・ゴールを重視
– 会話の大部分を占める内容で判断
– 1つの分類のみを選択
– どの分類にも該当しない場合は「なし」と出力
【分類体系】(要修正:業務にあわせて修正)
[大分類1] 検討・情報収集[大分類2] 申し込み[大分類3] 操作方法[大分類4] 解約[中分類1-1] 条件[中分類2-1] 口座開設[中分類3-1] ログイン[中分類4-1] 解約手続き[小分類1-1-1] 利用者の年齢[小分類2-1-1] Webでの手続き[小分類3-1-1] ログイン操作[小分類4-1-1] Webでの手続き[小分類1-1-2] 店舗・口座[小分類2-1-2] 来店での手続き・持ち物[小分類3-1-2] IDが分からない[小分類4-1-2] 来店での手続き・持ち物[小分類2-1-3] 本人確認書類[小分類3-1-3] パスワードが分からない[小分類4-1-3] 郵送での手続き[中分類1-2] サービス内容[小分類3-1-4] パスワードのリセット方法[小分類1-2-1] 定期預金[中分類2-2] インターネットバンキング申し込み[小分類1-2-2] 投資信託[小分類2-2-1] Webでの手続き[中分類3-2] 定期預金[小分類1-2-3] 普通預金・振込[小分類2-2-2] 来店での手続き・持ち物[小分類3-2-1] 預金の操作方法[小分類1-2-4] 住宅ローン[小分類2-2-3] 郵送での手続き[小分類3-2-2] 中途解約の操作[小分類2-2-4] 本人確認書類[小分類3-2-3] 満期手続きの操作[小分類2-2-5] 印鑑が分からない・見つからない[小分類3-2-4] 契約内容の確認[小分類2-2-6] 通帳が分からない・見つからない[小分類3-2-5] 金利[中分類2-3] 会員証・暗証番号の発送[中分類3-3] 投資信託[小分類2-3-1] 発送方法[小分類3-3-1] 購入の操作方法[小分類2-3-2] 発送時期[小分類3-3-2] 解約の操作[小分類2-3-3] 発送状況の確認[小分類3-3-3] 償還の操作[小分類3-3-4] 契約内容の確認[小分類3-3-5] ファンドの質問(転送含む)[中分類3-4] 普通預金・振り込み[小分類3-4-1] 入出金明細の操作[小分類3-4-2] 振り込みの操作[小分類3-4-3] 振り込みの手数料[小分類3-4-4] 振り込み用の暗証番号[中分類3-5] 住宅ローン[小分類3-5-1] 残高照会[小分類3-5-2] 一部繰上返済[小分類3-5-3] 金利コース変更[小分類3-5-4] 相談(転送)[中分類3-6] 会員証・暗証番号の喪失[小分類3-6-1] 利用停止・再発行受付[小分類3-6-2] 再発行状況の確認
## PART2: カスハラ・クレーム判定
## 【最優先判定ルール】
- 会話全体から[A][B]に該当する発言を探す
- 該当発言があれば必ず「カスハラ」と判定
- 該当発言がない場合のみ、クレームまたは通常会話と判定
## [A] カスハラの定義(必要に応じてカスタマイズ)
① 従業員に苦痛を与える迷惑行為
② 人格・尊厳を侵害し安全を損なう行為
## [B] カスハラのタイプ ※業界特性に応じて調整可能ですが、この指示内容(白枠内部分)の下に記載の「注意」が必要!
- 精神的攻撃型:暴言・脅迫・人格否定
- 過剰要求型:制度外の要求
- 差別型:差別的発言
- 身体的攻撃型:物理的危害の示唆
## カスハラの明確な事例(必要に応じてカスタマイズ)
### 精神的攻撃型
* 「あなたはバカなの?」
* 「無能だね」
* 「あなたの名前と顔を覚えておくからね」
* 「あなた個人に責任を取らせる」
### 過剰要求型
* 「24時間以内に対応しないと訴える」
* 「規約は関係ない、今すぐ特別対応しろ」
### 差別型
* 「男性スタッフに代われ」
* 「若い人より年配の人に代わってほしい」
### 身体的攻撃型
* 「殴るぞ」
* 「あなたの住所を調べるからな」
* 「SNSに顔写真を晒すぞ」
## [C] クレームの判定基準(業界特性に応じて調整可能)
クレームとは、製品・サービスへの不満や改善要望で、感情的表現を含むことがあっても社会通念内であり、業務内容に対する批判や問題指摘を含むものです。
クレームと判定する基準:
– 製品・サービスの具体的な問題点への言及
– 改善や対応を求める明確な意思表示
– 具体的な商品不良、不具合の指摘
– 交換、返品、修理などの改善要求
– サービスの品質に対する明確な不満表明
※単なる一般的な問い合わせや軽微な質問は「通常会話」とするが、実質的な不満や改善要求がある場合はクレームとして扱う
## [D] 分析タスク
- 会話を判定:
– タイプ[B]のいずれか
– クレーム
– なし
- 判定に応じて記載:
– カスハラ:[E]の優先順位に基づき、最も深刻な単一のタイプのみ選択
* 該当タイプ、発言引用、理由
– クレーム:発言引用、内容
– 通常会話:「なし」
- 複数のカスハラタイプに該当する場合の判定方法:
– [E]の優先順位に従い、最上位の単一タイプのみを選択
– 例:身体的攻撃型と精神的攻撃型に該当する場合、「身体的攻撃型」のみ記載
## [E] 優先順位(必要に応じて順序を調整可能)
身体的攻撃型 > 精神的攻撃型 > 差別型 > 過剰要求型
## PART3: 解決状況判定(必要に応じてカスタマイズ)
【解決状況の判定基準】
通話終了時点での顧客の問題解決レベルを以下の4段階で判定してください:
重要:顧客が具体的な問題や困りごとを抱えている場合は「解決不要」ではありません。必ず問題解決の観点で判定してください。
- 完全解決
– 顧客の全ての要求・問題が解決された
– 顧客が満足して通話を終了している
– 追加の対応や連絡が不要な状態
– 判定キーワード例:「ありがとうございました」「助かりました」「よく分かりました」「解決しました」
- 一部解決
– 主要な問題は解決したが、軽微な課題や追加の疑問が残る
– 顧客は基本的に満足しているが、小さな不明点がある
– 判定キーワード例:「これについては分かりましたが」「もう一つ確認したいことが」「基本的には理解できました」
- 未解決
– 顧客の主要な問題が解決されていない
– 具体的な解決策や対応方法が提示されていない
– 問題を抱えたまま通話が終了している
– 判定キーワード例:「まだよく分からない」「解決していない」「また連絡します」「どうすればいいですか」
– ※顧客が困りごとを相談したが解決策が提示されない場合も「未解決」
- 解決不要
– そもそも解決すべき問題や困りごとがない
– 単純な情報確認や現状照会のみの通話
– 顧客に困りごとがなく、確認事項に対して適切に回答済み
– 判定キーワード例:「確認できました」「情報をいただきありがとうございます」「現在の状況が分かりました」
– ※重要:顧客が「〜が分からない」「〜できない」等の問題を抱えている場合は「解決不要」ではない
## 出力フォーマット ※必要に応じて調整可能ですが、この指示内容(白枠内部分)の下に記載の「注意」が必要!
【解決状況】:完全解決/一部解決/未解決/解決不要
【解決状況の根拠】:[判定理由と該当する顧客発言を簡潔に説明]
大分類: [番号] – [選択した大分類]
中分類: [番号] – [選択した中分類]
小分類: [番号] – [選択した小分類]
理由: [判断根拠を簡潔に説明]
【カスハラ判定結果】:[精神的攻撃型/過剰要求型/差別型/身体的攻撃型/クレーム/なし]
【該当発言】:[カスハラまたはクレームの場合は発言引用、なしの場合は「なし」]
【要約結果】:
・~~~~
・~~~~
・~~~~
## 重要な出力ルール(必要に応じてカスタマイズ)
– 要約結果は500文字以内で記載する
– 【カスハラ判定結果】にはタイプ名のみを記載(「カスハラ・」は付けない)
– カスハラの場合は「精神的攻撃型」「過剰要求型」「差別型」「身体的攻撃型」のいずれか1つのみ
– 【カスハラ判定結果】の直後に【該当発言】を記載
– 【該当発言】と【要約結果】の間に余計な説明や空行を入れない
– クレームの場合、【該当発言】には発言引用のみを記載し、理由説明は含めない
– カスハラの場合、【該当発言】には「発言引用:”~” 理由:~ 重度レベル:○○」の形式で記載
※プロンプト指示を変更する際の注意点※
- コールリーズン分類の【分類体系】の内容を更新する場合
- 上述の『Salesforce事前準備 2.活動オブジェクトにカスタム項目を新規作成』で作成した、「コールリーズン大分類」「コールリーズン中分類」「コールリーズン小分類」の設定値もあわせて変更してください。
- [B]のカスハラタイプ内容を更新する場合
- 上述の『Salesforce事前準備 2.活動オブジェクトにカスタム項目を新規作成』で作成した、「カスハラ/クレーム判定」の設定値もあわせて変更してください。
- 出力フォーマットを更新する場合
- 変数抽出パターンの正規表現も変更する必要がありますのでご注意ください。
上記のプロンプト指示をAPIのリクエストボディにそのまま貼り付けるとJSONエラーが発生します。APIで使用する場合は、改行や特殊文字はエスケープ処理が必要です。手動で処理するのは大変なので、生成AIにプロンプト指示の文字列を渡して「APIに情報を渡したいので、JSONエラーにならないようにエスケープ処理してください」というとエスケープ済みの文字列を表示してくれます。
Ⅴ 連携対象とする電話番号を選択
「連携対象」タブをクリックして、連携対象とする電話番号に✓を設定してください。
Ⅵ コールアクションの設定を有効化
「基本情報」タブをクリックして、ステータス項目を無効から有効に変更してください。
連携結果
Salesforceに通話内容を連携した結果、このようになりました。
振り返り・まとめ
今回の挑戦により、通話テキストと生成AIを最大限に活かし、適切なプロンプトを設計することで、高い精度でコールリーズンを自動分類できることがわかりました!
サンプルに基づき動作確認をした後は、ぜひ皆さまの現場の状況に合わせてプロンプトをカスタマイズし、さらに実用的なものに仕上げていただければと思います。また、Salesforceのダッシュボードやレポート機能から、コールリーズン・解決状況・カスハラ(またはクレーム)の発生有無といった情報を組み合わせて多角的に分析できるようになります。
例えば、今回のコールリーズンの分類体系であれば、
- 未解決が多い問い合わせ
(例:「ログイン操作」に関する問い合わせの解決率が低い など) - クレームが発生しやすい問い合わせ
(例:「定期預金の相談」でクレームが発生しやすい など)
といったことが把握でき、効果的な対策を講じるための情報として活用できます。
本記事が、働きやすい職場づくりと顧客満足度の両立に役立ちますと、とても嬉しいです!
編集後記
今回は、「生成AI」とBIZTELの「API連携コールアクション」「音声認識連携」機能を活用して、通話内容からコールリーズンを自動分類するとともに、問い合わせの解決状況やカスハラ発生の有無について判定を行い、Salesforceへ連携する仕組みを実践しました。
「BIZTEL API使ってみた」シリーズでは、BIZTELの利用者が実際に思いついた業務改善のアイデアをもとに、今後も様々な機能を紹介する予定です。
簡単に実現できるよう、設定方法も交えながらお伝えしますので、読者のみなさまもぜひチャレンジしてみてください。
現在、BIZTELをご利用中のお客さまも、「こんなことがしたい」というご希望がございましたら、BIZTELサービス担当までご相談ください!


























