前言
若問(wèn)2023年科技領(lǐng)域什么最火,那當(dāng)然是ChatGPT了,這么智能的對(duì)話機(jī)器人,給人帶來(lái)無(wú)限的想象,圍繞著ChatpGPT的各種熱點(diǎn)和創(chuàng)意層出不窮。作為一個(gè)多年從事編程開(kāi)發(fā)的程序員,我對(duì)于這么大的一個(gè)熱點(diǎn)也很興奮,每天琢磨著圍繞ChatGPT干點(diǎn)啥。
當(dāng)然還是先要認(rèn)清現(xiàn)實(shí),心再高也不能想著去開(kāi)發(fā)一個(gè)ChatGPT一樣的東西。這個(gè)投入太大,難度太高,成果太不可預(yù)料,團(tuán)隊(duì)、成本、技術(shù)、模型、算力、數(shù)據(jù)、安全、法規(guī)等等,每一項(xiàng)對(duì)于中小型企業(yè)都是重大挑戰(zhàn)。國(guó)內(nèi)也只有幾個(gè)IT巨頭能玩,能玩到什么程度不知道,就像某度啊,純屬瞎湊熱鬧。那么多企業(yè)非得去湊熱鬧,非的要去沾個(gè)親,這個(gè)是無(wú)可厚非的,不管是博人眼球,還為了是抬高身價(jià),作用還是立竿見(jiàn)影的,湊熱鬧就湊吧。
思量一番,ChatGPT開(kāi)發(fā)不出來(lái),開(kāi)發(fā)一個(gè)它的近親ChatBot還是沒(méi)有多大難度的。于是親自考察了一下公司線上客服的聊天內(nèi)容,大致如下:
問(wèn):你好
答:您好
問(wèn):你們有xxx產(chǎn)品嗎
答:有啊
問(wèn):多少錢(qián)
答:您留個(gè)電話吧,打給您
問(wèn):怎么聯(lián)系你們
答:我們電話138...
...
再細(xì)細(xì)分析一下近年來(lái)的客服聊天記錄,竟然大部分對(duì)話都相似,相同的問(wèn)題和答復(fù),時(shí)刻都在重復(fù)上演!我的天啊,這也太程式化了吧,讓我們客服天天干這種事請(qǐng)也太浪費(fèi)資源了!不行,我要改變這種情形!
問(wèn)一下客服們,之前用過(guò)智能客服對(duì)話機(jī)器人嗎?她們說(shuō)是用過(guò)啊,用過(guò)阿某云的、華某云的,不太好用,經(jīng)常是答非所問(wèn)、似是而非,很少獲客。那就定了,我要給你們開(kāi)發(fā)一個(gè)好用的Chatbot智能客服,徹底解放生產(chǎn)力!
大話說(shuō)出來(lái)了,就只有去干了。經(jīng)過(guò)兩周的努力,終于實(shí)現(xiàn)了一個(gè)線上智能客服系統(tǒng)。雖然不是太智能,還算溫柔可人,能回答常見(jiàn)的客戶問(wèn)題,比如:
你好
你好,我在呢
你在哪
我在北京啊
你貴姓
我叫云云啊,你呢?
發(fā)個(gè)產(chǎn)品報(bào)價(jià)吧
報(bào)價(jià)你還是打電話問(wèn)吧
電話多少
電話是 136xxxxxxxx
哈哈,跟我們客服回答的有點(diǎn)像啊,有興趣可以跟她聊聊:???http://v.ruiboyun.cn/chat/??
我建議您先不要急著去跟這個(gè)機(jī)器人聊天,她并不是很聰明,還是希望您繼續(xù)往下看。
技術(shù)選型
理想很豐滿,現(xiàn)實(shí)須努力,為難于易,為大于細(xì),那就一步一步的來(lái)吧。
技術(shù)架構(gòu)
終端類(lèi)型:瀏覽器,客戶通過(guò)瀏覽器訪問(wèn)公司網(wǎng)站和瀏覽公司產(chǎn)品,聊天對(duì)話的場(chǎng)所就是瀏覽器中。
通信協(xié)議:Websocket,最適合進(jìn)行雙向交互,低延遲,高效率,沒(méi)有更好的選擇了。
后端框架:Java、PHP、Nodejs,好像都可以,但若要是做即時(shí)通信,前端面向?yàn)g覽器,那Nodejs應(yīng)該是不二之選。為啥?前后端用一種語(yǔ)言,前后端可以共用代碼,前后端工程師可以復(fù)用,配合起來(lái)就像左手拉右手,你說(shuō)香不香。使用Nodejs,就可以使用Socket.IO來(lái)進(jìn)行聊天通信,那就更簡(jiǎn)單了。當(dāng)然還有別的理由,往后看。
技術(shù)選型確定后,后面的工作都是基于這個(gè)技術(shù)框架來(lái)開(kāi)展,我就不再做解釋。
全文搜索引擎(full-text search)
做客服型Chatbot,全文搜索引擎是必須的,大量的聊天語(yǔ)料包準(zhǔn)備好后,需要有高效靈活的搜索引擎來(lái)查找對(duì)應(yīng)的內(nèi)容。
可用的全文搜索引擎系統(tǒng)很多,最終我把選擇范圍縮小到如下兩個(gè):
1)RediSearch
2)FlexSearch
RediSearch是Redis的一個(gè)插件模塊,用于實(shí)現(xiàn)全文搜索,具有開(kāi)源、高效、多字段檢索、精確短語(yǔ)匹配、搜索結(jié)果聚集等特點(diǎn)。
參考網(wǎng)址:??https://redis.io/docs/stack/search/??
FlexSearch是一個(gè)Nodejs模塊,具有開(kāi)源、輕量、純JS、零依賴、內(nèi)存內(nèi)索引等特點(diǎn)。
參考網(wǎng)址:??https://github.com/nextapps-de/flexsearch??
仔細(xì)對(duì)比兩個(gè)產(chǎn)品,RediSearch明顯具有成熟、靈活、參考資源多等優(yōu)勢(shì),如果要做商用產(chǎn)品或長(zhǎng)遠(yuǎn)打算,那就應(yīng)該選擇RediSearch。
再看FlexSearch的介紹和API接口,除了參考文檔少的可憐、成熟案例少之外,好像也沒(méi)有什么大的不足,也能滿足我的要求。更有吸引力的是輕量、JS源碼、有了問(wèn)題可以追根溯源的去修改,這恰恰符合我的脾氣。
那就選擇FlexSearch吧,雖然我選擇FlexSearch,并不代表它是最好的,如果你要做更高級(jí)的商用系統(tǒng),我還是建議你用RediSearch。
中文分詞(tokenization&segmentation)
使用全文搜索引擎,一個(gè)重要的工作就是分詞。索引過(guò)程是先對(duì)原始文本進(jìn)行分詞,然后對(duì)分詞結(jié)果索引;搜索過(guò)程是先對(duì)問(wèn)句進(jìn)行分詞,在使用分詞結(jié)果去查詢。
中文分詞相對(duì)于拉丁語(yǔ)等其他語(yǔ)言的分詞有很大的不同,拉丁語(yǔ)使用空格、標(biāo)點(diǎn)符號(hào)作為分詞標(biāo)記,每個(gè)單詞具有明確意義,因此分詞過(guò)程要簡(jiǎn)單的多。
而中文分詞則要復(fù)雜抽象一些,每個(gè)獨(dú)立漢字放到不同的詞語(yǔ)中意義就不同,若以每個(gè)漢字作為分詞結(jié)果,想要在海量的全文中搜索你期望的結(jié)果是不可預(yù)期的,干擾噪聲會(huì)完全淹沒(méi)你的期望結(jié)果。
中文分詞需要向后掃描要處理的文本序列,將單字、多字組合與字典中的詞語(yǔ)(或你自己預(yù)定義的詞語(yǔ)、術(shù)語(yǔ))來(lái)對(duì)比,以此確定分詞位置和分詞結(jié)果。
于是開(kāi)始找中文分詞器,還好,我們要選擇的兩個(gè)全文搜索系統(tǒng)都有可用的中文分詞器。
RediSearch使用了??Friso??庫(kù)進(jìn)行中文分詞,F(xiàn)riso 是使用 c 語(yǔ)言開(kāi)發(fā)的一款開(kāi)源的高性能中文分詞器,使用流行的mmseg算法實(shí)現(xiàn)。完全基于模塊化設(shè)計(jì)和實(shí)現(xiàn),可以很方便的植入其他程序中。到Github瀏覽了一下這個(gè)庫(kù),發(fā)現(xiàn)相當(dāng)不錯(cuò)!
參考網(wǎng)址:??https://github.com/lionsoul2014/friso??
FlexSearch則要更加靈活,可以自己選擇好用的中文分詞庫(kù)。上述Friso之封裝了了php5, php7, ocaml, lua的插件,并沒(méi)有封裝Nodejs包,若要使用需要自己封裝,這個(gè)可以參考Nodejs的N-API或Node-Addon-API。對(duì)于我目前的開(kāi)發(fā)項(xiàng)目,當(dāng)然還用不著再去將Friso封裝成Nodejs插件,這個(gè)有點(diǎn)走彎路了。在Nodejs家族里只要找一款中文分詞庫(kù),那應(yīng)該是很容易的,果不其然,github搜一下就有很多選擇。
nodejieba星最多,拿來(lái)測(cè)試一下,感覺(jué)分詞效果還可以,就用它吧。
文檔結(jié)構(gòu)
技術(shù)選型做好之后,開(kāi)始設(shè)計(jì)聊天語(yǔ)料的文檔結(jié)構(gòu)。我們把每一輪聊天互動(dòng)(一問(wèn)一答)的內(nèi)容定義為一個(gè)文檔,使用json對(duì)象來(lái)描述。文檔結(jié)構(gòu)定義如下:
{
id:1, //文檔編號(hào),用于唯一標(biāo)記一個(gè)文檔
tag:"business", //標(biāo)簽,用于將語(yǔ)料進(jìn)行分組歸類(lèi)
query:"你好", //問(wèn)句
answer:"你好,有何吩咐?"http://答句
}
所有文檔保存在數(shù)組中:
[
{
id:1, //文檔編號(hào),用于唯一標(biāo)記一個(gè)文檔
tag:"business", //標(biāo)簽,用于將語(yǔ)料進(jìn)行分組歸類(lèi)
query:"你好", //問(wèn)句
answer:"你好,有何吩咐?"http://答句
},
{
id:2, //文檔編號(hào),用于唯一標(biāo)記一個(gè)文檔
tag:"business", //標(biāo)簽,用于將語(yǔ)料進(jìn)行分組歸類(lèi)
query:"你貴姓", //問(wèn)句
answer:"我叫云云" //答句
}
]
文檔的query屬性會(huì)交給全文搜索引擎進(jìn)行索引,搜索過(guò)程就是搜索匹配的問(wèn)句的過(guò)程,搜索到匹配問(wèn)句后,將answer內(nèi)容反饋給提問(wèn)方。
對(duì)于海量的語(yǔ)料,文檔問(wèn)句詞語(yǔ)的重復(fù)會(huì)是常見(jiàn)的,一個(gè)問(wèn)句可能會(huì)返回多個(gè)結(jié)果,因此需要有手段選擇最佳匹配,盡量讓答復(fù)接近提問(wèn)者的期望。這是一個(gè)較為復(fù)雜的問(wèn)題,后面會(huì)有進(jìn)一步說(shuō)明。
實(shí)現(xiàn)細(xì)節(jié)
技術(shù)選型做好了,文檔結(jié)構(gòu)也設(shè)計(jì)好了,下面就是編碼實(shí)現(xiàn)了,好激動(dòng)啊。前一周參考了那么多技術(shù),論證也比較充分了,所以我計(jì)劃再花1周時(shí)間來(lái)開(kāi)發(fā)實(shí)現(xiàn)。
后端服務(wù)
Nodejs+socketio,主要實(shí)現(xiàn)即時(shí)文本通信,還需要實(shí)現(xiàn)一些其他WebAPI接口,這個(gè)對(duì)于熟悉Nodejs的工程師是小菜一碟。
主邏輯代碼app.js:
const chatter= require('./chatter');
const loader = require("./searcher/loader");
var express = require('express');
var app = express();
var http = require('http');
//http + socketio
var server = http.createServer(app);
var io = require('socket.io')(server);
const serverPort = 3000;
server.listen(serverPort, function(){
console.log("接口服務(wù)已啟動(dòng),端口:",serverPort);
});
/**
* 消息結(jié)構(gòu)體 答句時(shí)code非0時(shí)表示沒(méi)有對(duì)應(yīng)答案,問(wèn)句時(shí)省略
* {
* code:0,
* msg:"hello"
* }
*/
//加載語(yǔ)料
loader.loadall(chatter);
io.on("connection", (socket) => {
socket.emit("message", {msg:"你好"});
// receive a message from the client
socket.on("message", (data,callback) => {
let msg = data.msg;
/**
* 問(wèn)句 交給聊天機(jī)器人處理,返回 答句
*/
let response_msg = chatter.chat(msg);
let response_data = {
code:response_msg?0:1,
msg:response_msg
};
callback(response_data);
});
});
下面就是聊天機(jī)器人的核心邏輯了。實(shí)現(xiàn)一個(gè)全文搜索引擎封裝文件 chatter.js
//搜索引擎
const { Index, Document, Worker } = require("flexsearch");
//分詞器
var nodejieba = require("nodejieba");
const regex = /[\x00-\x7F]+/g;
function encode(str) {
str = ("" + str).replace(regex, "");
let len = str.length;
if (len < 0) return [];
if (len == 1) return [str];
let arr = nodejieba.cut(str);
return arr;
}
const limit = 5; //搜索結(jié)果最多返回?cái)?shù)
const documents = []; //存儲(chǔ)所有文檔
var id = 0; //id遞增器
//創(chuàng)建全文索引器,具體參見(jiàn)flexsearch用法
const options = {
preset: "default",
tokenize: "strict",
language: "zh",
encode: encode, //引入分詞器
bool: "or",
document: {
id: "id",
tag: "tag",
index: "q"
}
};
const index = new Document(options);
/**
* 添加語(yǔ)料接口
*/
function add(tag, q, a) {
id++;
documents[id] = { id: id, tag: tag, q: q, a: a };
return index.add({ id: id, tag: tag, q: q });
}
/**
* 查找
* @param {string} text
* @param {string} tag
*/
function search(text, tag) {
let opt = {
index: "q",
limit: limit,
};
if (tag) opt.tag = tag;
return index.search(text, opt);
}
//獲取文檔
function get(id) {
return documents[id];
}
function chat(msg) {
let result = search(msg, tag);
if (result.length > 0) {
let ids = result[0].result;
let id = ids[0];
let doc = get(id);
return doc.a;
} else {
return null;
}
}
module.exports = { add, get, chat }
可以看到,在這個(gè)module中實(shí)現(xiàn)了較多的內(nèi)容,包括創(chuàng)建全文索引系統(tǒng)、創(chuàng)建分詞器,以及添加語(yǔ)料接口、查詢接口、文檔獲取接口等。
最終能力的輸出通過(guò)chat接口實(shí)現(xiàn)??碿hat函數(shù)代碼,原理簡(jiǎn)單,根據(jù)問(wèn)句檢索答句,如果有多條,則返回第一條。
語(yǔ)料的加載,在app.js通過(guò)實(shí)現(xiàn)一個(gè)loader來(lái)實(shí)現(xiàn)的:
//加載語(yǔ)料
loader.loadall(chatter);
loader的任務(wù)是將語(yǔ)料庫(kù)加載到內(nèi)存中,然后逐條傳遞給全文索引系統(tǒng)進(jìn)行索引。
前端頁(yè)面
前端頁(yè)面找我們前端美女實(shí)現(xiàn),設(shè)計(jì)一個(gè)聊天界面那是分分鐘的事情了,機(jī)器人的回答有一個(gè)汽包等待動(dòng)畫(huà),就像ChatGPT那樣,那是機(jī)器人在檢索數(shù)據(jù)。
前端代碼,通信部分大致是這樣的:
import { io } from "socket.io-client";
const socket = io("ws://localhost:3000");
// send a message to the server
socket.emit("message",{msg:"你好啊"},(data)=>{
if(data.code==0){
//渲染聊天數(shù)據(jù)
}
});
效果提升
人任何時(shí)候都不能高估自己啊,要時(shí)刻提醒自己爬得高摔得重。通過(guò)幾天的努力,我的Chatbot已經(jīng)可以給你聊條對(duì)話了,可是效果如何呢,評(píng)測(cè)一下大致如下:
你好
你好
你在哪里
我在北京
上海在哪里
我在北京
科靈頓在哪里
我在北京
簡(jiǎn)直是無(wú)聊,很多問(wèn)題的答復(fù)落在要給答案上!
其實(shí)這是預(yù)料之中的事情,為啥,一是因?yàn)檎Z(yǔ)料庫(kù)內(nèi)容有限,二是檢索結(jié)果沒(méi)有經(jīng)過(guò)任何優(yōu)化。Flexsearch對(duì)多關(guān)鍵字的檢索(multi-search)打分,偏離的離譜,只能自己去優(yōu)化。既然是開(kāi)源的,那就可以優(yōu)化,或者變著法子使用你的優(yōu)點(diǎn),繞開(kāi)你的缺點(diǎn)。
優(yōu)化一,找最佳匹配結(jié)果
如果查到多個(gè)記錄,那就看看哪個(gè)匹配度最高,怎么計(jì)算匹配度高低呢?用了與i個(gè)簡(jiǎn)單的方法,那就是問(wèn)句中的所有分詞在哪個(gè)答案里出現(xiàn)的次數(shù)最多,就選則那個(gè)答案。
于是對(duì)查詢過(guò)程進(jìn)行優(yōu)化:
1)搜索前主動(dòng)分詞、去重、排除干擾字詞
2)搜索結(jié)果對(duì)比,尋找出現(xiàn)頻次最多的結(jié)果
于是,在chatter中實(shí)現(xiàn)如下搜索接口:
/**
* 復(fù)雜搜索入口,輸入一個(gè)整句,這里進(jìn)行分詞、去重、搜索、合并
* 同步函數(shù)
* @param {string} text
* @param {string} tag
* @returns
*/
function complexSearch(text,tag){
let words = encoder.encode2(text);
let arrIds= [];
let keys = [];
if(!words ||words.length==0){
return null;
}
if(words.length>keyLimit){
//去掉1字詞
words.forEach(element => {
if(element.length>1){
keys.push(element);
}
});
}else{
keys = words;
}
//限制搜索詞個(gè)數(shù)
if(keys.length>keyLimit){
keys = keys.slice(0,keyLimit);
}
//多次搜索,不使用flexsearch的multi-search
keys.forEach(key=>{
let result = search(key,tag);
if(result.length>0){
let ids = result[0].result;
arrIds.push(ids);
}
});
//取最優(yōu)結(jié)果
let result = null;
if(arrIds.length==1){
result = arrIds[0];
}else if(arrIds.length>1){
result = arrUtils.mixmix(arrIds);
}
return result;
}
優(yōu)化后,測(cè)試一下,果然準(zhǔn)確度大幅攀升,基本上答復(fù)符合預(yù)期。
優(yōu)化二,優(yōu)化商務(wù)語(yǔ)料包,定義自有詞庫(kù)
這一步也很重要,商務(wù)語(yǔ)料包是用來(lái)回答客戶問(wèn)題的,盡量要簡(jiǎn)潔、通俗(符合大眾問(wèn)句習(xí)慣)、去除干擾詞。
例如,下面問(wèn)句,顯然第二句更好些:
你們公司的產(chǎn)品資料給我發(fā)一份吧
產(chǎn)品資料發(fā)一份
然后就是定義詞庫(kù),把客戶常用詞、公司的產(chǎn)品和術(shù)語(yǔ)做成一個(gè)詞典給分詞器,讓按照自定義詞典分詞,這樣檢索命中率就會(huì)更好。
優(yōu)化三,上下文相關(guān)搜索
上下文相關(guān)搜索是把相關(guān)的內(nèi)容放置在更優(yōu)先的反饋結(jié)果里,這樣智能機(jī)器人返回的結(jié)果就更像真人的聊天內(nèi)容,想想看,如果一次聊天對(duì)話能夠僅僅圍繞相同或相近的話題,是不是更有趣。
語(yǔ)料庫(kù)包
語(yǔ)料庫(kù)里放著所有的問(wèn)句和答句,如果要讓chatbot更加博學(xué)和聰明,就要不斷豐富你的語(yǔ)料庫(kù)。語(yǔ)料庫(kù)的答句風(fēng)格也就是chatbot的風(fēng)格,她可以是個(gè)溫柔的助理,也可以是個(gè)野蠻的匹夫,這些取決于你的語(yǔ)料內(nèi)容。
語(yǔ)料庫(kù)我把它分成兩個(gè)部分,用tag進(jìn)行標(biāo)注。一個(gè)是專(zhuān)用商務(wù)語(yǔ)料包,里面涵蓋了各類(lèi)客戶常見(jiàn)問(wèn)題和答案,這部分由我峨嵋你公司的商務(wù)人員負(fù)責(zé)提供和優(yōu)化,并且不斷豐富。一個(gè)是閑聊語(yǔ)料包,用于與客戶閑聊,應(yīng)對(duì)一些商務(wù)問(wèn)題之外的問(wèn)題,這個(gè)可以從網(wǎng)上搜,也可以通過(guò)商業(yè)渠道獲取。
最終,我們編輯了1000條商務(wù)語(yǔ)料,并從網(wǎng)上找了100萬(wàn)條閑聊語(yǔ)料。100萬(wàn)條多嗎,其實(shí)不多,全文搜索引擎幾個(gè)毫秒就可以索索一邊,不用擔(dān)心效率問(wèn)題。
最后的問(wèn)題,為什么不是ChatGPT
前面已經(jīng)說(shuō)過(guò)了,研發(fā)類(lèi)ChatGPT系統(tǒng),需要的是人才、投入和海量的語(yǔ)料/資料,以及大量的語(yǔ)料清洗校正工作,所以一般的企業(yè)炒炒概念也就算了,這個(gè)艱巨的任務(wù)還是留給我們的科技巨頭吧。
ChatGPT是美國(guó)人工智能研究實(shí)驗(yàn)室OpenAI新推出的一種人工智能技術(shù)驅(qū)動(dòng)的自然語(yǔ)言處理工具,是全球技術(shù)精英經(jīng)過(guò)多年技術(shù)積累,花費(fèi)數(shù)十億美刀研發(fā)出的東西,ChatGPT不單是聊天機(jī)器人,還能進(jìn)行撰寫(xiě)郵件、視頻腳本、文案、翻譯、代碼等任務(wù)。ChatGPT使用了Transformer神經(jīng)網(wǎng)絡(luò)架構(gòu),這是一種用于處理序列數(shù)據(jù)的模型,擁有語(yǔ)言理解和文本生成能力,尤其是它會(huì)通過(guò)連接大量的語(yǔ)料庫(kù)來(lái)訓(xùn)練模型,這些語(yǔ)料庫(kù)包含了真實(shí)世界中的對(duì)話,使得ChatGPT具備上知天文下知地理,還能根據(jù)聊天的上下文進(jìn)行互動(dòng)的能力,做到與真正人類(lèi)幾乎無(wú)異的聊天場(chǎng)景進(jìn)行交流。
ChatGPT受到關(guān)注的重要原因是引入新技術(shù)RLHF (Reinforcement Learning with Human Feedback,即基于人類(lèi)反饋的強(qiáng)化學(xué)習(xí))。RLHF 解決了生成模型的一個(gè)核心問(wèn)題,即如何讓人工智能模型的產(chǎn)出和人類(lèi)的常識(shí)、認(rèn)知、需求、價(jià)值觀保持一致。ChatGPT是AIGC(AI- Generated Content,人工智能生成內(nèi)容)技術(shù)進(jìn)展的成果。
拋開(kāi)算法、算力的技術(shù)壁壘和投入,我們單從語(yǔ)料說(shuō)起,ChatGPT使用的語(yǔ)料是數(shù)百億條,除了聊天語(yǔ)料,還有海量的新聞資訊、天文地理、音樂(lè)繪畫(huà)、財(cái)經(jīng)政治等等書(shū)籍資料,也包括我們中文的大部分歷史文集、詩(shī)詞歌賦等。
傳統(tǒng)的Chatbot不具備、或者具備有限的智能,主要任務(wù)還是搜索和回答,再進(jìn)一步就是關(guān)聯(lián)上下文環(huán)境的互動(dòng)聊天,以及可插入任務(wù)中間件的互動(dòng)聊天,譬如問(wèn)天氣、問(wèn)路況、問(wèn)航班、問(wèn)行情、電器設(shè)備控制、行業(yè)問(wèn)題答疑等等,都在傳統(tǒng)聊天機(jī)器人的范疇之內(nèi)。而ChatGPT,則是具有了學(xué)習(xí)、模仿、關(guān)聯(lián)、歸納總結(jié)、創(chuàng)造等能力。
好了,聊到這里也算結(jié)束了,我的Chatbot還有很多地方需要優(yōu)化提升,希望您給出寶貴意見(jiàn)哦,您現(xiàn)在可以給她聊幾句了:??http://v.ruiboyun.cn/chat/??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-419739.html
這個(gè)機(jī)器人腦路有限,多多包涵 ~:)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-419739.html
到了這里,關(guān)于我開(kāi)發(fā)了一個(gè)溫柔的智能客服聊天機(jī)器人ChatBot,并回答為什么不是ChatGPT(附思路和代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!