本文是一个集成了 ChatGPT 的简单微信机器人的部署文档,使用了现有的 github 仓库,并进行适当修改,并发布成公共镜像包。当前文档说明为 2.0 镜像包。

说明

在这个项目(https://github.com/wangrongding/wechat-bot)的基础上进行的修改:

  • 从 openai 改回了 chatgpt 的调用。
  • 修改了 chatgpt 的对话模型,现在有两种机器人: 群机器人和私人机器人。
  • 在群里,用群机器人开头的文字会训练群机器人,用私人机器人名字开头的可以训练私有机器人。
  • 与机器人私聊也要以机器人的名字开头,私聊的时候用两种机器人名字开头都会训练私有机器人。
  • 增加了错误处理,当出错的时候,现在机器人能做出响应了。

镜像地址:

https://hub.docker.com/r/cloudbeer/wx-chatbot/tags

部署

在 K8S 中部署

部署 YAML 参考如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wx-chatbot
  labels:
    app: wx-chatbot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wx-chatbot
  template:
    metadata:
      labels:
        app: wx-chatbot
    spec:
      containers:
        - name: wx-chatbot
          image: cloudbeer/wx-chatbot:2.0
          env:
            - name: OPENAI_API_KEY
              value: [your-api-key]
            - name: BOT_NAME
              value: [your-bot-name]
            - name: ROOM_BOT_NAME
              value: [your-room-bot-name]
          command:
            - node
            - index.js

修改上面代码中的环境变量 [your-api-key], [your-bot-name][your-room-bot-name]

  • OPENAI_API_KEY: 在 openai 网站申请的 API_KEY,当前申请地址是: https://platform.openai.com/account/api-keys

  • BOT_NAME: 私人机器人的名字,当发送以这个名字开头的文字的时候,会调用 chatgpt,如 BOT_NAME 为 hisiri 的时候,发送:hisiri 你好 会得到 ChatGPT 的响应。

  • ROOM_BOT_NAME: 群机器人名字,这个机器人的会话是基于群的,群内的所有人都可以训练同一个机器人。

  • 你可以在群里分别和两个机器人对话。

部署完成之后,使用 logs 命令查看二维码,相关的命令如下:

kubectl logs wx-chatbot-xxxxxxx -f
  • -f 可以持续打印日志,查看控制台信息。
  • 使用微信扫码之后,当前扫码的微信会成为 ChatGPT 机器人。你可以和他私聊或者拉到群里。
  • 聊天的时候需要分别以 2 个机器人的名字开头才能做出响应。

Docker 启动

Docker 启动不再赘述,使用如下命令即可:

docker run --rm -it --name wx-chatgpt-bot \
  -e OPENAI_API_KEY=abc -e BOT_NAME=小米 -e ROOM_BOT_NAME=大米 \
  cloudbeer/wx-chatbot:2.0 node index.js
  • 记得修改三个环境变量:-e OPENAI_API_KEY=abc -e BOT_NAME=@siri
  • 注意:此命令在 MAC 启动有bug。用 linux 系统无虞。

问题和改进点

  • 免费账号 ChatGPT 测会经常报 429 Too Many Requests 的错误。
  • 微信可能会被封,建议使用新注册的微信小号作为机器人。(暂且不清楚微信侧触发机制)
  • 重启应用会重新加载微信的会话,导致重复调用 ChatGPT API,并由可能导致微信被封,重启应用的时候多等一会儿,让会话过期,或者修改两个bot 的名字后重启。