使用 ChatGPT 搭建微信聊天机器人,基于GPT 3.5/4.0 API实现, 支持个人微信、公众号、企业微信部署,能处理文本、语音和图片,访问操作系统和互联网。
预览
部署后别人就可以和你的微信机器人聊天了,微信机器人后台会调用 ChatGPT 的接口进行对话:
当然也支持语言,还支持画图指令,虽然画的不咋地:
不过语音的话,他会在发送一个 MP3 文件,默认用的是谷歌的文字朗读生成语音的音频,点击文件就会自动播放。
原理
顺便提一句,微信机器人其实就相当于在后台启动一个电脑微信,然后用程序帮你收发消息。
收到消息的时候,程序进行判断要不要回复以及如何回复。
功能
• 多端部署:有多种部署方式可选择且功能完备,目前已支持个人微信,微信公众号和企业微信应用等部署方式
• 基础对话: 私聊及群聊的消息智能回复,支持多轮会话上下文记忆,支持 GPT-3,GPT-3.5,GPT-4 模型
• 语音识别:可识别语音消息,通过文字或语音回复,支持 azure, baidu, google, openai 等多种语音模型
• 图片生成:支持图片生成 和 图生图(如照片修复),可选择
Dell-E,stable diffusion,replicate模型• 丰富插件:支持个性化插件扩展,已实现多角色切换、文字冒险、敏感词过滤、聊天记录总结等插件
• Tool工具:与操作系统和互联网交互,支持最新信息搜索、数学计算、天气和资讯查询、网页总结,基于 chatgpt-tool-hub 实现
如何使用
OpenAI 账号
使用 ChatGPT 实现就是注册 OpenAI 的账号,然后前往 API管理页面 创建一个 API Key,保存 API Key, 后面运行项目的时候需要使用这个 Key。
Key 的格式是:
sk-f6h9AGbtocxTocI7T3BlbkFJl6E0zeX7eFy0EcEEEdddKGeg
项目中默认使用的对话模型是 gpt3.5 turbo,计费方式是约每 500 汉字 (包含请求和回复) 消耗 $0.002,图片生成是每张消耗 $0.016。
开发环境
支持 Linux、MacOS、Windows 系统开发运行,也可以部署在 Linux 作为服务运行。
克隆代码:
git clone https://github.com/zhayujie/chatgpt-on-wechat
cd chatgpt-on-wechat/
安装核心依赖 (必选):
能够创建机器人,并具有文字交流功能所需的最小依赖集合。
# 可以文字聊天,但是不支持语音和画图
pip install -r requirements.txt
拓展依赖 (可选),安装时间比较长,装好之后可以进行语音解析,发送语音,图片生成等任务:
pip install -r requirements-optional.txt
• 其中
tiktoken要求 python 版本在3.8以上,它用于精确计算会话使用的tokens数量,强烈建议安装。• 使用google或baidu语音识别需安装ffmpeg,
• 默认的openai语音识别不需要安装ffmpeg。
• 使用azure语音功能需安装依赖,并参考文档的环境要求。
pip install azure-cognitiveservices-speech
配置
配置文件的模板在根目录的config-template.json中, 需复制该模板创建最终生效的 config.json 文件:
# 如果没有 config.json , 会使用 config-template.json
cp config-template.json config.json
然后在 config.json 中填入配置,以下是对默认配置的说明,可根据需要进行自定义修改(请去掉注释):
{
"open_ai_api_key": "YOUR API KEY", # 填入上面创建的 OpenAI API KEY
"model": "gpt-3.5-turbo", # 模型名称。当use_azure_chatgpt为true时,其名称为Azure上model deployment名称
"proxy": "127.0.0.1:7890", # 代理客户端的ip和端口
"single_chat_prefix": ["bot", "@bot"], # 私聊时文本需要包含该前缀才能触发机器人回复
"single_chat_reply_prefix": "[bot] ", # 私聊时自动回复的前缀,用于区分真人
"group_chat_prefix": ["@bot"], # 群聊时包含该前缀则会触发机器人回复
"group_name_white_list": ["ChatGPT测试群", "ChatGPT测试群2"], # 开启自动回复的群名称列表
"group_chat_in_one_session": ["ChatGPT测试群"], # 支持会话上下文共享的群名称
"image_create_prefix": ["画", "看", "找"], # 开启图片回复的前缀
"conversation_max_tokens": 1000, # 支持上下文记忆的最多字符数
"speech_recognition": false, # 是否开启语音识别
"group_speech_recognition": false, # 是否开启群组语音识别
"use_azure_chatgpt": false, # 是否使用Azure ChatGPT service代替openai ChatGPT service. 当设置为true时需要设置 open_ai_api_base,如 https://xxx.openai.azure.com/
"character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。", # 人格描述
# 订阅消息,公众号和企业微信channel中请填写,当被订阅时会自动回复,可使用特殊占位符。目前支持的占位符有{trigger_prefix},在程序中它会自动替换成bot的触发词。
"subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持角色扮演和文字冒险等丰富插件。\n输入{trigger_prefix}#help 查看详细指令。"
}
配置说明:
个人聊天
个人聊天时,默认需要以 "bot" 或 "@bot" 为开头的内容才能触发机器人, 对应配置项 single_chat_prefix,如果不需要以前缀触发可以填写:
"single_chat_prefix": [""]
机器人回复的内容会以 "[bot] " 作为前缀, 以区分真人的回复, 对应的配置项为 single_chat_reply_prefix,如果不需要前缀可以填写:
"single_chat_reply_prefix": ""
群聊天
群聊天中,群名称需配置在 group_name_white_list 中才能开启群聊自动回复。
如果想对所有群聊生效,可以直接填写:
"group_name_white_list": ["ALL_GROUP"]
• 默认只要被人 @ 就会触发机器人自动回复;
• 另外群聊天中只要检测到以
"@bot"开头的内容,同样会自动回复(方便自己触发),这对应配置项group_chat_prefix。
可选配置:
•
group_name_keyword_white_list:配置项支持模糊匹配群名称,•
group_chat_keyword:配置项则支持模糊匹配群消息内容,用法与上述两个配置项相同。•
group_chat_in_one_session:使群聊共享一个会话上下文,配置["ALL_GROUP"]则作用于所有群聊
语音识别
添加 "speech_recognition": true 将开启语音识别,默认使用 openai 的 whisper 模型识别为文字, 同时以文字回复,该参数仅支持私聊 (注意由于语音消息无法匹配前缀,一旦开启将对所有语音自动回复,支持语音触发画图);
添加 "group_speech_recognition": true 将开启群组语音识别, 默认使用 openai 的 whisper 模型识别为文字,同时以文字回复, 参数仅支持群聊 (会匹配 group_chat_prefix 和 group_chat_keyword, 支持语音触发画图);
添加 "voice_reply_voice": true 将开启语音回复语音(同时作用于私聊和群聊) , 但是需要配置对应语音合成平台的 key,由于itchat协议的限制,只能发送语音mp3文件, 若使用wechaty则回复的是微信语音。
其他配置
•
model: 模型名称,目前支持gpt-3.5-turbo,text-davinci-003,gpt-4,gpt-4-32k(其中gpt-4 api暂未开放)•
temperature,frequency_penalty,presence_penalty: Chat API接口参数,详情参考OpenAI官方文档。•
proxy:由于目前openai接口国内无法访问,需配置代理客户端的地址,详情参考 #351• 对于图像生成,在满足个人或群组触发条件外,还需要额外的关键词前缀来触发,对应配置
image_create_prefix• 关于OpenAI对话及图片接口的参数配置(内容自由度、回复字数限制、图片大小等),可以参考 对话接口 和 图像接口 文档直接在 代码
bot/openai/open_ai_bot.py中进行调整。•
conversation_max_tokens:表示能够记忆的上下文最大字数(一问一答为一组对话,如果累积的对话字数超出限制,就会优先移除最早的一组对话)•
rate_limit_chatgpt,rate_limit_dalle:每分钟最高问答速率、画图速率,超速后排队按序处理。•
clear_memory_commands: 对话内指令,主动清空前文记忆,字符串数组可自定义指令别名。•
hot_reload: 程序退出后,暂存微信扫码状态,默认关闭。•
character_desc配置中保存着你对机器人说的一段话,他会记住这段话并作为他的设定,你可以为他定制任何人格 (关于会话上下文的更多内容参考该 issue)•
subscribe_msg:订阅消息,公众号和企业微信channel中请填写,当被订阅时会自动回复, 可使用特殊占位符。目前支持的占位符有{trigger_prefix},在程序中它会自动替换成bot的触发词。
运行
本地运行
如果是开发机本地运行,直接在项目根目录下执行:
python app.py
或者使用 IDE 运行。
终端输出如下:
输出二维码后,使用微信进行扫码,当输出 Start auto replying 时表示自动回复程序已经成功运行了(注意:用于登录的微信需要在支付处已完成实名认证)。扫码登录后你的账号就成为机器人了。
可以在微信手机端通过配置的关键词触发自动回复 (任意好友发送消息给你,或是自己发消息给好友)。
特殊指令:用户向机器人发送 #reset 即可清空该用户的上下文记忆。
Docker 部署
项目中包含 compose 文件可以直接运行:
docker compose up -d
Railway部署 (✅推荐)
Railway每月提供5刀和最多500小时的免费额度。
可以直接在项目页面点击 Railway部署 按钮,使用模板部署。
也可是 clone 项目然后在新增部署。
记得配置 open_api_key:
然后在 Deploy Tab 页找到部署记录,点击 View Logs:
插件
项目的一大特色就是对插件的支持,当然你也可以实现自己的插件。
banwords
简易的敏感词插件,暂不支持分词,请自行导入词库到插件文件夹中的 banwords.txt,每行一个词,一个参考词库是1。
使用前将config.json.template复制为 config.json,并自行配置。
目前插件对消息的默认处理行为有如下两种:
• ignore : 无视这条消息。
• replace : 将消息中的敏感词替换成"*",并回复违规。
•
"action": "replace",
"reply_filter": true,
"reply_action": "ignore"
在以上配置项中:
• action: 对用户消息的默认处理行为
• reply_filter: 是否对ChatGPT的回复也进行敏感词过滤
• reply_action: 如果开启了回复过滤,对回复的默认处理行为
bdunit
利用百度UNIT实现智能对话
1. 解决问题:chatgpt无法处理的指令,交给百度UNIT处理如:天气,日期时间,数学运算等
2. 如问时间:现在几点钟,今天几号
3. 如问天气:明天广州天气怎么样,这个周末深圳会不会下雨
4. 如问数学运算:23+45=多少,100-23=多少,35转化为二进制是多少?
使用说明:
首先获取 apikey :
在百度UNIT官网上自己创建应用,申请百度机器人,可以把预先训练好的模型导入到自己的应用中,
参考:
• https://ai.baidu.com/unit/home#/home
• https://console.bce.baidu.com/ai平台申请
将文件夹中 config.json.template 复制为 config.json。
在其中填写百度UNIT官网上获取应用的 API Key 和 Secret Key
{
"service_id": "s...", #"机器人ID"
"api_key": "",
"secret_key": ""
}
role
用于让Bot扮演指定角色的聊天插件,触发方法如下:
•
$角色/$role help/帮助- 打印目前支持的角色列表。•
$角色/$role <角色名>- 让AI扮演该角色,角色名支持模糊匹配。•
$停止扮演- 停止角色扮演。• 添加自定义角色请在
roles/roles.json中添加。
(大部分prompt来自 https://github.com/rockbenben/ChatGPT-Shortcut/blob/main/src/data/users.tsx )
以下为例子:
{
"title": "写作助理",
"description": "As a writing improvement assistant, your task is to improve the spelling, grammar, clarity, concision, and overall readability of the text I provided, while breaking down long sentences, reducing repetition, and providing suggestions for improvement. Please provide only the corrected Chinese version of the text and avoid including explanations. Please treat every message I send later as text content.",
"descn": "作为一名中文写作改进助理,你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性,同时分解长句,减少重复,并提供改进建议。请只提供文本的更正版本,避免包括解释。请把我之后的每一条消息都当作文本内容。",
"wrapper": "内容是:\n\"%s\"",
"remark": "最常使用的角色,用于优化文本的语法、清晰度和简洁度,提高可读性。"
}
• title: 角色名。
• description: 使用$role触发时,使用英语prompt。
• descn: 使用$角色触发时,使用中文prompt。
• wrapper: 用于包装用户消息,可起到强调作用,避免回复离题。
• remark: 简短描述该角色,在打印帮助文档时显示。

