前言
近期ChatGPT可以說是太火了,問答、寫論文、寫詩、寫代碼,只要輸入精確的prompt,他的表現總是讓人驚喜,本著打不過就加入的原則,要是把ChatGPT拉入群聊中,會是怎樣一番場景?說做就做,花了1個晚上搗鼓了一個小Demo【ChatGPT群聊助手】,憑借它的“聰明才智”,應該可以搞定我的網友、女朋友、老媽的提問...
溫馨提示:如果你從沒體驗過ChatGPT,給大家準備了一個新手體驗Demo,免注冊!免登陸!免代理!!!!!!,拉到文末可以快速查看噢,
使用效果
效果可看下圖
應用前景
雖Demo僅在小范圍的群聊中測驗,但ChatGPT語意理解和互動能力確實強大,不僅能聯系對話的背景關系,還能及時糾正代碼bug,不經讓人想到,若能將ChatGPT應用于聊天機器人軟體,完成回答問題、提供服務、甚至解決問題的任務,幫助人們解決重復性或大量的人工作業,代替傳統聊天機器人應用于客服、電商、教育和金融等行業,
相對于傳統聊天機器人,ChatGPT可根據用戶的要求和特性,及時調整回答的策略以便更準確的回答問題,有更人性化的體驗,現在被廣泛使用的智能客服還不夠智能,ChatGPT所具備的能力,正是客服領域所需要的,
1 準備作業
在國內無法注冊ChatGPT賬戶,因此需要準備如下:
能接收短信的國外手機號: 只需花幾塊錢,使用國外虛擬號碼在線接收短信,可以去一些第三方平臺如:http://sms-activate.org/cn,
這里需要注意的是,sms-activate.org選取手機號碼國家的時候,建議選擇印度,如果選擇印度尼西亞,會在openAI報如下錯誤:
You’ve made too many phone verification requests. Please try again later or contact us through our help center at help.openai.com
以上是必須的前提作業,有了以上準備作業后,就可以去https://chat.openai.com/auth/login注冊賬號了,
2 實作思路
2.1 技術現狀
chatGPT
提供了基于Web
版的互動界面,不便于編程式呼叫,于是,我們可以通過模擬瀏覽器去登錄,然后把互動程序封裝成API
介面,
2.2 實作程序
ChatGPT
作為一個機器人角色加入群聊,需要在PC端轉發ChatGPT
問答,因此,我們可以在PC電腦上完成ChatGPT介面的封裝,并加入群聊,然后通過即構IM(群聊)將資料實時傳輸,實作群聊里面與ChatGPT
聊天,
3 PC端封裝代碼實作
3.1 封裝chatGPT呼叫
我們使用chatgpt-api庫來封裝呼叫chatGPT,因此先要安裝好依賴庫:
npm install chatgpt
安裝好chtgpt庫后,使用起來就非常簡單了:
var ChatGPT, ConversationId, ParentMessageId;
var API_KEY = ;//這里填寫KEY
(async () => {
const { ChatGPTAPI } = await import('chatgpt');
ChatGPT = new ChatGPTAPI({ apiKey: API_KEY})
})();
//向ChatGPT發出提問
function chat(text, cb) {
console.log("正在向ChatGPT發送提問:",text)
ChatGPT.sendMessage(text, {
conversationId: ConversationId,
parentMessageId: ParentMessageId
}).then(
function (res) {
ConversationId = res.conversationId
ParentMessageId = res.id
cb && cb(true, res.text)
console.log(res)
}
).catch(function (err) {
cb && cb(false, err);
});
}
注意到,在第二行需要填寫API_KEY
,登錄OpenAI后,打開鏈接https://platform.openai.com/account/api-keys即可獲取,如下圖所示
3.2 收發群聊訊息
關于即構IM,如果大家感興趣可以進入官網https://doc-zh.zego.im了解更多,總所周知,在即時聊天和實時音視頻方面,即構IM是個人開發者或者中小型企業首選,因為我們只關注一對一私聊或者群聊,因此,在官方提供的SDK的基礎上,我們做了二次封裝,具體的封裝代碼請看附件,這里只貼出封裝后的使用代碼:
const Zego = require('./zego/Zego.js');
var zim;
function one rror(err) {
console.log("on error", err);
}
//發送訊息
function sendZegoMsg(isToGroup, text, toID){
Zego.sendMsg(zim, isToGroup, text, toID, function (succ, err) {
if (!succ) {
console.log("回復即構訊息發送失敗:", msg, err);
}
})
}
//收到訊息回呼
function onRcvZegoMsg(isFromGroup, msg, fromUID) {
var rcvText = msg.message ;
}
function main() {
let zegoChatGPTUID = "chatgpt"
zim = Zego.initZego(onError, onRcvZegoMsg, zegoChatGPTUID);
}
main();
在收到訊息時,判斷是否有@chatgpt
關鍵字,如果有的話提取訊息內容,然后去呼叫chatGPT
封裝好的介面等待ChatGPT
回復,并將回復的內容往聊天群里發送,
4 手機端加入群聊與ChatGPT聊天
有了PC
端實作后,接下來在手機端只需通過即構IM SDK向群里面@chatgpt發送提問訊息即可,當然了,也可以在一對一私聊的時候@chatgpt然后呼叫chatGPT介面,這些都是可以根據實際需求定制開發,篇幅原因,這里我們只將群聊,
同樣的,我們只關注收發訊息,因此對即構官方提供的SDK做了二次封裝,如果想了解更多細節可以前往官方檔案閱讀,
對登錄ZIM、創建Token等代碼這里不詳細描述,感興趣讀者可以查看代碼附件,代碼很簡單容易看懂,
首先封裝Msg物件,表示訊息物體類:
public class Msg {
public String msg;
public long time;
public String toUID;
public String fromUID;
public MsgType type;
public enum MsgType {
P2P,
GROUP
}
}
發送訊息二次封裝,同一群聊和一對一聊天介面:
public static void sendMsg(ZIM zim, Msg msg, ZIMMessageSentCallback cb) {
// 發送“單聊”通信的資訊
ZIMTextMessage zimMessage = new ZIMTextMessage();
zimMessage.message = msg.msg;
ZIMMessageSendConfig config = new ZIMMessageSendConfig();
// 訊息優先級,取值為 低:1 默認,中:2,高:3
config.priority = ZIMMessagePriority.LOW;
// 設定訊息的離線推送配置
ZIMPushConfig pushConfig = new ZIMPushConfig();
pushConfig.title = "離線推送的標題";
pushConfig.content = "離線推送的內容";
pushConfig.extendedData = "https://www.cnblogs.com/RTCWang/archive/2023/03/20/離線推送的擴展資訊";
config.pushConfig = pushConfig;
if (msg.type == Msg.MsgType.P2P)
zim.sendPeerMessage(zimMessage, msg.toUID, config, cb);
else
zim.sendGroupMessage(zimMessage, msg.toUID, config, cb);
}
二次封裝接收訊息,統一通過onRcvMsg
函式接收訊息,
private void onRcvMsg(ArrayList<ZIMMessage> messageList) {
if (lsArr == null) return;
for (ZIMMessage zimMessage : messageList) {
if (zimMessage instanceof ZIMTextMessage) {
ZIMTextMessage zimTextMessage = (ZIMTextMessage) zimMessage;
if (zimMessage.getTimestamp() < this.startTime)
continue;
String fromUID = zimTextMessage.getSenderUserID();
ZIMConversationType ztype = zimTextMessage.getConversationType();
String toUID = zimTextMessage.getConversationID();
Msg.MsgType type = Msg.MsgType.P2P;
if (ztype == ZIMConversationType.PEER) type = Msg.MsgType.P2P;
else if (ztype == ZIMConversationType.GROUP) type = Msg.MsgType.GROUP;
String data = https://www.cnblogs.com/RTCWang/archive/2023/03/20/zimTextMessage.message;
Msg msg = new Msg(type, data, zimMessage.getTimestamp(), fromUID, toUID);
for (MsgCenterListener l : lsArr) l.onRcvMsg(msg);
}
}
}
private ZIMEventHandler handler = new ZIMEventHandler() {
@Override
public void onReceivePeerMessage(ZIM zim, ArrayList messageList, String fromUserID) {
onRcvMsg(messageList);
}
@Override
public void onReceiveGroupMessage(ZIM zim, ArrayList messageList, String fromGroupID) {
onRcvMsg(messageList);
}
@Override
public void onTokenWillExpire(ZIM zim, int second) {
onRenewToken();
}
};
需要注意的是,因為我們目前場景只需關注文本訊息,因此沒有圖片、檔案之類的訊息做過多考慮,如果有類似需求的讀者可以根據官方檔案進一步封裝,
另外,為了簡化,避免每次用戶主動拉chatgpt
進入一個新群,我們先約好一個超大群ID:group_chatgpt
,每次新用戶登錄就加入這個大群就好,如果有更加細粒度控制需求,可以根據不同用戶來創建不同群,然后向chatgpt
機器人發送群ID,在PC端開發對應的自動加入對應群功能就好,
對于加群邏輯,也做了二次封裝:
public void joinGroup(String groupId) {
zim.joinGroup(groupId, new ZIMGroupJoinedCallback() {
@Override
public void onGroupJoined(ZIMGroupFullInfo groupInfo, ZIMError errorInfo) {
for (MsgCenterListener l : lsArr)
l.onJoinGroup(groupId);
}
});
至此,整個流程開發完成,盡情享受ChatGPT吧,
5 開發者福利
除ChatGPT之外,Demo中使用的開發者工具ZIM SDK也是提升作業效率的利器,ZIM SDK提供了全面的 IM 能力,滿足文本、圖片、語音等多種訊息型別,在線人數無上限,支持億量級訊息并發,同時支持安全審核機制,確保訊息安全合規,
ZIM SDK提供了快速集成、介面豐富、成熟的即時通訊解決方案,滿足多種業務場景通訊需求,適用于打造大型直播、語聊房、客服系統等場景,即構即時通訊產品 IM 開春鉅惠低至1折,限時折扣專業版1200元https://www.zego.im/activity/zegoland,也可搭配元宇宙和直播間其他產品組合使用,感興趣的開發者可到即構官網去注冊體驗https://doc-zh.zego.im/article/11591
6 完整代碼
- PC端:https://github.com/RTCWang/ChatGPT-ZIM/tree/main/ChatGPT%26ZIM/chatgpt_%E6%9C%BA%E5%99%A8%E4%BA%BA
- android:https://github.com/RTCWang/ChatGPT-ZIM/tree/main/ChatGPT%26ZIM/ChatGPT_android
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/547554.html
標籤:其他
上一篇:設計原則
下一篇:設計原則