牙叔教程 简单易懂
你只需要写一个开头
剩下的交给ChatGPT
视频查看效果
两个ChatGPT互聊-写小说_哔哩哔哩_bilibili
这是一种ChatGPT的展现方式, 他把你主动问ChatGPT的这种方式,
改为了ChatGPT和ChatGPT聊天的方式
我们只需要写一个开头, 小说的后续部分, 完全都交给了ChatGPT,
算是某种程度上的 AutoGPT
AutoGPT
AutoGPT 是一个实验性的开源的主动的人工智能,它利用 GPT4 作为大脑,利用 langchain 的链接思想,把 Google 等工具链接起来,以完成人类给予的任务。
人类只需要给它设置一个目标,它就会自主规划出任务,并一步步地执行任务。
如果在执行任务中遇到问题,会自主地拆解子任务,并一步步地执行。
Github 项目地址,项目完全开源 GitHub - Significant-Gravitas/Auto-GPT: An experimental open-source attempt to make GPT-4 fully autonomous.
Auto-GPT is an experimental open-source application showcasing the capabilities of the GPT-4 language model. This program, driven by GPT-4, chains together LLM "thoughts", to autonomously achieve whatever goal you set. As one of the first examples of GPT-4 running fully autonomously, Auto-GPT pushes the boundaries of what is possible with AI.
我理解的AutoGPT是这样的:
- 你提出一个任务
- chatGPT拆解任务
- AutoGPT通过代码执行任务
- 出错了, 就把错误信息抛给chatgpt, 获取解决方案
- 用解决方案解决遇到的问题
- 重复以上, 直到任务完成
这里面最有价值的就是作者真的把chatgpt和程序结合起来, 并且写出来了,
完全没有了人工的限制, 不需要人类了, autoGPT自己就呼呼的干活了.
以上是给大家扩展chatggpt的知识, 接下来我们搭建这个qqGPT写小说
流程图
机器人框架
zhin
zhin - npm
关键代码
机器人监听QQ消息
ctx.middleware(async (session, next) => {let gptQuestion = session.elements[0].toString().trim(); ... });
可以从代码看到使用了插件
没错, 这个框架主要就是写插件
参数session里面包含了消息
- user_id
- user_name
- group_id
- gptQuestion
- protocol
- self_id
- message_type
- from_id
基本上你需要的数据, 都可以在session中获取
你不可能在Q群里面写小说, 所以一定是私聊
if (session.message_type === "private") { ... }
根据消息类型, 如果是私聊, 巴拉巴拉巴拉
这还不够, 还要加判断, 不可能谁私聊你都给他发消息, 对吧?
所以还要加上号码限制
if (customerIds.indexOf("" + session.user_id) !== -1) {...}
谁私聊我? 在不在我的白名单里面? 以上代码就是解决使用机器人的资格问题
消息收到以后, 我们通过chatgpt去获取小说的后续内容
async function chatgpt(question) {let url = "https://api.openai.com/v1/chat/completions";let headers = {"Content-Type": "application/json",Authorization: "Bearer " + config.secretKey,};let data = {model: "gpt-3.5-turbo",messages: [{ role: "user", content: question },{role: "system",content:`你是一个小说家, 想象力超越普通人一万倍, 擅长模仿"海贼王"作者尾田荣一郎(Eiichiro Oda) 的风格写小说, 你现在看到了海贼王最新一期漫画的中一部分文字内容, 现在请你续写小说 遵循以下原则: 1. 小说中的人物都要有名字, 人物的名字不能重复. 2. 小说中的人物使用的招式,武功, 装备, 魔法, 宠物, 恶魔果实, 等小说元素, 都要有名字, 不能重复. 3. 小说用中文写, 不能用英文. 3. 其他就靠你的想象力自由发挥了. --------------------------------------- 好了, 现在你可以在遵守以上原则的情况下, 续写小说了. 你每次回复时, 请不要超过66个字, 也不要超过2句话.`,},],temperature: 0.7,max_tokens: 1000,top_p: 1,frequency_penalty: 0,presence_penalty: 0,stream: false,};try {let res = await axios.post(url, data, {headers: headers,httpsAgent: agent, // 设置代理});return res.data.choices[0].message.content;} catch (e) {let errorMsg = e?.response?.data?.error?.message ? e.response.data.error.message : e.message;console.log(errorMsg);return "出错了: " + errorMsg;} }
注意这里有两个用户
chatgpt的角色
- user
- system
user就是我们.
system就是你给chatgpt设置的角色
chatgpt字数限制
第一种
我是通过 截取新数据, 抛弃旧数据;
比如数据有5000个字, 我就裁掉2000个字, 然后再发给chatgpt;
这个策略基于如下假设:过于久远的对话不太重要,而距离当前时间更近的对话则更加重要。
第二种
你也可以用chatgpt把文章压缩: 比如让chatgpt把1000个字压缩成500个字, 也就是 文本摘要
然后提交压缩后的数据给chatgpt
第三种, 向量存储
把文本存到外部设备, 然后用一个向量, 也就是一串数字代替他,
然后把问题也变成向量, 看哪个向量接近, 就用哪个数据,
大概思路就这么回事, 具体可看知乎文章: 如何看本周最火的AutoGPT?
如何看本周最火的AutoGPT? - 知乎
提取chatgpt报错的消息
let errorMsg = e?.response?.data?.error?.message ? e.response.data.error.message : e.message;
如果只是写e.message, 他的报错信息几乎只是对你说404, 就没了.
e.response.data.error.message的消息, 更详细一些
接收到chatgpt返回的消息, 我们要把消息发送给qq
获取机器人
let bot = ctx.zhin.pickBot(protocol, self_id);
这两个参数是啥意思就不知道了, 我是直接赋值黏贴, 能用就行
第一个不知道, self_id应该是机器人的qq号
机器人发消息
bot.sendMsg(from_id, "private", answer);
from_id就是跟你聊天的用户的qq号,
answer就是chatgpt返回的内容
基本关键代码和思路就是这样,
然后就是重复这个过程,
一篇chatgpt对话式小说就诞生了
chatgpt写的小说
微信公众号 牙叔教程