本文将介绍在用户与智能体通话过程中,如何实现真人客服对智能体的接管。
真人接管介绍
真人接管功能是在用户服务过程中,当AI智能体(如聊天机器人)无法满足用户需求或遇到复杂问题时,能够无缝将对话转移给真人客服处理的一种机制。这个过程通过预设规则、客户主动请求或大模型判断分析来触发,确保在适当的时候进行转接。
限制说明
在接入真人接管之前,您需要提交工单提供您的工作流ID,方便我们对您的工作流进行配置,以支持真人接管。
在真人接管后,无法重新切换至AI智能体进行交互。
功能实现概览
在需要真人接管的情况下,AI实时互动整体业务流程如下:
在上述流程中,您需要关注的是如何触发真人接管、通知真人客服进行接管以及真人客服进行接管三个流程。
如何触发真人接管(流程5):
用户主动发起真人接管请求:如果是由用户主动发起真人接管请求,那么您需要关注如何通知真人客服进行接管。
LLM自动判断需要真人接管:如需由大模型(LLM)判断是否需要由真人接管,您需自行实现自研的LLM。百炼大模型是通过自定义插件来实现的,具体步骤如下所示:
通知真人客服进行接管(流程7):通知Web端进行真人接管,此部分涉及大模型与AppServer及Web端之间的通知机制,需您自行实现。
真人客服接管智能体(流程8):在真人客服接管智能体后,您还需实现接收来自智能体发送的字幕。具体实现,请参见客服侧Web端如何入会。
真人客服接管实现
Web侧真人客服接管详细流程
客服侧Web端如何入会
客服侧调用TakeoverAIAgentCall - 开启真人接管模式接口。
客服侧获取入会和RTC Token等信息。
客服侧根据入会信息调用RTC入会和推拉流,接收来自智能体发送过来的字幕。RTC接入,请参考快速使用阿里云ARTC Web SDK。
在真人接管后,您可以选择使用智能体音色或客服自身音色。为确保真人接管后的音色与原本智能体保持一致,客户需提前进行人声克隆。具体操作,请参考基于百炼CosyVoice创建自定义音色。
接收来自智能体发送过来的字幕,参考代码如下:
监听收到字幕事件。
aliRtcEngine.on('dataChannelMsg', (uid, msg) => { try { const dataChannelMsg = JSON.parse(new TextDecoder().decode(msg.data)); if (dataChannelMsg.type === 1002) { // 收到智能体字幕,data格式: // text: 文本 // sentenceId: 语句Id,用于区分多句话,一句话会根据流式结果多次通知 // end: 当前语句是否结束 console.log('agentSubtitleNotify', dataChannelMsg.data); } else if (dataChannelMsg.type === 1003) { // 收到用户字幕 // text: 文本 // sentenceId: 语句Id,用于区分多句话,一句话会根据流式结果多次通知 // end: 当前语句是否结束 console.log('userSubtitleNotify', dataChannelMsg.data); } else { // 其他类型可以忽略 } } catch(error) { console.error(error) } });
加入频道之前执行方法,开启接收字幕能力。
aliRtcEngine.setParameter( JSON.stringify({ data: { enableSubDataChannel: true, }, }), );
进阶实现
用户侧感知真人客户接管过程
您可以通过回调接口获取真人客服在接管过程中的状态,并将该状态实时反馈给用户。
如需要对客服接管过程进行感知和提示,您需要实现回调接口onHumanTakeoverWillStart
和onHumanTakeoverConnected
,示例代码如下所示:
客户端需要使用AICallKit SDK v1.5.0及以上版本。
Android
// 回调处理(仅示例不分核心的回调操作)
ARTCAICallEngine.IARTCAICallEngineCallback mCallEngineCallbackWrapper = new ARTCAICallEngine.IARTCAICallEngineCallback() {
@Override
public void onHumanTakeoverWillStart(String takeoverUid, int takeoverMode) {
// 当真人即将接管当前智能体
}
@Override
public void onHumanTakeoverConnected(String takeoverUid) {
// 当真人接管已经接通
}
// 其他回调
...
};
iOS
extension AUIAICallStandardController: ARTCAICallEngineDelegate {
public func onHumanTakeoverWillStart(takeoverUid: String, takeoverMode: Int) {
// 当真人即将接管当前智能体
debugPrint("AUIAICallStandardController onHumanTakeoverWillStart:\(takeoverUid) , takeoverMode:\(takeoverMode)")
}
public func onHumanTakeoverConnected(takeoverUid: String) {
// 当真人接管已经接通
debugPrint("AUIAICallStandardController onHumanTakeoverConnected:\(takeoverUid)")
}
// 其他回调
...
}
Web
engine.on('humanTakeoverWillStart', (uid: string, mode: number) => {
// 真人即将接管当前智能体
console.log('AICallHumanTakeoverWillStart', uid, mode);
});
engine.on('humanTakeoverConnected', (uid: string) => {
// 真人接管已经接通
console.log('AICallHumanTakeoverConnected', uid);
});