本文介绍如何实现智能体自动挂断/转呼。
功能说明
智能体自动挂断/转呼,指智能体在识别到用户挂断/转呼意图或自身任务完成后主动进行挂断/转呼。
应用场景
用户意图挂断:在对话过程中,若用户明确表达“我要挂了”、“不用了,谢谢”等结束语,大模型识别该意图并立即执行挂断。
智能体主动完成任务后挂断:当智能体已完成信息确认、订单创建等业务目标,可携带结束语进行播报并自动挂断,实现自然收尾。
业务规则驱动的智能转呼:当用户需求超出当前智能体服务能力范围时,智能体可依据预设策略进行人工转呼。
实现方案对比
您可以根据业务需求和技术架构,选择以下任一方案来实现自动挂断功能。
方案 | 说明 | 推荐场景 | 支持能力 |
通过 LLM 输出指定文本指令实现 | 在 LLM 的提示词(Prompt)中定义一个特殊的文本指令,引导 LLM 在需要挂断时输出该指令。 | 无模型限制,实现简单快捷,无需复杂的接口配置,通过 Prompt 精准控制挂断行为的场景。 | 自动挂断、自动转呼 |
通过 LLM 的 tool_calls 实现 | 遵循 OpenAI 的函数调用(Function Calling)规范,将挂断功能封装为工具(Tool)供 LLM 调用。 | 仅适用于遵循 OpenAI 协议的自研LLM模型集成,实现结构化、更可靠的功能调用。 | 自动挂断 |
方案一:通过LLM输出指定文本指令实现
此方案更为简单,您只需引导 LLM 在需要挂断/转呼时输出一个特定格式的文本指令。
挂断指令
指令格式
<imsagent_hangup endword=结束语/>参数说明:
endword:挂断前向用户播报的结束语。通话将在结束语播报完成后自动挂断。
使用示例
<imsagent_hangup endword="那我挂断了,再见!"/>转呼指令
指令格式
<imsagent_transfer_call caller=主叫号码, callee=被叫号码, err_msg=转呼失败提示语, msg=转呼成功提示语/>
参数说明:
caller:主叫方号码(当前用户号码或业务设定的虚拟号码)。callee:被叫方号码(固定转呼目标)。err_msg:转呼失败时播放给用户的提示语。msg:转呼动作执行时播放给用户的提示语。
使用示例
<imsagent_transfer_call caller="111111", callee="123", err_msg="对不起,转呼繁忙中", msg="正在为您转呼中"/>
参考提示词(Prompt)
您可以将以下指令添加到您的 Prompt 中,以引导 LLM 在适当时机使用挂断指令。
你是一个智能语音助手,你能够支持以下能力:
1. 当需要主动挂断通话时,请按如下格式输出:
<imsagent_hangup endword=结束语/>
示例:
<imsagent_hangup endword="那我挂断了,再见!"/>
2. 当需要将用户转接到其他固定号码时,请按如下格式输出:
<imsagent_transfer_call caller=主叫号码, callee=被叫号码, err_msg=转呼失败提示语, msg=转呼提示语/>
示例:
<imsagent_transfer_call caller=111111, callee=123456, err_msg=对不起,转呼繁忙中, msg=正在为您转呼中/>方案二:通过LLM的tool_calls实现
智能体启动接口配置
要启用自动挂断功能,需要在启动智能体实例时,通过 LlmConfig.FunctionMap 将系统内置的挂断功能与 LLM 中的函数进行映射。
音视频通话:调用StartAIAgentInstance - 启动智能体实例时,配置AIAgentConfig中的LlmConfig。
电话通话:调用StartAIAgentOutboundCall - 启动智能体外呼电话时,配置AIAgentOutboundCallConfig中的LlmConfig。
LlmConfig:
名称 | 类型 | 描述 | 实例值 |
FunctionMap | array<object> | 功能映射列表,用于将智能体能力与 LLM 函数对应。当前只支持和用户自定义 OpenAI 协议 LLM 的函数调用。 | |
-Function | string | 阿里智能体系统提供的内置功能名称。当前只支持 hangup(挂断)。 | hangup |
-MatchFunction | string | 与该功能对应的 LLM 函数名称,由客户自定义,用于在 LLM 中调用对应功能。用户自定义 LLM 协议参考: LLM标准接口 | hangup |
FunctionMap 将 LLM 中定义的函数映射到智能体系统的内置功能。当系统在 LLM 的 tool_calls 响应中检测到 MatchFunction 定义的函数名,即会执行 Function 对应的内置功能。这个映射必填,如果不需要函数名转换可以两个都填写hangup。
实现LLM的tool_calls
用户可以使用LLM本身能力或者其他算法能力,判断是否需要挂断,然后通过OpenAI协议格式返回tool_calls。详细请参见:LLM标准接口。
def generate_stream_response(data):
response = "这是一个模拟的AI助手流式响应。实际应用中,这里应该调用真实的AI模型。"
words = list(response)
for i, word in enumerate(words):
chunk = {
"id": "chatcmpl-123",
"object": "chat.completion.chunk",
"created": int(time.time()),
"model": data['model'],
"choices": [{
"index": 0,
"delta": {
"content": word,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "hangup",
"arguments": "\{\}"
}
}
]
},
"finish_reason": None if i < len(words) - 1 else "stop"
}]
}
logger.info(chunk)
yield f"data: {json.dumps(chunk)}\n\n"
time.sleep(0.1) # 模拟处理时间
yield "data: [DONE]\n\n"