如何实现自动挂断

本文介绍如何实现智能体自动挂断通话。

功能说明

智能体自动挂断是指智能体在识别到用户挂断意图或完成任务后产生挂断意图时,能够主动的挂断通话。该功能兼顾人性化交互与服务效率,确保每一次通话在恰当的时机结束。

使用限制:目前仅支持自研大模型接入实现。

应用场景

  1. 用户意图挂断:在对话过程中,若用户明确表达“我要挂了”、“不用了,谢谢”等结束语,大模型识别该意图并立即执行挂断。

  2. 智能体主动完成任务后挂断当智能体已完成信息确认、订单创建等业务目标,可携带结束语进行播报并自动挂断,实现自然收尾。

功能实现

智能体启动接口配置

要启用自动挂断功能,需要在启动智能体实例时,通过 LlmConfig.FunctionMap 将系统内置的挂断功能与 LLM 中的函数进行映射。

音视频通话:调用StartAIAgentInstance - 启动智能体实例时,配置AIAgentConfig中的LlmConfig。

电话通话:调用StartAIAgentOutboundCall - 启动智能体外呼电话时,配置AIAgentOutboundCallConfig中的LlmConfig。

LlmConfig:

名称

类型

描述

实例值

FunctionMap

array<object>

功能映射列表,用于将智能体能力与 LLM 函数对应。当前只支持和用户自定义 OpenAI 协议 LLM 的函数调用。

[{
	"Function": "hangup",
	"MatchFunction": "hangup"
}]

-Function

string

阿里智能体系统提供的内置功能名称。当前只支持 hangup(挂断)。

hangup

-MatchFunction

string

与该功能对应的 LLM 函数名称,由客户自定义,用于在 LLM 中调用对应功能。用户自定义 LLM 协议参考: LLM标准接口

hangup

FunctionMap 将 LLM 中定义的函数映射到智能体系统的内置功能。当系统在 LLM 的 tool_calls 响应中检测到 MatchFunction 定义的函数名,即会执行 Function 对应的内置功能。这个映射必填,如果不需要函数名转换可以两个都填写hangup。

实现LLMtool_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"