AI News HubLIVE
站內改寫4 分鐘閱讀

用Telnyx AI電話代理進行即時談判演練

本文介紹如何用110行Python程式碼構建一個基於Telnyx Call Control和AI Inference的AI談判練習電話。使用者撥打電話後,可選擇薪資談判、銷售交易或供應商合同三種場景,與扮演對手的AI進行語音談判,結束通話後獲得結構化評分反饋。文章包含完整的構建步驟、架構解析和自定義場景的方法。

來源Hacker News AI作者: harpreetseehra

想象一下,你拿起電話,撥出一個號碼,然後與一個扮演招聘經理的AI進行薪資談判——它會拒絕你的首次報價,用預算限制來還價,最後在你結束通話後給你的談判技巧打分。無需預約模擬面試,無需支付教練費用,也無需與同事尷尬地角色扮演。

這就是AI談判練習電話——一個用Telnyx Call Control和AI Inference構建的110行Python應用。它提供三個場景(薪資、銷售交易、供應商合同),全程語音驅動,每次通話結束後都會給出結構化的表現評分。AI始終扮演角色,適應你的談判方式,並提供可操作的反饋。

本教程將帶你從零開始構建這個應用。克隆程式碼倉庫、配置一個電話號碼,幾分鐘內即可開始練習。

你將構建什麼

一個任何人都可以撥打來練習談判的電話號碼:

  • 撥入後,Telnyx應答並提供選單
  • 按1選擇薪資談判,2選擇銷售交易,3選擇供應商合同
  • AI開始扮演對手角色(招聘經理、企業買家或供應商客戶經理),提出開場條件
  • 即時談判:你自然說話,AI以角色身份回應,推拉、還價並適應你的策略
  • 結束通話後評分:AI從五個維度評估談判,返回結構化JSON
  • 會話記錄:每次練習都會被儲存,可透過GET /sessions訪問

整個過程完全語音驅動:文本轉語音朗讀AI的臺詞,你以自然語音回應。模型(透過Telnyx AI Inference提供的Llama 3.3 70B)既處理即時角色扮演,也負責結束通話後的評估。

為什麼這很有趣

大多數談判培訓工具都是基於文本的聊天機器人或靜態影片課程。兩者都無法捕捉真實對話的壓力——停頓、推拉、必須快速思考的時刻。而這個工具讓你在真實的電話中與一個擁有預算、角色和隱藏約束(如“最大15%折扣”或“預算15.5萬美元,可靈活至16.5萬美元”)的AI交談。

評分系統讓它不僅僅是一次對話。結束通話後,AI從五個維度評估你的表現——錨定、讓步策略、主動傾聽、創造力和自信——以及總體得分和具體的優勢與改進點。你可以重複練習同一場景五次,並跟蹤自己的進步。

此外,它展示了DTMF+語音模式:應用使用DTMF(按鍵輸入)進行場景選擇,語音識別用於談判本身。這種雙輸入模式出現在許多真實的IVR工作流中。

前提條件

  • Python 3.8+
  • 擁有充足餘額的Telnyx賬戶
  • Telnyx API金鑰
  • 已啟用語音的Telnyx電話號碼
  • 配置了Webhook URL的Call Control Application
  • ngrok(用於將本地伺服器暴露給Telnyx webhooks)

架構

電話呼叫 → Telnyx Call Control(webhook事件)→ Flask應用(app.py,110行)→ 處理各種事件(呼入應答、按鍵收集、語音對話、結束通話評分)→ Telnyx AI Inference(Llama 3.3 70B)→ 評分JSON

應用是一個狀態機,包含兩個階段:選擇(DTMF選單)和談判(語音對話)。每個Telnyx webhook事件驅動下一步操作。結束通話後,完整的對話被髮送給AI,並帶有一個評分提示,返回結構化JSON。

第一步:克隆與配置

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號碼)

第二步:理解程式碼

所有程式碼都在app.py中(110行)。以下是各部分功能。

場景

應用內建三個談判場景,每個都有角色和隱藏上下文:

  • 場景1:招聘經理,預算15.5萬美元,可靈活至16.5萬美元
  • 場景2:企業買家,有競品報價3.5萬美元,預算4.5萬美元
  • 場景3:供應商客戶經理,客戶要求減合同40%,最大折扣15%

上下文被注入系統提示,使AI知曉約束,但呼叫者不知道。你只能透過對話發現對方預算和靈活性。

狀態機:選擇 → 談判

Webhook處理程序有兩個狀態。選擇狀態收集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返回包含五個維度的結構化評分、優勢列表、改進列表以及交易結果。應用將其與場景和通話時長一併儲存。

訪問會話

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

訪問GET /sessions可檢視最近20次練習會話的JSON資料——可用於追蹤進步、比較場景或接入分析儀表板。

記憶體清理

應用包含一個後臺執行緒,定期清理過期的通話狀態(預設1小時)。

第三步:執行應用

python app.py

在另一個終端啟動ngrok:ngrok http 5000。將ngrok的HTTPS URL(例如https://abc123.ngrok.app/webhooks/voice)配置到Telnyx Call Control Application的Webhook URL中,並將你的Telnyx電話號碼分配給該應用。

第四步:撥打併練習

用任何電話撥打你的Telnyx號碼。你會聽到:“歡迎使用談判練習!按1進行薪資談判,按2進行銷售交易,按3進行供應商合同。”

按1。AI(扮演招聘經理)可能會說:“感謝來電。我看了你的經驗,老實說,這個級別的候選人我們通常提供15.5萬美元。我知道你期望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.2萬美元基本工資+1萬美元簽約獎金達成"
  },
  "duration": 184
}

自定義場景

SCENARIOS字典是控制面板。微小改變即可產生非常不同的練習會話:

  • 新增房地產談判場景
  • 讓AI更具攻擊性
  • 新增多輪評分與趨勢追蹤
  • 通話後透過簡訊傳送評分

投入生產

本例為簡化使用記憶體儲存。生產部署應考慮:

  • 資料庫(如PostgreSQL)替代記憶體列表
  • 更健壯的錯誤處理
  • 身份驗證與速率限制
  • 多語言支援

現在就開始構建你的AI談判教練吧!