函数调用实现小米汽车智能语音助手

上周小米汽车发布,其中有一个特色功能就是智能语音,小爱同学整合了语音大模型,实现智能座舱体验。

雷老板的PPT也演示了,一些口语化的对话就能触发各种指令,无论是开空调、播放音乐,还是找手机、识别前方汽车,丝滑流畅。

其实这个就是语言大模型中的函数调用能力,ChatGPT老早就已经能力支持了,只是很多小伙伴们没有发觉,或者看到冗长的技术文档就觉得是很复杂的功能。

本期文章就聊聊如何简单、快速地使用语言大模型实现一个小米汽车同款的智能语音助手。

语音输入

语言转文字有很多成熟的解决方案,openai的wisper-1模型,或者讯飞听见,甚至是手机电脑自带的语音识别,识别语音的准确度都是很高的。

函数调用

ChatGPT大模型是现在市面上训练地最充分,也是国外的大模型中对中文支持最友好的一个。基于工作难度和响应速度考虑,gpt-3.5-turbo模型已经够用了。

系统预设

当然,为了让语言大模型能够准确地了解我们的使用场景,可以适当地添加系统预设,例如:

{
  "role": "system",
  "content": "你是一辆汽车内置的智能语言系统“小爱同学”,为乘客提供智能的语言交互服务,输出指令集。"
}

函数定义

然后就是指令集的定义,可以参考openai官方文档

https://platform.openai.com/docs/guides/function-calling

使用json-schema定义函数,语言大模型会根据语境输出如何调用函数。这里给大家提供一个json-schema数据的编辑工具

https://texttools.cn/json-schema/

我们可以简单定义一些车内的设备操作和程序指令,例如:

[
  {
    "name": "instruction_set",
    "description": "指令集",
    "parameters": {
      "type": "object",
      "title": "指令集",
      "properties": {
        "控制空调": {
          "type": "object",
          "title": "",
          "properties": {
            "opeartion": {
              "type": "string",
              "title": "",
              "enum": [
                "开启,关闭,调高温度,调低温度,调大风速,调低风速"
              ]
            }
          }
        },
        "控制音乐": {
          "type": "object",
          "title": "",
          "properties": {
            "opeartion": {
              "type": "string",
              "title": "",
              "enum": [
                "播放,暂停,大声,小声"
              ]
            }
          }
        },
        "执行程序": {
          "type": "object",
          "title": "",
          "properties": {
            "program": {
              "type": "array",
              "title": "",
              "items": {
                "type": "string",
                "title": "程序名称",
                "enum": [
                  "获取当前位置",
                  "识别前方车辆",
                  "识别左方建筑",
                  "识别右方建筑",
                  "推荐附近美食",
                  "定位手机"
                ]
              }
            }
          }
        }
      }
    }
  }
]

这里为了直观直接使用了中文的key,强迫症程序猿请忽略

语言输入

然后我们就可以模拟一下在车内的时候跟车载语音助手的互动,可以在一句话中包含了多个信息,现在的语言大模型是可以轻松地理解对话内容。

例如我们可以说:

"我有点热,车里太安静了,左边那个建筑是什么,前面那辆车是什么车"

接口调用

然后请求接口 

可以看到返回结果

{
  "控制空调": {
    "opeartion": "调低温度"
  },
  "控制音乐": {
    "opeartion": "播放"
  },
  "执行程序": {
    "program": ["识别左方建筑", "识别前方车辆"]
  }
}

返回的指令集包括了:

  • 空调调低温度

  • 播放音乐

  • 执行程序 识别左方建筑

  • 执行程序 识别前方车辆

这个指令集是严格按照我们预设的结构生成的,拿到这个指令集之后,就可以识别并执行对应的程序,还可以在预设这些场景输出的回答内容,例如“已调低空调温度”等。

贴一下详细的curl,执行的时候只要将 THIS_IS_YOUR_APIKEY 替换为你的apikey即可。

curl --request POST \
  --url https://api.smarttxt.net/v1/chat/completions \
  --header 'Authorization: Bearer THIS_IS_YOUR_APIKEY' \
  --header 'Content-Type: application/json' \
  --header 'content-type: application/json' \
  --data '{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "system",
      "content": "你是一辆汽车内置的智能语言系统“小爱同学”,为乘客提供智能的语言交互服务,输出指令集。"
    },
    {
      "role": "user",
      "content": "我有点热,车里太安静了,左边那个建筑是什么,前面那辆车是什么车"
    }
  ],
  "functions": [{"name":"instruction_set","description":"指令集","parameters":{"type":"object","title":"指令集","properties":{"控制空调":{"type":"object","title":"","properties":{"opeartion":{"type":"string","title":"","enum":["开启,关闭,调高温度,调低温度,调大风速,调低风速"]}}},"控制音乐":{"type":"object","title":"","properties":{"opeartion":{"type":"string","title":"","enum":["播放,暂停,大声,小声"]}}},"执行程序":{"type":"object","title":"","properties":{"program":{"type":"array","title":"","items":{"type":"string","title":"程序名称","enum":["获取当前位置","识别前方车辆","识别左方建筑","识别右方建筑","推荐附近美食","定位手机"]}}}}}}}]
}'

点击获取apikey

到此,我们就已经实现了智能语音助手中最关键的“对话转指令”的能力。但是我们这个功能依赖的是线上的服务,为了保证离线时系统的可用性,我们还可以和小米汽车一样在本地部署一个大模型。

ps:有需要本地部署大模型可以联系站长。

相关推荐

  1. 再谈小米汽车

    2024-04-03 08:08:02       46 阅读
  2. 小米汽车发布了

    2024-04-03 08:08:02       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 08:08:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 08:08:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 08:08:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 08:08:02       20 阅读

热门阅读

  1. C++学习笔记(二)

    2024-04-03 08:08:02       14 阅读
  2. 【LeetCode】热题100:合并K个升序链表

    2024-04-03 08:08:02       14 阅读
  3. webscoket 中的 mask 细节

    2024-04-03 08:08:02       14 阅读
  4. 安装transforers时报错:error: can‘t find Rust compiler

    2024-04-03 08:08:02       15 阅读
  5. HTML如何设置字体样式?

    2024-04-03 08:08:02       11 阅读
  6. 进程和线程之间的区别和联系

    2024-04-03 08:08:02       15 阅读
  7. 串口屏接口之RS232/485的理解

    2024-04-03 08:08:02       13 阅读
  8. 国外服务器租用需要考虑哪些重要信息

    2024-04-03 08:08:02       16 阅读
  9. OCRmyPDF:全能PDF光学字符识别工具及其Python集成

    2024-04-03 08:08:02       9 阅读
  10. Docker in Docker原理与实战

    2024-04-03 08:08:02       10 阅读
  11. 第四章:Minikube生命周期管理命令

    2024-04-03 08:08:02       11 阅读
  12. springboot + mybatis支持多数据库

    2024-04-03 08:08:02       14 阅读