首页 文章详情

千元以内,DIY 一个 AI 大语言模型对话玩具

后端技术漫谈 | 229 2024-04-29 15:07 0 0 0
UniSMS (合一短信)

5e9d7c91d4b368e02af0f8bf635391a7.webp

明星机器人初创公司 Figure,携手 OpenAI 发布令人震撼的全新机器人演示。短短几周内,自 3 月 1 日宣布获得 OpenAI 等巨头投资后,Figure 迅速融合了 OpenAI 的前沿多模态大模型技术。这一突破让我萌生了一个大胆想法——自制一个由大模型加持的玩具,姑且叫他 Figure 3000 吧。

话不多说,先看看我的 Figure 01 平替版 Figure 3000 效果怎么样。

大家可以看到,虽然效果上对标 Figure 01 还是有些差距的,但是 Figure 3000 在成本上做到了遥遥领先,千元以内没有对手:

  1. 硬件成本在千元以内,主要是火火兔 G6 模具和 FoloToy Core

  2. 语音识别和语音合成使用阿里灵杰 AI 开放服务,免费 2 个月,先用再说

  3. 大模型在自己的 MacbookPro 上运行,四舍五入免费

我也把 DIY 的过程记录下来,希望能帮助到大家。


01


如何工作的?


先说说工作原理吧,方便大家理解,主要有三个关键步骤:

  1. 录音:通过 UDP 接收玩具发送的实时录音数据,并调用 STT(声音转文字)API 将声音转换成文字。

  2. 思考:在接收到之前的文字后,将立即调用 LLM(大型语言模型)API,以流式方式获取 LLM 生成的句子。然后,调用 TTS(文字转声音)API 将句子转换成人类的语音。

  3. 播放音频:玩具将接收由 FoloToy 服务器生成的 TTS(文字转声音)音频文件流,并按顺序播放。


02


开始前的准备

在开始制作你的 LLM(大型语言模型)玩具之前,了解所需的硬件、软件和技术知识至关重要。本节将指导你准备所有必需品,确保顺利开始。

硬件

1731a51ceb72e25af092f18f60e59ea4.webp

