用Telnyx AI电话代理进行实时谈判演练
本文介绍如何用110行Python代码构建一个基于Telnyx Call Control和AI Inference的AI谈判练习电话。用户拨打电话后,可选择薪资谈判、销售交易或供应商合同三种场景,与扮演对手的AI进行语音谈判,挂断后获得结构化评分反馈。文章包含完整的构建步骤、架构解析和自定义场景的方法。
想象一下,你拿起电话,拨出一个号码,然后与一个扮演招聘经理的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:
passAI返回包含五个维度的结构化评分、优势列表、改进列表以及交易结果。应用将其与场景和通话时长一并存储。
访问会话
@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谈判教练吧!