AI News HubLIVE
サイト内リライト6 分で読了

TelnyxでAI電話エージェントとのリアルタイム交渉ロールプレイ

Telnyx Call ControlとAI Inferenceを使って構築された、110行のPythonアプリでAIと交渉練習ができる電話番号の作り方を紹介。給与交渉、営業案件、ベンダー契約の3つのシナリオを用意し、音声駆動の会話後、5つの次元で構造化されたスコアを提供する。セットアップ、コード解説、カスタマイズ、本番運用までカバー。

ソースHacker News AI著者: harpreetseehra

電話を手に取り、番号をダイヤルすると、AIが面接官役を演じて給与交渉の練習ができる——最初のオファーに反論し、予算制約でカウンターを出し、通話終了後にあなたのテクニックを採点する。模擬面接の予約も、コーチへの支払いも、同僚との気まずいロールプレイも不要です。

これがAI交渉練習電話です——Telnyx Call ControlとAI Inferenceで構築された110行のPythonアプリ。3つのシナリオ(給与、営業案件、ベンダー契約)を用意し、音声駆動の会話と、通話終了ごとに構造化されたパフォーマンススコアを提供します。AIは役割を守り、あなたのアプローチに適応し、実践可能なフィードバックを与えます。

このチュートリアルでは、ゼロからアプリを構築します。リポジトリをクローンし、電話番号を設定すれば、数分で練習を始められます。

構築するもの

誰でも電話をかけて交渉練習ができる電話番号:

  • 発信者がダイヤルすると、Telnyxが応答してメニューを提供
  • シナリオ選択:1で給与交渉、2で営業案件、3でベンダー契約
  • AIが相手役(採用マネージャー、企業バイヤー、ベンダーアカウントマネージャー)を演じ、オープニングポジションを提示
  • ライブ交渉:発信者は自然に話し、AIは役割を保ちながら応答、反論、カウンター、適応
  • 通話後スコアリング:AIが5つの次元で交渉を評価し、構造化JSONを返す
  • セッション履歴:すべての練習セッションが保存され、GET /sessionsでアクセス可能

対話全体は音声駆動:テキスト読み上げでAIのセリフを読み上げ、発信者は自然な音声で応答します。モデル(Telnyx AI Inference経由のLlama 3.3 70B)は、リアルタイムのロールプレイと通話後の評価の両方を処理します。

なぜ面白いのか

ほとんどの交渉トレーニングツールはテキストベースのチャットボットか静的なビデオコースです。どちらも実際の会話のプレッシャー——間、反論、即座に考えなければならない瞬間——を捉えられません。このツールは、予算、役割、隠された制約(「最大15%割引」や「予算は15万5000ドル、16万5000ドルまで柔軟に対応可能」など)を持つAIとの実際の電話会話にあなたを置きます。

スコアリングシステムにより、単なる会話以上のものになります。通話終了後、AIはアンカリング、譲歩戦略、積極的傾聴、創造性、自信の5次元に加え、総合スコアと具体的な強み・改善点を評価します。同じシナリオを5回練習し、テクニックが向上したかどうかを追跡できます。

また、DTMF+音声パターンも実演しています:アプリはシナリオ選択にDTMF(キーパッド入力)を、交渉自体に音声認識を使用します。この2入力パターンは、多くの実際のIVRワークフローで見られます。

前提条件

  • Python 3.8+
  • 残高のあるTelnyxアカウント
  • Telnyx APIキー
  • 音声有効のTelnyx電話番号
  • Webhook URLを設定したCall Control Application
  • ngrok(ローカルサーバーをTelnyx webhookに公開するため)

アーキテクチャ

電話着信 → Telnyx Call Control(webhookイベント)→ Flaskアプリ(app.py、110行)→ 各種イベント処理(応答、DTMF収集、音声対話、通話終了スコアリング)→ Telnyx AI Inference(Llama 3.3 70B)→ スコアJSON

アプリはステートマシンで、選択(DTMFメニュー)と交渉(音声会話)の2つのフェーズがあります。各Telnyx webhookイベントが次のアクションを駆動します。通話終了後、完全な会話がスコアリングプロンプトとともにAIに送信され、構造化JSONが返されます。

ステップ1:クローンと設定

git clone https://github.com/team-telnyx/telnyx-code-examples.git
cd telnyx-code-examples/ai-negotiation-practice-phone-python
cp .env.example .env
pip install -r requirements.txt

.envファイルを編集し、認証情報を入力:

  • TELNYX_API_KEY
  • TELNYX_PUBLIC_KEY
  • AI_MODEL(デフォルトmeta-llama/Llama-3.3-70B-Instruct)
  • PRACTICE_NUMBER(あなたのTelnyx番号)

ステップ2:コードを理解する

すべてのコードはapp.py(110行)にあります。各部分の機能は以下の通りです。

シナリオ

アプリには3つの組み込み交渉シナリオがあり、それぞれに役割と隠されたコンテキストがあります:

  • シナリオ1:採用マネージャー、予算15万5000ドル、16万5000ドルまで柔軟対応可能
  • シナリオ2:企業バイヤー、競合オファー3万5000ドル、予算4万5000ドル
  • シナリオ3:ベンダーアカウントマネージャー、クライアントが契約40%削減を要求、最大15%割引

コンテキストはシステムプロンプトに注入され、AIは制約を認識しますが、発信者は知りません。会話を通じて相手側の予算や柔軟性を発見します。

ステートマシン:選択 → 交渉

Webhookハンドラーには2つの状態があります。選択状態では、シナリオ選択のためにDTMF数字を収集します:

if call["state"] == "select":
    client.calls.actions.gather(ccid, input_type="dtmf", timeout_secs=10, min_digits=1, max_digits=1)

