本文正在参加 ✍ 技术视角深入 ChatGPT 征文活动
前语
近期ChatGPT能够说是太火了,问答、写论文、写诗、写代码,只要输入精确的prompt,他的体现总是让人惊喜。本着打不过就参加的准则。要是把ChatGPT拉入群聊中,会是怎样一番场景?说做就做,花了1个晚上捣鼓了一个小Demo【ChatGPT群聊帮手】,凭借它的“聪明才智”,应该能够搞定我的网友、女朋友、老妈的发问…
温馨提示:假如你从没体会过ChatGPT,给咱们预备了一个新手体会Demo,免注册!免登陆!免代理!!!!!!,拉到文末能够快速检查噢。
运用作用
作用可看下图
应用远景
虽Demo仅在小范围的群聊中测试,但ChatGPT语义了解和交互才能确实强大,不仅能联系对话的上下文,还能及时纠正代码bug。不经让人想到,若能将ChatGPT应用于谈天机器人软件,完结答复问题、供给服务、乃至解决问题的使命,协助人们解决重复性或大量的人工作业,替代传统谈天机器人应用于客服、电商、教育和金融等职业。
相对于传统谈天机器人,ChatGPT可依据用户的要求和特性,及时调整答复的策略以便更精确的答复问题,有更人性化的体会。现在被广泛运用的智能客服还不够智能,ChatGPT所具有的才能,正是客服领域所需求的。
1 预备作业
在国内无法注册ChatGPT账户,因而需求预备如下:
能接纳短信的国外手机号: 只需花几块钱,运用国外虚拟号码在线接纳短信。能够去一些第三方平台如:sms-activate.org/cn。
国外IP: 能够经过一些东西来完结,如经过东西运用美国节点IP。
这儿需求注意的是,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
以上是有必要的条件作业,有了以上预备作业后,就能够去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后,打开链接platform.openai.com/account/api…即可获取,如下图所示
3.2 收发群聊音讯
关于即构IM,假如咱们感兴趣能够进入官网doc-zh.zego.im了解更多。总所周知,在即时谈天和实时音视频方面,即构IM是个人开发者或者中小型企业首选。由于咱们只重视一对一私聊或者群聊,因而,在官方供给的SDK的基础上,咱们做了二次封装。详细的封装代码请看附件,这儿只贴出封装后的运用代码:
const Zego = require('./zego/Zego.js');
var zim;
function onError(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 = "离线推送的扩展信息";
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 = 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<ZIMMessage> messageList, String fromUserID) {
onRcvMsg(messageList);
}
@Override
public void onReceiveGroupMessage(ZIM zim, ArrayList<ZIMMessage> 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元www.zego.im/activity/ze…,也可搭配元宇宙和直播间其他产品组合运用。感兴趣的开发者可到即构官网去注册体会doc-zh.zego.im/article/115…
6 完整代码
- PC端:github.com/RTCWang/Cha…
- android:github.com/RTCWang/Cha…