顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-大模型电话机器人

语音流直接对接Realtime API 多模态大模型

直接把音频流输出给大模型,大模型返回音频流。

顶顶通CTI对Realtime API 的支持

提供了以下2个APP可对接任意

•cti_audio_stream 通过TCP推流和播放流,适合用于人机对话场景。

•cti_unicast_start 通过旁路的方式UDP或者TCP推流和播放流,对接Realtime API 的同时还支持对通道进行放音操作。 适合于质检,机器人辅助场景。

通过TCP推流和播放流,适合用于人机对话场景

app: cti_audio_stream

参数 remote-ip:remote-port <native> <param>

  • native 可选参数 如果不设置,流格式为 8000hz 16位,如果设置了,就是原始的音频格式
  • param 自定义参数

推流协议

  1. 前面4字节 引导数据长度 网络字节顺序
  2. 时间戳 8字节
  3. 引导数据 {"uuid":"","codec":"","param":"自定义参数"}
  4. 数据流

连接断开后会自动重连,并且重发引导数据。

返回的放音流需要和推流的编码一样,不需要引导数据。

旁路的方式UDP或者TCP推流和播放流,适合于质检,机器人辅助场景

app: cti_unicast_start 启动推流

参数 tcp|udp remote-ip remote-port <local-ip> <local-port> <play|mix>

  • tcp|udp 使用tcp还是udp协议推流
  • remote-ip 远端 ip
  • remote-port 远端端口,不设置用0.0.0.0
  • local-ip 本地端口,不设置好用0,随机端口
  • play|mix
    • play 支持播放远端返回的流,发送方必须是远端IP和远端端口
    • mix 把远端的流和本地放音混音

api: uuid_cti_unicast_start 启动推流

参数 uuid tcp|udp remote-ip remote-port <local-ip> <remote-ip> <play|mix>

api: uuid_cti_unicast_stop 停止推流

参数 uuid

文字方式对接文本大模型

mod_cti先把声音转换成文字,然后把文字提交给大模型,根据大模型返回执行放音,顶顶通mod_cti话术引擎用的就是这种方式。

顶顶通话术引擎对接大模型原理和用法说明

顶顶通话术引擎充分发挥大模型prompt的强大功能,把关联节点和知识库可以自动带入prompt。

如果节点开启了大模型匹配,会根据大模型匹配设置生成 ${playtext}${prompttext}
${playtext} 所有关联节点的放音内容。

${prompttext} 所有关联节点的意向Prompt,也就是节点的进入规则。

如果大模型匹配包含了子流程,就会把关联的子流程 的文本放音加入${playtext},意向Prompt加入${prompttext}

如果大模型匹配包含了知识库,就会把关联的知识库 的文本放音加入${playtext},意向Prompt加入${prompttext}

如果大模型匹配包含了全局流程,就会把关联的全局流程的子流程 的文本放音加入${playtext},意向Prompt加入${prompttext}

用大模型判断意向选择分支,代替关键词匹配

适合场景:需要严格按流程执行,比如电话回访,电话调查。

## 任务描述 ## 
根据给定的对话上下文及产品信息,从候选回答中选择最合适的回答。
如果存在完全符合情境的候选回答,输出其ID,不要输出其他信息;
若没有合适的候选回答,输出"unmatch"。 

## 产品信息 ##
请在这里输入产品信息

## 候选回答列表 ## 
${playtext}

## 选择规则 ## 
${prompttext}

如果有匹配的回答分支,大模型会输出回答ID,话术引擎切换到流程节点,播放节点预先设置的放音;

如果没有匹配的回答分支,大模型会输出unmatch,话术引擎会忽略模型返回,继续执行兜底(any)匹配,如果设置了兜底流程就会进入兜底流程节点。

用大模型判断意向选择分支和兜底回答

适合场景:大部分场景都合适