発信者が1、2、または3を押すと、アプリはシナリオを読み込み、システムプロンプトを構築し、AIにオープニングラインを生成させ、交渉状態に移行します:

if call["state"] == "select":
    scenario = SCENARIOS.get(digits, SCENARIOS["1"])
    call["state"] = "negotiating"
    call["scenario"] = scenario
    call["conversation"] = [{"role": "system", "content": f"You are a {scenario['role']} in a negotiation. {scenario['context']} Stay in character. Be firm but fair. Push back on their first offer. Keep responses under 2 sentences. After 6 exchanges, start wrapping up."}]
    opening = call_inference(call["conversation"] + [{"role": "user", "content": "The negotiation begins. Make your opening position."}])
    call["conversation"].append({"role": "assistant", "content": opening})
    client.calls.actions.speak(ccid, payload=opening, voice="female", language_code="en-US")

交渉状態では、音声を収集し、会話ループを実行します:speak → gather → infer → speak。各ターンでAIは完全な会話履歴を参照するため、コンテキストを維持し、あなたのオファーを記憶します。

推論ヘルパー

def call_inference(messages, max_tokens=200):
    resp = requests.post(INFERENCE_URL, headers={"Authorization": f"Bearer {TELNYX_API_KEY}", "Content-Type": "application/json"},
                         json={"model": AI_MODEL, "messages": messages, "max_tokens": max_tokens, "temperature": 0.7}, timeout=15)
    resp.raise_for_status()
    return resp.json()["choices"][0]["message"]["content"]

OpenAI互換のチャット補完呼び出しでTelnyx AI Inferenceを使用。温度は0.7で、価格見積もりエージェント(0.5)より高く設定されており、交渉相手をより創造的で予測不可能にするためです。

通話後スコアリング

発信者が通話を切ると、アプリは完全な会話をスコアリングプロンプトとともにAIに送信します:

elif event_type == "call.hangup":
    call = active_calls.pop(ccid, None)
    if call and len(call.get("conversation", [])) > 3:
        score_prompt = [{"role": "system", "content": "Score this negotiation practice. Return JSON: anchoring (1-10), concession_strategy (1-10), active_listening (1-10), creativity (1-10), confidence (1-10), overall (1-10), strengths (list), improvements (list), deal_outcome (string)."},
                        {"role": "user", "content": "\n".join(f"{m['role']}: {m['content']}" for m in call["conversation"] if m["role"] != "system")}]
        try:
            score = json.loads(call_inference(score_prompt, max_tokens=400))
            sessions.append({"scenario": call.get("scenario", {}).get("role"), "score": score, "duration": int(time.time() - call["start"])})
        except Exception:
            pass

AIは5つの次元、強みリスト、改善点リスト、取引結果を含む構造化スコアを返します。アプリはそれをシナリオと通話時間とともに保存します。

セッションへのアクセス

@app.route("/sessions", methods=["GET"])
def list_sessions():
    return jsonify({"sessions": sessions[-20:]}), 200

GET /sessionsにアクセスすると、最近20回の練習セッションがJSONで表示されます——進捗の追跡、シナリオの比較、分析ダッシュボードへの取り込みが可能です。

メモリクリーンアップ

アプリには、期限切れの通話状態を定期的にクリーンアップするバックグラウンドスレッドが含まれています(デフォルト1時間)。

ステップ3:アプリの実行

python app.py

別のターミナルでngrokを起動:ngrok http 5000。ngrokのHTTPS URL(例:https://abc123.ngrok.app/webhooks/voice)をTelnyx Call Control ApplicationのWebhook URLに設定し、Telnyx電話番号をそのアプリケーションに割り当てます。

ステップ4:電話をかけて練習

任意の電話からTelnyx番号に電話します。次の音声が聞こえます:「交渉練習へようこそ!給与交渉は1、営業案件は2、ベンダー契約は3を押してください。」

1を押します。AI(採用マネージャー役)が次のように話し始めます:「お電話ありがとうございます。あなたの経歴を確認しましたが、正直に申し上げると、このレベルの候補者には通常15万5000ドルを提示しています。18万ドルをご希望とのことですが、経験の差を考えると、その範囲を正当化できるかどうかわかりません。プレミアムに見合う価値は何でしょうか?」

交渉を始めましょう。反論し、自分の主張を述べてください。AIはカウンターを出し、制約を持ち出し、最終的に合意に至るか、譲らないかのどちらかです。

通話終了後、スコアを確認してください:curl http://localhost:5000/sessions | python3 -m json.tool。次のような構造化スコアオブジェクトが表示されます:

{
  "scenario": "hiring manager",
  "score": {
    "anchoring": 7,
    "concession_strategy": 5,
    "active_listening": 8,
    "creativity": 6,
    "confidence": 7,
    "overall": 6.6,
    "strengths": ["18万ドルでの強力なオープニングアンカー", "基本給以外の選択肢として株式を尋ねたこと"],
    "improvements": ["基本給を早急に譲歩したこと", "契約ボーナスのオプションを探らなかったこと"],
    "deal_outcome": "基本給16万2000ドル+契約ボーナス1万ドルで合意"
  },
  "duration": 184
}

シナリオのカスタマイズ

SCENARIOS辞書が制御面です。小さな変更で大きく異なる練習セッションを作成できます:

  • 不動産交渉シナリオを追加
  • AIをより攻撃的にする
  • 複数ラウンドのスコアリングとトレンド追跡を追加
  • 通話後にSMSでスコアを送信

本番運用に向けて

この例では簡略化のためメモリストレージを使用しています。本番デプロイでは以下を検討してください:

  • データベース(PostgreSQLなど)でメモリリストを置き換え
  • より堅牢なエラーハンドリング
  • 認証とレート制限
  • 多言語サポート

今すぐAI交渉コーチを構築しましょう!