关于后端:又发现了一个有趣的-ChatGPT-玩法分享给大家

40次阅读

共计 3629 个字符,预计需要花费 10 分钟才能阅读完成。

之前给大家写过如何将 ChatGPT 接入微信和钉钉,没看过的能够往公众号后面的文章翻翻,最近又发现了一个乏味的玩法,周末找工夫实现了一下,感觉挺不错的,分享给大家。

背景

事件的起因是阿粉在朋友圈看到了这样一条信息,敏感信息曾经去掉了,意思很显著就是将 OpenAI 接入到常识星球了,用户能够通过星球发问的形式来对 OpenAI 进行发问,OpenAI 会主动答复相应用户的问题,并告诉到用户。

看到这就很有意思了,对于经营了常识星球的博主来说,特地是技术类博主,很多简略的技术知识点,齐全就能够通过自动化来进行答复,而不必太耗费本人的工夫。

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

只有用过 OpenAI 的小伙伴是深有体会的,百度搜寻进去的答案广告很多不说,要在大量类似的内容中找到有用了,往往还是要花点工夫的。

OpenAI 提供的答案往往思路清晰,条理分明,尽管说对于很多时效性的问题给不了确切的答案,然而对于一些技术知识点的答复还是能够很精准的。

上面是阿粉看到的一些 case,大家能够瞅瞅

能够写代码

会答复问题

会写纲要

会剖析性能

搭建

下面的 case 看完了,那么接下来就能够开始着手搭建了,首先要晓得咱们该如何实现这个主动智能答复性能,思路很简略,就是先获取待答复的问题列表,而后遍历问题申请 OpenAI 的接口,而后再将返回的后果回写告诉对应的用户,这个过程咱们须要通过定时工作轮询去解决。

综上所述,咱们须要筹备上面这些货色

  1. 一个能够被发问的常识星球账号,也就是被提问者;
  2. OpenAI 账号对应的 API KEY,这一步绝对会略微麻烦一点,不过之前的文章都提供过思路如何获取,不在本文探讨的范畴,感兴趣的翻翻后面的文章。这里揭示一下大家,因为公众号的改版,倡议大家把咱们的公众号标记星标,这样不容易错过好文章。
  3. 调度工具或者调度平台,也能够是 Linux 零碎的定时命令;
  4. 实现 API 申请的程序或者脚本;

编程

下面的四点都是必须的,然而最次要的当然还是编写代码,依照咱们下面的思路,咱们这个程序须要调用三个接口

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

上面咱们顺次来看看这三个接口要如何对接,提前阐明下,阿粉这边为了简略用的调度平台是 XXL-JOB 对应的执行工作脚本是采纳 Nodejs 写的。

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

咱们关上浏览器的控制台,点击【等我答复】按钮,就能够看到申请的对应接口地址

这是咱们第一个要申请的接口地址,请把它记下来,再通过 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 的工作,

能够看到阿粉这边指定了相应工夫才进行查问,能看到能够智能答复胜利了,对应在常识星球中也能失常的显示。爽歪歪~

总结

明天又给大家带来了一种 OpenAI 的玩法,阿粉提供了几种玩法都是本人学习钻研的玩法,大家本人玩玩就好,目标是为了让大家在遇到新事物和技术的时候能放弃着激情,新技术的到来咱们不能激进,而是要迎接。

正文完
 0