## 任务描述 ## 
根据给定的对话上下文及产品信息,从候选回答中选择最合适的回复。
如果存在完全符合情境的候选回答,只输出其ID,不要输出其他信息;
若没有合适的候选回答,基于对话上下文和产品信息模仿真人说话口吻编写一条简短且恰当的新回复。 

## 候选回答列表 ## 
${playtext}

## 选择规则 ## 
${prompttext}

如果有匹配的回答分支,大模型会输出回答ID,话术引擎切换到流程节点,播放节点预先设置的放音;

如果没有匹配的回答分支,大模型会生成一个回答,话术引擎调用流TTS播放这个回答,不会切换流程。

用大模型判断意向选择分支和兜底回答以及优化话术设置的回答内容

适合场景:既要按预先设置的流程步骤执行,又要充分利用大模型生成合适的回答。

## 任务描述 ## 
根据给定的对话上下文及产品信息,从候选回答中选择最合适的回复。
如果存在完全符合情境的候选回答,输出其ID,回答内容输出空;
如果有接近但不完全合适的候选回答,输出该候选回答ID,并提供一个优化后的回答内容,优化后的回答必须和候选回答类似含义;
若没有合适的候选回答,候选回复id设置为null,并基于对话上下文和产品信息模仿真人说话口吻编写一条简短且恰当的新回复。 

## 候选回答列表 ## 
${playtext}

## 选择规则 ## 
${prompttext}

 ## 输出格式要求 ## 
id:候选回答ID  content: 回答内容

注意输出格式要求: 必须要求大模型输出"id:候选回答ID content: 回答内容" 这样的格式,不然输出格式要求不对,话术引擎解析不了。

如果有完全符合情境的回答分支,大模型会输出回答ID,不会优化回答内容,话术引擎切换到流程节点,播放节点预先设置的放音;

如果有接近但不完全合适回答分支,大模型会输出回答ID,和输出优化后的回答内容,话术引擎切换到流程节点,播放大模型优化后的回答内容;

如果没有匹配的回答分支,大模型会生成一个回答,话术引擎调用流TTS播放这个回答,不会切换流程。

让大模型来确定回答内容

比如有这样一个流程

机器人:你的电话号码是多少?

用户:我的电话是XXXXX。

机器人:确定一下,你的电话号码是 XXXXX 对吧。

## 任务描述 ## 
获取输入中的电话号码。
如果输入中有电话号码输出:你的电话号码是 "电话号码" 吗
如果输入中没有电话号码输出:请问你的电话号码是多少呢

## 输出示例 ##
1. 你的电话号码是 13100000000 吗
2. 请问你的电话号码是多少呢

可以通过输出示例,输出格式,等约束让大模型让要求输出。

可以多次重复测试prompt或者使用prompt优化工具来优化prompt, 在大模型时代,能写出高质量的prompt才可以用好大模型。

相关推荐
Bill_Xiang1 小时前
大模型辅助火狐浏览器插件开发:网页保存至本地及 GitHub 仓库
大模型·github
文弱书生子3 小时前
中间件专栏之MySQL篇——MySQL的索引原理
数据库·mysql·中间件
怪我冷i1 天前
2025年生成式人工智能应用工程师学习线路
大模型·llama
暗夜猎手-大魔王1 天前
大语言模型学习
大模型
致Great1 天前
DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略
人工智能·分布式·语言模型·开源·大模型
文弱书生子1 天前
中间件专栏之Redis篇——Redis中过期key删除和内存淘汰策略
数据库·redis·中间件
文弱书生子1 天前
中间件专栏之Redis篇——Redis的三大持久化方式及其优劣势对比
数据库·redis·中间件
m0_748229991 天前
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
jmeter·中间件·性能优化
西西弗Sisyphus1 天前
对大模型输出的 logits 进行处理,从而控制文本的生成
大模型
Jesslili1 天前
秒杀系统的常用架构是什么?怎么设计?
java·中间件·架构