FoloToy Core:GPT AI 语音交互核心板,作为项目的大脑,使得玩具能够与 AI 进行语音互动。(购买时,请提供我的促销代码 F-001-2 以获得折扣。

f6d2c62ca50b8affe22847f0cd8a2b92.webp

玩具模具: 必须包含基础部件,如麦克风、扬声器、按钮、开关和电源等。这里我用了火火兔 G6 模具,因为它的外观和尺寸都很适合我的项目。家里的小朋友也喜欢这个玩具。

服务器

利用你自己的机器,比如 MacBookPro,确保你的玩具有一个可靠的后端来处理和响应语音交互。或者,用云服务器,比如阿里云、腾讯云等,步骤是一样的。

知识储备

  1. Docker(必须):理解 Docker 对于在容器中部署软件至关重要,使你的项目便携且可扩展。我用它来启动 Folo 服务器。

  2. MQTT(可选):如果你目标是进行高级定制,熟悉 MQTT(一种轻量级消息传递协议)将对于玩具和服务器之间的通信非常有益。

  3. EMQX(可选):用于物联网、工业物联网和连接车辆的开源 MQTT 代理。用于管理你的玩具。

  4. ollama(可选):如果你想在本地运行大型语言模型,这是一个不错的选择。

服务和注册

要让你的玩具变得生动,你需要访问特定的 AI 服务。对于这个项目,我选择了使用阿里灵杰 AI 开放服务,因为它提供了免费的语音识别和语音合成服务。你也可以选择其他服务。对于大型语言模型,我用了本地部署的 llama2,你可以根据自己喜好选择,基本上都是兼容的。

  1. TTS(文本转语音):阿里的语音识别效果上还是不错的,足以满足日常交流的需求。

  2. LLM(大型语言模型):利用大语言模型来理解和生成类似人类的文本响应,当然各个模型我都进行了尝试,总的来说贵有贵的道理,但是我还是选择了本地部署的 llama2。

  3. STT(语音转文本):阿里的语音合成效果上还是不错的,有上百个角色可以切换,满足不同的兴趣爱好。

如果你使用的是各种大语言模型,你需要注册并获取 API 密钥,类似 sk-xxx,这个是你调用 API 的凭证。阿里的灵杰 AI 开放服务,你需要注册、创建应用并获取 app_key,access_key_id,access_key_secret。


03


组装你的玩具


现在是时候将所有部件组合起来,制作你自己的 LLM(大型语言模型)玩具了。

总体步骤如下,建议先观看视频教程[1]。

  1. 检查 G6 的录音和播放是否正常。

  2. 使用螺丝刀拧开 G6 背部的 6 颗螺丝。

  3. 小心打开 G6 的外壳,拔掉主板上所有的插头,首先拔掉电源插头,插头上有胶,可以使用美工刀轻轻切开,确保不要切到手。

  4. 拧下主板上的 4 颗螺丝并取下主板。

  5. 用 FoloToy 的主板替换原来的主板,并拧紧 3 颗螺丝以固定。

  6. 插入麦克风、灯、扬声器和电源插座,最后插入电源插座。

  7. 插入所有插座后,不要立刻关闭外壳或安装螺丝。首先打开/关闭兔子尾巴上的开关,看新安装的灯是否能够打开并以蓝色慢慢闪烁。

  8. 如果没有问题,安装外壳并拧紧螺丝以完成更换过程。


04


设置服务器


强大的后端支持是使你的 LLM 玩具理解和响应语音命令的关键。本节将教你如何克隆服务器代码库、配置服务器以及启动 Docker 容器,以确保你的玩具拥有稳定的后端支持。

首先从 GitHub 克隆 Folo 服务器代码库。

      
        git clone git@github.com:FoloToy/folotoy-server-self-hosting.git
      
    

然后在 docker-compose.yml 文件中将基础服务器配置更改为你自己的配置。

名称 描述 示例
AUDIO_DOWNLOAD_URL 音频文件的 URL。 http://192.168.x.x:8082
SPEECH_UDP_SERVER_HOST 服务器的 IP 地址。 192.168.x.x
LLM_TYPE LLM 服务类型 ollama
OLLAMA_API_BASE LLM API 地址 http://host.docker.internal:11434
OLLAMA_MODEL LLM 模型 llama2
STT_TYPE 语音识别服务类型 aliyun-asr
ALIYUN_ASR_ACCESS_KEY_ID 阿里云语音识别的 access_key_id xxx
ALIYUN_ASR_ACCESS_KEY_SECRET 阿里云语音识别的 access_key_secret xxx
ALIYUN_ASR_APP_KEY 阿里云语音识别的 app_key xxx
TTS_TYPE 语音合成服务类型 aliyun-tts
ALIYUN_TTS_ACCESS_KEY_ID 阿里云语音合成的 access_key_id xxx
ALIYUN_TTS_ACCESS_KEY_SECRET 阿里云语音合成的 access_key_secret xxx
ALIYUN_TTS_APP_KEY 阿里云语音合成的 app_key xxx

注:阿里云的语音识别和语音合成的配置用同一个配置就行。

然后在 config/roles.json 文件中配置你的角色,这里是一个最小示例,完整配置请参考 FoloToy 文档。

      
        {
      
      
          "1": {
      
      
            "start_text": "Hello, I'm Figure 3000. What can I do for you?",
      
      
            "prompt": "You are a helpful assistant."
      
      
          }
      
      
        }
      
    

接着启动 docker 容器。

      
        docker compose up -d
      
    

我在自己的机器上运行 Folo 服务器,如果你想在云端运行,几乎是相同的操作。需要注意的一点是,你需要将 1883、8082、8085、18083 和 8083 端口对公网开放,大部分云服务商都有防火墙设置,可以在控制台设置。

更多信息,请参考 FoloToy 文档[2]。


05


本地运行 LLM

98660a9b2ee2491b11885698f03d8de6.webp

在本地运行大型语言模型是一件有趣的事情。你可以运行 Llama 2、Gemma 以及来自世界各地的所有种类的开源大型模型,甚至是你自己训练的模型。使用 ollama,你可以轻松做到这一点。首先安装 ollama,然后运行以下命令以运行 Llama 2 模型。

      
        ollama run llama2
      
    

然后,更改角色配置以使用本地 LLM 模型。

      
        {
      
      
          "1": {
      
      
            "start_text": "Hello, what can I do for you?",
      
      
            "prompt": "You are a helpful assistant.",
      
      
            "llm_type": "ollama",
      
      
            "llm_config": {
      
      
              "api_base": "http://host.docker.internal:11434",
      
      
              "model": "llama2"
      
      
            }
      
      
          }
      
      
        }
      
    

api_base 应该是你的 ollama 服务器地址,别忘了重启 Folo 服务器以使更改生效。

      
        docker compose restart folotoy
      
    

就这么简单,可以根据你的喜好更换为 Gemma 或其他模型,非常方便。我自己把大部分模型都试了一下,目前 gemma:7b  是最香的,期待马斯克的 Grok-1。


06


你的玩具交流


一切准备就绪后,就是与你的 LLM 玩具互动的时刻了。开启玩具背后的开关进行通电,耳朵中的蓝色闪烁灯表明玩具已进入配对模式。

f4e3ba8758704b4483acb3884109ddca.webp

打开你的手机或电脑,选择“FoloToy-xxxx”无线网络。片刻之后,你的手机或电脑将自动打开一个配置页面,在这里你可以设置要连接的 WiFi 网络(SSID 和密码),以及 MQTT 服务器地址(如 192.168.x.x)和端口号(保持默认的 1883)。

a6986579de86d939fd071f0a98743070.webp

配置完成并连接到服务器后,按下中间的大圆形按钮开始对话。你停止说话后,FoloToy 将发出哔的一声,表示录音结束。

周围的 7 个圆形小按钮是角色切换按钮。点击后,角色切换即刻生效。


07


调试


无论是服务器还是玩具,你可能会遇到一些技术问题。本节将提供一些基本的调试技巧和工具,帮助你诊断和解决可能的问题,确保你的 LLM 玩具能够顺畅运行。

服务器调试

要检查服务器日志,请运行以下命令。

      
        docker compose logs -f
      
    

在  docker-compose.yml  文件中可以设置 LOG_LEVEL 来控制日志级别。

玩具调试

eaea003d375b6f3f4491d47b4a931052.webp

Folo Toy 提供了基于 USB 串口的简便调试方式。你可以使用 Folo Toy Web 工具 来调试玩具。

  1. 使用 USB 线将玩具与你的电脑连接。

  2. 打开 Folo Toy Web 工具,然后点击“控制台”按钮以连接到玩具。

  3. 连接后,你应该能在控制台中看到设备的实时日志。

玩具上还有一个 LED 灯,它会以不同的颜色指示玩具的状态。

MQTT 调试

打开 EMQX Dashboard 检查 MQTT 消息以及设备连接状态等。默认的用户名是 admin,密码是 public。无论如何,在你登录后将密码更改为一个安全的密码。


08


高级定制


Folo Toy 还有很多高级的玩法,这里做个简单介绍,抛砖引玉。这一部分适合有一定技术基础的用户,如果你是初学者,可以先跳过。

使用 CloudFlare AI 网关

Cloudflare 的 AI 网关让你能够获得对 AI 应用的可见性和控制权。通过将你的应用连接到 AI 网关,你可以通过分析和日志收集了解人们如何使用你的应用,然后利用缓存、速率限制以及请求重试、模型回退等功能来控制应用的规模。首先,你需要创建一个新的 AI 网关。

然后编辑 docker-compose.yml 文件,将 OPENAI_OPENAI_API_BASE 更改为你的 AI 网关地址,像这样:

      
        services:
      
      
          folotoy:
      
      
            environment: OPENAI_OPENAI_API_BASE=https://gateway.ai.cloudflare.com/v1/${ACCOUNT_TAG}/${GATEWAY}/openai
      
    

c16212cfad51e2fba5c990d96b6a6302.webp

然后你会有一个仪表板,可以看到关于请求、令牌、缓存、错误和成本的指标。

7e6fe7828224b17362772a85f690dd3a.webp

角色语音定制

通过更改角色配置文件中的 voice_name 字段,你可以自定义角色的语音。

Edge TTS 提供了许多可供选择的语音,像这样配置就行:

      
        {
      
      
          "1": {
      
      
            "tts_type": "edge-tts",
      
      
            "tts_config": {
      
      
              "voice_name": "zh-CN-shaanxi-XiaoniNeural"
      
      
            }
      
      
          }
      
      
        }
      
    

这样你的角色就能说陕西话了。

03c1ed2d37a403055ea310f27a22094c.webp

还有个更好玩的,阿里云云语音合成支持个性化人声定制,你可以用自己的声音进行训练,然后在角色配置文件中使用你的声音。这样就能用自己的分身给小朋友讲故事了,是不是很有趣?

声音训练完后会得到一个声音调用 ID,把这个 ID 放到角色配置文件中的 voice_id 字段就行。

      
        {
      
      
          "1": {
      
      
            "tts_type": "aliyun-tts",
      
      
            "tts_config": {
      
      
              "voice_id": "voice-xxxxxxx"
      
      
            }
      
      
          }
      
      
        }
      
    

知识库支持

对于更高级别的定制,比如知识库的支持。建议使用 Dify,它融合了 Backend as Service 和 LLMOps 的理念,涵盖了构建生成式 AI 原生应用所需的核心技术栈,包括一个内置 RAG 引擎。使用 Dify,你可以基于任何模型自部署类似 Assistants API 和 GPTs 的能力。重点说一下内置的 RAG 引擎,它是一个基于检索的生成式模型,可以用于问答、对话、文档摘要等任务。Dify 包括各种基于全文索引或向量数据库嵌入的 RAG 能力,允许直接上传 PDF、TXT 等各种文本格式。把你的知识库上传,就不用担心玩具不清楚背景知识而瞎扯了。

153c81779c904959510ee1de42389df0.webp

dify 可以自行部署 或者直接使用 cloud 版本 。在Folo 上的配置也非常简单:

      
        {
      
      
          "1": {
      
      
            "llm_type": "dify",
      
      
            "llm_config": {
      
      
              "api_base": "http://192.168.52.164/v1",
      
      
              "key": "app-AAAAAAAAAAAAAAAAAAa"
      
      
            }
      
      
          }
      
      
        }
      
    

自定义玩具外形

ac527fe0d7362ebf770043e1c06041fa.webp

从工作原理来说,任意玩具都能够进行改造。Folo Toy 还提供了八爪鱼 AI 开发套件,它可以将任何普通的玩具转变为一个智能对话玩具。这款芯片小巧轻便,可以轻易地放入任何类型的玩具中,无论是毛绒玩具、塑料玩具,还是木制玩具,都能轻松适应。

56b142eaef3a16e2f59990c237789a24.webp

我 DIY 了个陕西话的仙人掌。发挥你的想象力,你可以把它放进你喜欢的玩具中,动起手来也不是特别复杂:

  1. 把玩具打开

  2. 把八爪鱼 AI 开发套件放进去

  3. 关上玩具

服务端仍然是用的同一个,可以通过 sn 给不同的玩具分配不同的角色,这里就不展开了,可以查看官网的配置文档。

安全须知

请注意,绝对不要将密钥公布在如 GitHub 这样的公共平台上,否则密钥可能会被滥用。如果你的密钥被泄露,请立即在平台上删除并重新生成一个新的密钥。

你还可以在 docker-compose.yml 中使用环境变量,并在启动容器时传入,以避免在代码中暴露密钥。

      
        services:
      
      
          folotoy:
      
      
            environment:
      
      
              - OPENAI_OPENAI_KEY=${OPENAI_OPENAI_KEY}
      
    
      
        OPENAI_OPENAI_KEY=sk-...i7TL docker compose up -d
      
    

如果你希望使 FoloToy 服务器在互联网上公开可用,强烈建议加强 EMQX 服务的安全性,并且只允许通过密码访问 EMQX。


09


送一波粉丝福利


DIY 过程中遇到了各种问题,跟 FoloToy 团队也联系上了,他们的技术支持非常给力,帮助我解决了很多问题。如果想购买这款玩具,可以直接在淘宝上搜索 FoloToy(AI 智趣玩具),产品做得确实不错,这里给他们做个友情推广。

购买 Folo Toy 产品,在联系客服时提供我的促销代码 F-001-2,即可享受折扣。购买 Fofo G6 整机可以节省 20 元,购买 Octopus Dev Suit 可以节省 15 元,其他大部分商品也可享受10元折扣,具体请联系客服咨询。

参考:

[1]: https://www.bilibili.com/video/BV1kC4y157od/

[2]:https://docs.folotoy.com/zh/docs/configuration/roles_config/

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter