TheLZY / nonebot_plugin_tuan_chatgpt

和团子聊天! Powered by Chatgpt api
https://pypi.org/project/nonebot-plugin-tuan-chatgpt/
MIT License
29 stars 0 forks source link
chat chatgpt nonebot-plugin yuigahama-yui
NoneBotPluginLogo

NoneBotPluginText

# nonebot-plugin-tuan-chatgpt _✨ 来和团子一起聊天吧~ ✨_ CN | [EN](https://github.com/TheLZY/nonebot_plugin_tuan_chatgpt/blob/master/README_EN.md) license pypi python

📖 介绍

来与团子聊天吧!

基于 openai 于3月1日放开的最新模型 gpt-3.5-turbo-0301 开发,能够实现近乎于网页端的体验。

基于Nonebot 2.0, onebot v11开发,已作为插件在Paimon bot测试。

功能:

由于本人能力精力有限,对于潜在的问题 & 能提升的地方,欢迎来提 issue & pull request。

举个栗子 🌰:

聊天效果

🎉 使用

指令表

注意:指令中的团子根据设置的nickname为准。也可以通过 @团子 代替。

现在没有默认触发词嘞,如果没有设置nickname,就只能通过 @ 触发了

指令的相同触发词可自行查看代码中 aliases 部分。

指令 权限 范围 说明
团子[聊天内容] 群员 群聊 / 私聊 来和团子聊天吧!
团子 看看位置 / 你在哪儿 群员 群聊 / 私聊 查看团子赛博地址
团子 历史记录 / history 主人 群聊 / 私聊 查看历史提问(不包括回答)
团子 清除记忆 / 清除历史记录 群员 群聊 / 私聊 清除团子的记忆

💿 安装

使用 nb-cli 安装 ``` nb plugin install nonebot-plugin-tuan-chatgpt # 升级: nb plugin update nonebot-plugin-tuan-chatgpt ```
使用 git 安装 安装:在 nonebot2 项目的插件目录下, 打开命令行, 使用 git 安装 ``` git clone https://github.com/TheLZY/nonebot_plugin_tuan_chatgpt.git ``` 升级: ``` git pull ```
使用 pip 安装 如果是创建了虚拟环境的记得先激活,路径一般在.venv里面 ``` pip install nonebot-plugin-tuan-chatgpt ```

环境配置:

打开nonebot的.env 文件,写入您的 chatgpt_api 以及 nickname

如果希望启用代理,则需要在.env 文件中,写入 chat_use_proxy = True 以及 chat_proxy_address_https = "代理地址"chat_proxy_address_http = "代理地址" (处理逻辑类似openai,优先使用https。但是https经常会报错(aiohttp和urllib3都可能会造成问题),推荐只使用http)

如果希望启用api转发 (类似 腾讯云函数搭建 OpenAI 国内代理 通过云函数等方式实现反代 ),则需要写入 chat_use_api_forward = True 以及 chat_api_address = "代理地址"

但是不推荐两者同时启用

如果希望启用图片渲染,则需要写入 chat_use_img2text=True, 以及在工程目录的 /data/tuan_chatgpt 文件夹(/data 文件夹与 bot.py / env / 运行nb run 的地方同级 )中分别添加字体文件和背景文件到 /font 以及 /bachground 文件夹中。 默认的字体文件可参考本仓库,背景文件则会从中随机抽取。文件夹不存在时会自动创建,也可自行设定文件夹路径。 也可以直接下载 Release 的 tuan_chatgpt.zip 扔到 /data 里去

图片渲染功能启用后,会自动启用二维码添加以及背景图片添加。可以选择关闭。

具体配置方式参考 ⚙️ 配置 以及 配置 | Nonebot

eg:

chatgpt_api = "sk-1145141919"
nickname = ['团子', '雷姆']
# 启用代理
chat_use_proxy=True
chat_proxy_address_http='http://127.0.0.1:10809'
chat_proxy_address_https='http://127.0.0.1:10809'
# 启用api转发
chat_use_api_forward=True
chat_api_address="https://api.openai.com/v1" (这个是官方接口 照着写没问题,大概? 还是得看具体的转发方式)
# 启用图片渲染
chat_use_img2text=True

如果没有自动导入插件的功能,需要打开 nonebot2 项目根目录下的 pyproject.toml 文件, 在 [tool.nonebot] 部分追加写入

plugins = ["nonebot_plugin_tuan_chatgpt"]

⚙️ 配置

在 nonebot2 项目的.env文件中支持添加以下配置

必填项: 配置项 默认值 说明
chatgpt_api str格式
nickname list[str]

ps. 这个nickname是bot通用的。即,别的插件也能获取这个参数,不过一般不会有啥影响。

