大数跨境
0
0

chatgpt-on-wechat: 使用ChatGPT搭建微信聊天机器人

chatgpt-on-wechat: 使用ChatGPT搭建微信聊天机器人 数翼
2023-06-07
0
导读:使用 ChatGPT 搭建微信聊天机器人,基于GPT 3.5/4.0 API实现, 支持个人微信、公众号、企业微信部署,能处理文本、语音和图片,访问操作系统和互联网。

使用 ChatGPT 搭建微信聊天机器人,基于GPT 3.5/4.0 API实现, 支持个人微信、公众号、企业微信部署,能处理文本、语音和图片,访问操作系统和互联网。

预览

部署后别人就可以和你的微信机器人聊天了,微信机器人后台会调用 ChatGPT 的接口进行对话:

使用关键字聊天

当然也支持语言,还支持画图指令,虽然画的不咋地:

使用语音和文生图功能

不过语音的话,他会在发送一个 MP3 文件,默认用的是谷歌的文字朗读生成语音的音频,点击文件就会自动播放。

原理

顺便提一句,微信机器人其实就相当于在后台启动一个电脑微信,然后用程序帮你收发消息。

收到消息的时候,程序进行判断要不要回复以及如何回复。

功能

  • • 多端部署:有多种部署方式可选择且功能完备,目前已支持个人微信微信公众号企业微信应用等部署方式

  • • 基础对话: 私聊群聊的消息智能回复,支持多轮会话上下文记忆,支持 GPT-3GPT-3.5GPT-4 模型

  • • 语音识别:可识别语音消息,通过文字或语音回复,支持 azurebaidugoogleopenai 等多种语音模型

  • • 图片生成:支持图片生成 和 图生图(如照片修复),可选择 Dell-Estable diffusionreplicate 模型

  • • 丰富插件:支持个性化插件扩展,已实现多角色切换、文字冒险、敏感词过滤、聊天记录总结等插件

  • • 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-turbotext-davinci-003gpt-4gpt-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_chatgptrate_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

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. 1. 解决问题:chatgpt无法处理的指令,交给百度UNIT处理如:天气,日期时间,数学运算等

  2. 2. 如问时间:现在几点钟,今天几号

  3. 3. 如问天气:明天广州天气怎么样,这个周末深圳会不会下雨

  4. 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: 简短描述该角色,在打印帮助文档时显示。


【声明】内容源于网络
0
0
数翼
专注 AIGC 人工智能知识传播和实践
内容 228
粉丝 0
数翼 专注 AIGC 人工智能知识传播和实践
总阅读124
粉丝0
内容228