又發現了一個有趣的 ChatGPT 玩法,分享給大家

来源:https://www.cnblogs.com/zi-you/archive/2023/03/09/17201607.html
-Advertisement-
Play Games

之前給大家寫過如何將 ChatGPT 接入微信和釘釘,沒看過的可以往公眾號前面的文章翻翻,最近又發現了一個有趣的玩法,周末找時間實現了一下,感覺挺不錯的,分享給大家。 背景 事情的起因是阿粉在朋友圈看到了這樣一條信息,敏感信息已經去掉了,意思很明顯就是將 OpenAI 接入到知識星球了,用戶可以通過 ...


之前給大家寫過如何將 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 的玩法,阿粉提供了幾種玩法都是自己學習研究的玩法,大家自己玩玩就好,目的是為了讓大家在遇到新事物和技術的時候能保持著熱情,新技術的到來我們不能保守,而是要迎接。

更多優質內容歡迎關註公眾號【Java 極客技術】,我準備了一份面試資料,回覆【bbbb07】免費領取。希望能在這寒冷的日子里,幫助到大家。

本文來自博客園,作者:zi-you,轉載請註明原文鏈接:https://www.cnblogs.com/zi-you/p/17201607.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Qt 學習筆記全系列傳送門: Qt 學習筆記 - 第一章 - 快速開始、信號與槽 Qt 學習筆記 - 第二章 - 添加圖片、佈局、界面切換 【本章】Qt 學習筆記 - 第三章 - Qt的三駕馬車之一 - 串口編程 + 程式打包成Windows軟體 1、創建項目 實現串口助手 創建 Qt Widget ...
  • find,grep,sed,awk find:常用在目錄下精確查找文件(最擅長找文件) grep:常用來做全局數據的查詢定位(最擅長文本過濾) sed:常用來做行數據增刪改查(最擅長取行) awk:常用來做列數據切分與提取(最擅長取列) 1.find【擅長在目錄下找文件】 find 命令用來在指定目 ...
  • 先看如下一個DEMO示例代碼:(其中doBatchGet被子類重寫了1次) public abstract class BaseDemoService<T> { public String batchGet(T... ints) { T one=ints[0]; System.out.println ...
  • 前置知識: Web 伺服器:可以指硬體上的,也可以指軟體上的。從硬體的角度來說, Web 伺服器指的就是一臺存儲了網路服務軟體的電腦;從軟體的角度來說, Web 伺服器指的是一種軟體,比如 Tomcat。 Servlet 容器:目前主流的 Servlet 容器軟體包括 Tomcat、Jetty、J... ...
  • SpringBoot Controller 控制器 SpringBoot提供了@Controller和@RestController兩種註解來標識此類負責接收和處理HTTP請求。 如果請求的是頁面和數據,使用@Controller註解即可;如果只是請求數據,則可以使用@RestController註 ...
  • 1.學習目標 2.簡介 技術論壇:http://bbs.chinaunix.net/forum-240-1.html 資源地址:https://sourceforge.net/projects/fastdfs/ 源碼地址:https://github.com/happyfish100 FastDFS ...
  • 前言 對於大多數 maven 多模塊化工程,可以使用 Jacoco 這款工具,關於 Jacoco 這款工具,ChatGPT 對它的描述是這樣的: JaCoCo(Java Code Coverage)是一個開源的測試覆蓋率工具,它可以用於幫助開發人員衡量其軟體測試的有效性。它支持多種語言,包括 Jav ...
  • 1、Spring 1.1、簡介 Spring:春天 >給軟體行業帶來了春天! 2002,首次推出了Spring框架的雛形:interf21框架! Spring框架即以interface21框架為基礎,經過重新設計,並不斷豐富其內涵,於2004年3月24日發佈了1.0正式版。 Rod Johnson ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...