之前给咱们写过怎么将 ChatGPT 接入微信和钉钉,没看过的能够往大众号前面的文章翻翻,最近又发现了一个风趣的玩法,周末找时刻完成了一下,感觉挺不错的,共享给咱们。

布景

事情的原因是在朋友圈看到了这样一条信息,灵敏信息现已去掉了,意思很明显就是将 OpenAI 接入到常识星球了,用户能够经过星球发问的方式来对 OpenAI 进行发问,OpenAI 会主动答复相应用户的问题,并告诉到用户。

又发现了一个有趣的 ChatGPT 玩法,分享给大家

看到这就很有意思了,关于运营了常识星球的博主来说,特别是技能类博主,许多简略的技能常识点,完全就能够经过主动化来进行答复,而不用太消耗自己的时刻。

那有的小伙伴就要问了,这跟用户自己百度有什么区别呢?

只要用过 OpenAI 的小伙伴是深有体会的,百度查找出来的答案广告许多不说,要在大量相似的内容中找到有用了,往往仍是要花点时刻的。

OpenAI 供给的答案往往思路清晰,头头是道,虽然说关于许多时效性的问题给不了切当的答案,可是关于一些技能常识点的答复仍是能够很精准的。

下面是阿粉看到的一些 case,咱们能够瞅瞅

能够写代码

又发现了一个有趣的 ChatGPT 玩法,分享给大家

会答复问题

又发现了一个有趣的 ChatGPT 玩法,分享给大家

会写大纲

又发现了一个有趣的 ChatGPT 玩法,分享给大家

会剖析功用

又发现了一个有趣的 ChatGPT 玩法,分享给大家

搭建

上面的 case 看完了,那么接下来就能够开端着手搭建了,首先要知道咱们该怎么完成这个主动智能答复功用,思路很简略,就是先获取待答复的问题列表,然后遍历问题恳求 OpenAI 的接口,然后再将回来的成果回写告诉对应的用户,这个进程咱们需求经过守时使命轮询去处理。

综上所述,咱们需求预备下面这些东西

  1. 一个能够被发问的常识星球账号,也就是被发问者;

  2. OpenAI 账号对应的 API KEY,这一步相对会稍微费事一点,不过之前的文章都供给过思路怎么获取,不在本文评论的规模,感兴趣的翻翻前面的文章。这儿提示一下咱们,由于大众号的改版,主张咱们把咱们的大众号标记星标,这样不容易错过好文章。

  3. 调度东西或者调度平台,也能够是 Linux 体系的守时命令;

  4. 完成 API 恳求的程序或者脚本;

编程

上面的四点都是有必要的,可是最主要的当然仍是编写代码,按照咱们上面的思路,咱们这个程序需求调用三个接口

  1. 获取问题列表;
  2. 恳求 OpenAI 获取答案;
  3. 回写答案告诉用户;

下面咱们顺次来看看这三个接口要怎么对接,提前阐明下,阿粉这边为了简略用的调度平台是 XXL-JOB 对应的执行使命脚本是选用 Nodejs 写的。

用预备好的被发问者账号登录网页版的常识星球进入到对应的星球后,能够看到有一个【等我答复】的菜单。

又发现了一个有趣的 ChatGPT 玩法,分享给大家

咱们翻开浏览器的控制台,点击【等我答复】按钮,就能够看到恳求的对应接口地址

又发现了一个有趣的 ChatGPT 玩法,分享给大家

这是咱们第一个要恳求的接口地址,请把它记下来,再经过 request header 拿到对应的 cookie 信息和一些参数过后,这样咱们就能够经过代码来进行接口恳求了,获取到需求答复的问题列表。

var options = {
    url: ZSXQ_UNANSWER_URL,
    headers: {
        'accept': 'application/json, text/plain, */*',
        'cookie': cookie,
        'User-Agent': 'Mozilla/5.0 xxxx',
        'x-timestamp': Math.floor(Date.now() / 1000),
    }
};
request(options, callback);

获取到了问题列表过后,咱们在 callback 回调方法里面就能够开端遍历恳求 OpenAI 接口获取答案了,OpenAI 的接口地址是这个 https://api.openai.com/v1/completions

