目标

请帮我实现一个ai语音客服系统。

任务描述

ai语音客服系统由agent客服和人工客服组成,能够通过语音与用户进行交互,理解用户的语音指令,并根据指令提供相应的服务,从而让agent客服尽可能代替人工客服。

一、业务需求

  • 支持机票预定,
  • 支持机票退票,
  • 支持机人工客服通道,

二、整体流程

  1. 用户输入语音后用vad进行语音活动检测。
  2. vad检测后,用轮次模型检测用户是否说完一句话。
  3. 轮次检测完成后,可以对语音实时转文本。
  4. 对识别的文本进行意图识别、命名实体识别、情绪识别、骂人识别。
  5. 统计连续呼叫人工客服次数,连续重复问题次数,实时记录对话状态信息。
  6. 根据人工客服触发条件选择人工客服或agent客服。
  7. agent客服
  • 对用户意图进行槽位填充,和用户多轮交互,直到意图槽位填充完成。
  • 调用系统工具,根据工具调用结果、意图等生成最终回答文本。
  • 对回答的文本进行语音合成。
  • 回答的语音需要实时播放给用户。
  1. 人工客服
  • 人工处理后,记录对话结束时间(可以用于意图结束时间)。
  1. 异常情况
  • agent客服任意步骤失败,需要提供N(默认3)次重试机制。如果还失败,则需要人工客服处理。
  • 用户等待客服时间超过N(默认10)秒,需要系统话术安慰用户,比如:正在处理中,请耐心等待。

三、要记录的对话状态信息

  1. 意图和槽位信息。
  2. 当前意图已经识别的命名实体。
  3. 意图完成标识和完成的时间。
  4. 骂人的次数。
  5. 负面情绪和置信度分值。
  6. 连续呼叫人工客服的次数。
  7. 连续用户重复问题的次数。
  8. 其他你需要的信息。

四、人工客服触发条件:

  1. 意图符合系统库意图,用户重复问题N(默认3)次以上。
  2. 意图符合系统库意图,用户负面情绪置信度大于0.9。
  3. 意图符合系统库意图,用户出现骂人N(默认3)次以上。
  4. 主动要求人工客服N(默认3)次以上。
  5. agent客服步骤失败,重试N(默认3)次以上。

五、系统架构

  1. 后端请使用python实现。
  2. 请使用agentscope框架实现智能体。
  3. 请使用SQLite数据库持久化智能体记忆等。
  4. 请使用tortoise实现orm。
  5. 请使用fastapi实现后端接口。
  6. 请使用websocket实现语音流式传输。
  7. 请使用docker-compose实现部署。

六、功能需求

功能模块

vad检测

主要对用户输入的语音进行活动检测,判断是否有用户在说话(可以使用TEN VAD)。

轮次检测

主要对用户输入的语音进行轮次检测,判断用户是否说完一句话(可以使用TEN Turn Detection)。

语音识别

主要对用户输入的语音进行实时转换为文本,使用第三方接口,参考:https://help.aliyun.com/zh/model-studio/websocket-for-paraformer-real-time-service。

语音合成

主要对agent客服回答文本进行语音合成,使用第三方接口,参考:https://help.aliyun.com/zh/model-studio/cosyvoice-websocket-api?spm=a2c4g.11186623.help-menu-2400256.d_2_6_0_2.64ba7c98ZIlDIO。

agent客服

agent客服是一个多智能体系统,每个智能体负责不同的任务,介绍如下:

  1. 意图识别agent
    主要负责识别用户的意图,可以识别多意图和层级意图,遍历所有意图并从意图库中匹配意图和槽位。
    输入:同一个意图内的聊天历史,用户输入的语音文本。
    输出:意图和槽位。
  2. 命名实体识别agent
    主要负责识别用户输入的命名实体,如姓名、日期、时间、地点等。
    输入:用户输入的语音文本。
    输出:命名实体。
  3. 槽位填充agent
    根据意图、槽位、命名实体,不断填充槽位,和用户多轮交互,直到意图所有槽位都被填充。
    输入:命名实体识别agent输出的命名实体,意图识别agent识别的意图和槽位。
    输出:需要用户提供的槽位话术、槽位是否填充完成标识。
  4. 情绪识别agent
    识别用户的情绪,判断用户负面情绪以及负面情绪的置信度。
    输入:用户输入的语音文本。
    输出:负面情绪、负面情绪置信度。
  5. 骂人识别agent
    识别用户是否骂人。
    输入:用户输入的语音文本。
    输出:骂人标识、骂人置信度。
  6. 最终回答agent
    根据意图、工具调用结果、骂人识别结果,生成最终回答。
    输入:用户输入的语音文本,工具调用结果、意图、是否骂人。
    输出:模型回答或者系统话术回答。
内部tools
  1. 机票预定
    输入:起始地,目的地,出发日期,姓名等。
    输出:订单完成标识。
  2. 机票退票.
    输入:订单id、订单日期、姓名等。
    输出:退票完成标识。
意图检索

主要负责从系统库中检索意图,判断用户意图是否符合系统库意图,意图库直接存文件。
输入:意图识别agent识别的意图。
输出:系统库中符合意图的意图以及槽位。

前端模块

主要负责与用户进行交互,接收麦克风输入的语音,将语音发送给后端,接收后端返回的回答,将回答播放给用户。

七、代码目录层级

agents: 存放智能体代码。里面有tools目录(存放智能体代码),prompts目录(存放智能体的prompt代码),skill目录(存放智能体的技能代码),retrieves目录(存放rag检索代码)等。
vads: 存放vad检测代码。
turn_dets: 存放轮次检测代码。
conf: 存放配置文件,比如mysql配置。
orms: 存放数据库orm模型代码。
dbs: 存放基于orms的数据库操作代码。
logs: 存放logging初始化模块。
requirements.txt: 存放项目依赖的python包。
main.py: 项目入口文件。
audio_stream_client.py: 实现语音流式传输的客户端。
其他: 根据你的需要自己创建目录。

总结

我尝试了很多次,耗时比开发时间还久,但是对长期做项目还是有帮助的,因为很多事人在重复性做,有下面几条经验分享:

自己充当产品经理、架构师。把产品文档、边界问题、业务流程、工程模块尽可能想清楚。

prompt让agent按模块实现(方便程序员修改,比如数据库操作),分步骤,每个步骤结束人工确认下,再整体实现业务流程(prompt可以按模块实现)。

让agent给模块提供使用样例(给agent提供教程),单元测试校验(保证模块稳定性),输入输出。

prompt定义好项目规范和模块文件名。

prompt定义好程序员熟悉的第三方工具包。

使用第三方模块可以给agent提供api文档的skill。

前后端解耦实现,让agent输出后端接口。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