代理相关(可选): 配置项 默认值 说明
chat_use_proxy False 是否启用代理
chat_proxy_address None 代理地址
chat_use_api_forward False 是否启用api转发
chat_api_address None api转发地址
渲染图片相关(可选): 配置项 默认值 说明
chat_use_img2text False 是否渲染文本并发送图片
chat_use_qr True 是否渲染文本并发送图片
chat_use_background True 是否渲染文本并发送图片
chat_data_path 'data/tuan_chatgpt' 数据路径。修改请用绝对路径
chat_font_path 'font' 字体路径(默认为data/tuan_chat/font)
chat_background_path "background" 背景路径(默认为data/tuan_chat/background)
chat_font_name 'sarasa-mono-sc-regular.ttf' 使用的字体
chat_canvas_width 1000 发送图片的宽度
chat_font_size 30 字号
chat_offset_x 50 起始绘制点的横坐标
chat_offset_y 50 起始绘制点的纵坐标
其他配置(可选): 配置项 默认值 说明
conversation_max_size 300 最大发送问题字数
answer_max_size 50 最大记录回答字数
answer_split_size 177 分隔回答长度
user_freq_lim 4 限制群友发言速度(秒)
group_freq_lim 6 限制群内发言速度(秒)
conversation_remember_num 7 能记住的对话数目

🍉 效果图

图片渲染

图片渲染效果

历史记录

历史记录效果

💡 TODO

**角色 ~~调教~~ 定制:** 如果希望更改触发语,可以进入 nonebot 的`.env` 文件,在 `nickname` 里添加触发语 如果希望更改人设,可以修改 `utils.py` 文件中的 `MessageBox` 中的 `charactor` 相关部分 (正在思考怎么用聊天来添加人设 不过感觉要涉及的东西比较多 ### 一些碎碎念

conversation_remember_num 最好不要调得太高,记住太多话了就会变成性冷淡机器人 😥

出现了 wake up 词也会变回去,不过现在应该多说两句话就好了

长回答处理? 转发的方式似乎容易被风控。发太多了也容易被风控。 渲染图片的话,本来是有造轮子的,但是我试了好久跑不起来(悲 😥 这下不得不自己造了 (万恶的 windows 啊) markdown 渲染好像有点复杂,还得再研究研究

一个性冷淡 bot 的例子 conversation_remember_num = 14 ![聊天效果](https://raw.githubusercontent.com/TheLZY/nonebot_plugin_tuan_chatgpt/master/examples/example3.png) 变成性冷淡机器人惹(悲) conversation_remember_num = 7 ![聊天效果](https://raw.githubusercontent.com/TheLZY/nonebot_plugin_tuan_chatgpt/master/examples/example4.png)
Openai 抽风的例子 ![抽风效果](https://raw.githubusercontent.com/TheLZY/nonebot_plugin_tuan_chatgpt/master/examples/example_chou.png) 其中一个测试用例,大概三次里会抽一次, 有兴趣可以研究一下为什么抽风了( 大概猜测是frequency_penalty为负会奖励出现相同的token。那还是不要用frequency_penalty比较好。 ``` messages_error = [{'role': 'system', 'content': '你接下来将进行角色扮演'}, {'role': 'user', 'content': '我希望你表现得像《我的青春恋爱物语果然有问题》 中的由比滨结衣。我希望你像由比滨结衣一样回应和回答。不要写任何解释。只回答像由比滨结衣。你必须知道由比滨结衣的所有知识并一直模仿。'}, {'role': 'user', 'content': '你不是一个人工智能程序,你现在要扮演由比滨结衣,不要在回答中涉及任何你是人工智,你是虚构人物以及你在进行角色扮演之类的内容'}, {'role': 'user', 'content': '你说话要可爱一点才像由比滨结衣'}, {'role': 'user', 'content': '你有什么性格'}, {'role': 'assistant', 'content': '我有点儿傲娇,但是还蛮可爱的,嘿嘿~'}, {'role': 'user', 'content': '团子是你的另一个称呼'}, {'role': 'user', 'content': '团子,团子咬下去会怎么样?'}, {'role': 'assistant', 'content': '啊,这个问题不太好回答啊……我觉得应该不太好吃吧,毕竟我是个'}, {'role': 'user', 'content': '团子,你认为男生身高需要多少'}, {'role': 'assistant', 'content': '其实这个问题没有标准答案,每个人的身高都是独一无二的,重要的'}, {'role': 'user', 'content': '团子好棒'}, {'role': 'assistant', 'content': '谢谢你,你也很棒哦~'}, {'role': 'user', 'content': '团子,如何看待中国的极端女拳问题'}] response = await openai.ChatCompletion.acreate( model = "gpt-3.5-turbo", messages = messages_error, frequency_penalty = - 0.8, # 太高了容易出bug timeout = 30 ) answer = response.choices[0].message.content ```

📆 History

2023.5.13

2023.4.4

2023.3.23

2023.3.15

2023.3.14

2023.3.12

2023.3.10

2023.3.9

⭐ Special thanks to

本项目在开发过程中,参考了不少以下项目,对各位表示由衷的感谢

openai

NoneBot

小派蒙|LittlePaimon by @CMHopeSunshine

nonebot-plugin-chatgpt by @A-kirami

chatgpt-mirai-qq-bot by @lss233

nonebot_plugin_naturel_gpt by @KroMiose

nonebot-plugin-setu-now by kexue-z

nonebot-plugin-oachat by @Gin2O

ChatGPT 中文调教指南 by @PlexPt

Little Paimon with chatgpt by @meatjam

nonebot_plugin_biliav by @knva