本项目旨在帮助大家搭建基于微信公众号的 ChatGPT 智能助理。
上几个聊天截图,大家先睹为快。
如果想直接体验,可以在以下公众号发起聊天(看不到图片的同学请微信搜索:Bright 技术 人生):
(注意:以上公众号系个人微信公众号,使用 OpenAI 的免费额度,每人每天只能对话 20 次。详见项目代码默认设置。后续,可能限制更加严格。如果对本人公众号内容感兴趣,欢迎关注。否则,请试用后取关,以免受可能的消息打扰。)
为什么 OpenAI 开放了网页版本的聊天功能之后,还需要一个基于微信公众号的版本?主要原因是:
- 国内网络无法直接访问
- 网页版本体验较差,无法在任意时刻任意地点有手机就能用
微信作为一个广泛使用的专业的聊天软件,是智能助手的理想载体。
项目的目标是提供一套可用的代码及尽可能简单完善的步骤,帮助一般开发人员通过几步操作就能搭建自己的微信智能助理。
本项目不会致力于让代码具备高性能和支持高并发,因为出于个人用途(或者小的团体,比如家庭),这些特性是没必要的,只能白白的增加复杂度。
如果希望基于此项目,搭建并发布自己的对外公共服务,出现的一切问题,请自行负责。
借助云服务的能力及微信的免费开放服务,可以零成本搭建一个智能助手。
主要需要完成以下几步:
- 注册 aws 云服务账号,并启动虚拟机
- 注册 OpenAI 开发者账号,获取 token
- 注册微信公众号
- 配置微信公众号自动回复
- 部署此服务
完成上述步骤需要具备一定的技术基础,熟练的同学应该可以很快搞定。下面给不太熟悉相关技术和服务的同学简要说明一下如何完成。
上述除第一步之外的所有步骤的前提是一台海外的虚拟机,否则无法访问 OpenAI 的文档和服务。具体如何申请?请参考:
- 如何创建并激活新的 AWS 账户: https://aws.amazon.com/cn/premiumsupport/knowledge-center/create-and-activate-aws-account/
- AWS 免费套餐介绍:https://aws.amazon.com/cn/premiumsupport/knowledge-center/what-is-free-tier/
- EC2 介绍及准备工作:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html
- 启动实例:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html
由于我们只是个人使用,AWS 的免费套餐已经够我们折腾很久了。因此这一步也不需要花费任何费用。
有了虚拟机之后,可以通过虚拟机的网络访问 OpenAI 的文档和服务。
具体做法很多,以下是一种简单易行的方式(以下假定你的虚拟机是基于 Ubuntu 的系统,其它系统的对应命令可以类比):
- 在虚拟机中安装并启动代理服务:
sudo apt-get install squid
- 通过 ssh 隧道将远程主机的代理映射到本地:
ssh -L 3128:localhost:3128 {YOUR_EC2_USER_NAME@YOUR_EC2_INSTANCE}
- 本地安装 Firefox,并配置代理为 http://localhost:3128(Firefox 的好处是其代理是独立的,不会和系统的冲突)
- 用 Firefox 打开 OpenAI 的网站,并注册开发者账号
- 生成 token 并记录此 token: https://platform.openai.com/account/api-keys
参考微信的文档:https://kf.qq.com/faq/120911VrYVrA151009eIrYvy.html
本项目使用微信公众号的自动回复功能来搭建智能助理,所以,注册时,请选择公众号类型为个人微信订阅号。
参考这里的文档配置微信公众号服务器:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
配置服务器 URL 时,如果使用默认端口配置(9090),请填写:http://{YOUR_INSTANCE_IP}:9090/wechat
配置一个比较复杂的 token,并记录下此 token。此 token 用于验证微信服务器发送过来的消息。
在部署之前,需要将前面的各类 token 放置到一个配置文件中。复制一下项目中的.env.tpl
文件为.env
文件。并将以上步骤中记录的 token 设置到对应的地方。
除了上述的 token 之外,本项目还支持以下配置(对于以下配置,如果不配置,请留空):
wechat_token
: 在配置微信公众号自动回复中配置的 token。必填。chat_gpt_token
: 在注册 OpenAI 开发者账号中配置的 token。必填。token
: 一个用于通过发消息管理此服务的 token。详见下文功能说明章节。建议填写。http_proxy
: 可选的配置,用于设置访问 OpenAI 服务的代理服务器。admin_user_ids
: 管理员用户微信 ID 列表(获取方式见下文),逗号分隔。管理员可以通过发特定消息的方式管理此服务。详见下文功能说明章节。建议填写。white_list_user_ids
: 白名单用户微信 ID 列表,白名单内的用户聊天无限制。admin_email
: 管理员邮箱,用于在用户超过当日对话次数时提醒用户联系管理员。建议填写。
本项目实现了一些简易的脚本,以便我们可以快速完成部署。
运行以下命令可以一键将服务部署到你的虚拟机:
# 如果需要将服务部署到其他端口,请增加参数 PORT={YOUR_POTR}
make deploy DEPLOY_HOST={YOUR_EC2_USER_NAME@YOUR_EC2_INSTANCE}
(注意:运行此命令需要事先在虚拟机中安装docker
,参考这里安装。)
部署完成之后,将会有一个服务在你的虚拟机中启动,默认端口为9090
。你可能需要将此端口开放到互联网,参考这里。
完成部署之后,可以在微信公众号中发消息测试。
- 验证微信消息签名
- 调用 OpenAI 的 API 发起聊天
- 管理聊天会话
- 支持多人同时独立对话互不影响
- 处理微信公众号 API 返回时间限制
- 处理对话太长导致的 token 超长问题
- 定期清理聊天会话
- 记录基本聊天统计信息
- 获取微信 ID:发送消息"My ID"或者"我的微信 ID"可获取微信 ID(用于辅助管理此服务)
本项目支持管理员用户通过微信公众号消息管理服务。目前支持的管理功能包括:对话权限管理、对话次数限制、获取对话统计等。
一共定义了以下几类管理命令:
add_white_list
: 添加白名单用户。参数为用户的微信 OpenID,可从日志中获取。remove_white_list
: 移除白名单用户。参数为用户的微信 OpenID,可从日志中获取。set_limit
: 设置用户对话次数限制。参数为用户的微信 OpenID 及每日对话次数限制,以逗号分隔,如user_a,100
表示限制 OpenID 为user_a
的用户的每天对话次数为 100 次。set_token
: 设置管理员 token。参数为新的 token 值。get_config
: 获取配置。无参数,可将参数行设置为 1。get_stat
: 获取对话统计。无参数,可将参数行设置为 1。
调用命令的方式是通过微信公众号发特定格式的消息。
消息格式如下(消息必须包含三行):
admin-command:{YOUR_ADMIN_TOKEN}
{COMAND_NAME}
{COMMAND_ARGS}
- 处理用户发送的图片消息
- 配置公众号关注消息
- 消息加解密
- 更多的管理接口
- 持久化消息存储
- 让用户配置模型参数