function callback(error, response, body) {
    if (!error && response.statusCode === 200) {
        let json = JSON.parse(body);
        if (!json.succeeded) {
            console.log("succeeded false")
            process.exit(0)
        }
        if (json.resp_data.topics.length > 0) {
            let length = json.resp_data.topics.length;
            for (let i = 0; i < length; i++) {
                let question = json.resp_data.topics[i].question;
                topicId = json.resp_data.topics[i].topic_id;
                console.log(topicId + ":" + question.text)
                let openRequestOption = {
                    url: OPEN_AI_URL,
                    headers: {
                        "Content-Type": "application/json",
                        "Authorization": "Bearer " + API_KEY,
                        "topicId": topicId
                    },
                    timeout: 120000,
                    body: {
                        "model": "text-davinci-003",
                        "prompt": question.text,
                        "max_tokens": 2000,
                        "temperature": 0.9
                    },
                    json: true
                };
                request.post(openRequestOption, completionsCallBack)
            }
        } else {
            console.log("topics empty")
            process.exit(0)
        }
    } else {
        console.log("get questions error")
        process.exit(-1)
    }
}

将获取到的答案回写到用户,这儿咱们需求第三个地址了,能够跟第一个地址相同进行获取,在页面进行一个答复,就能够获取到对应的答复地址,不过需求咱们自行替换其间的主题 ID,这个比较简略就不截图了,直接上代码。

// 智能答复
function completionsCallBack(error, response, body) {
    if (!error && response.statusCode === 200) {
        if (null != body && body.choices.length > 0) {
            let reply = body.choices[0].text;
            console.log(response.request.headers.topicId + ":" + reply);
            if (null != reply && reply.length > 0) {
                // 答复问题并告诉发问者
                let answerOptions = {
                    url: ZSXQ_ANSWER_URL + "/" + response.request.headers.topicId + "/answer",
                    headers: {
                        'accept': 'application/json, text/plain, */*',
                        'cookie': cookie,
                        'User-Agent': 'Mozilla/5.0 xxx',
                        'x-timestamp': Math.floor(Date.now() / 1000),
                    },
                    timeout: 12000,
                    body: {
                        "req_data": {
                            "image_ids": [],
                            "silenced": silenced,
                            "text": reply
                        }
                    },
                    json: true
                }
                request.post(answerOptions, answerCallBack)
            }
        }
    } else {
        console.log("get answer error")
        process.exit(-1)
    }
}
// 答复后调用
function answerCallBack(error, response, body) {
    if (response.statusCode === 200 && body.succeeded) {
        console.log(":智能答复成功");
        //process.exit(0) 
    } else {
        console.log(":智能答复失败");
        //process.exit(-1)
    }
}

至此相应的功用基本上现已算完成了,有几个细节简略阐明下

  1. 回写答案接口参数中 silenced 代表是否告诉其他人,true 代表只告诉发问者,false 表明告诉所有人,告诉所有人就表明所有人都能看到答复,否则就只有发问者才会看到答复,刚开端调试的时候能够设置成 true,后期上线能够设置成 false
  2. 由于这个功用是需求经过守时使命来触发的,为了避免不必要的费事,能够自行设定合理的守时时刻,比方半夜就别调用了,晚点答复别人问题并不会有什么影响,调度频次也不要太频频,低调运用。
  3. 完好的代码我现已放在后台了,回复关键字【zsxq】获取。

效果

XXL-JOB 上面配置一个 NodeJs 的使命,

又发现了一个有趣的 ChatGPT 玩法,分享给大家

又发现了一个有趣的 ChatGPT 玩法,分享给大家

又发现了一个有趣的 ChatGPT 玩法,分享给大家

能够看到阿粉这边指定了相应时刻才进行查询,能看到能够智能答复成功了,对应在常识星球中也能正常的显示。爽歪歪~

总结

今天又给咱们带来了一种 OpenAI 的玩法,供给了几种玩法都是自己学习研讨的玩法,咱们自己玩玩就好,目的是为了让咱们在遇到新事物和技能的时候能保持着热情,新技能的到来咱们不能保守,而是要迎接。