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谈判教练吧!