序文
2023年に最もホットなテクノロジー分野は何かと問われれば、それはもちろんChatGPTである.このようなインテリジェントな対話ロボットは、人々に無限の想像力をもたらし、ChatpGPTをめぐるさまざまなホットスポットやアイデアが際限なく出現します. 私も長年プログラミングや開発に携わってきたプログラマーとして、ChatGPT周りをどうするかを日々考えながら、このような一大ホットスポットにとてもワクワクしています。
もちろん、まずは現実を認識しなければなりません。どんなに心が高揚していても、ChatGPT のようなものを開発することは考えられません。この投資が大きすぎる、難易度が高すぎる、結果が予測不可能すぎる チーム、コスト、技術、モデル、計算能力、データ、セキュリティ、規制など、それぞれが中小企業にとって大きな課題です-規模の企業。中国でプレイできるITの巨人はごくわずかであり、彼らがどこまでプレイできるかはわかりません。ある程度のように、純粋に楽しみのためです。結婚したいから参加しなければならない会社がたくさんあります. これは理解できます. 人々の注目を集めることであろうと、社会的地位を高めることであろうと、効果はすぐに現れるので、楽しみに参加してください.
考えてみれば、ChatGPTは開発できず、近縁のChatBotを開発することはそれほど難しくありません。そこで、同社のオンラインカスタマーサービスのチャット内容を個人的に調べてみたところ、おおよそ次のようになっています。
问:你好
答:您好
问:你们有xxx产品吗
答:有啊
问:多少钱
答:您留个电话吧,打给您
问:怎么联系你们
答:我们电话138...
...
近年のカスタマー サービス チャットの記録を詳しく分析すると、ほとんどの会話が類似しており、同じ質問と回答が常に繰り返されていることがわかります。なんてこった、これはあまりにも様式化されています。カスタマー サービスが毎日このようなことを行うのはリソースの無駄です。いや、この状況を変えたい!
カスタマー サービス スタッフに聞いてみてください。これまでにスマートなカスタマー サービス対話ロボットを使用したことがありますか? 使ったことがあるとのことで、A Mouyun や Hua Mouyun も使ったことがありますが、あまり使いやすいとは言えません。それだけです。生産性を完全に解放する、便利なチャットボット インテリジェント カスタマー サービスを開発します。
大きな言葉が話されたら、やるべきことはそれを実行することだけです。2 週間の懸命な作業の後、オンライン インテリジェント カスタマー サービス システムがついに実現しました。頭が良すぎるわけではありませんが、優しくて心地よく、次のような一般的な顧客の質問に答えることができます。
你好
你好,我在呢
你在哪
我在北京啊
你贵姓
我叫云云啊,你呢?
发个产品报价吧
报价你还是打电话问吧
电话多少
电话是 136xxxxxxxx
ハハ、私たちのカスタマーサービスからの答えは少し似ています. 興味があれば、彼女とチャットできます: http://v.ruiboyun.cn/chat/
このロボットと急いでチャットしないことをお勧めします。彼女はあまり頭が良くありません。引き続き読んでいただければ幸いです。
技術の選択
理想はいっぱいだけど、現実は努力が必要、難しいことは簡単なことよりも簡単なこと、大きいことは小さいことよりも大きいので、一歩一歩進んでいきましょう。
技術アーキテクチャ
端末の種類:ブラウザ. 顧客は同社の Web サイトにアクセスし、ブラウザを通じて同社の製品を閲覧します. チャットや対話の場所はブラウザにあります.
通信プロトコル: Websocket は、双方向の対話、低遅延、高効率に最適であり、これ以上の選択肢はありません。
バックエンド フレームワーク: Java、PHP、および Nodejs はすべて利用できるようですが、インスタント メッセージングを実行したい場合で、フロントエンドがブラウザー指向である場合は、Nodejsが最適です。なぜ?フロントエンドとバックエンドが 1 つの言語を使用し、フロントエンドとバックエンドがコードを共有でき、フロントエンドとバックエンドのエンジニアがコードを再利用できます。協調は、左手が右手を引くようなものです。 、それが良いかどうか。Nodejs を使用すると、さらに簡単なチャット通信に Socket.IO を使用できます。もちろん他にも理由はありますので、振り返ってみてください。
技術選定が確定した後は、この技術フレームワークに基づいて以降の作業が行われますので、これ以上は説明しません。
全文検索エンジン(全文検索)
接客チャットボットには全文検索エンジンが必要 大量のチャットコーパスが用意された後、対応するコンテンツを効率的かつ柔軟に検索できる検索エンジンが必要です。
利用可能な全文検索エンジン システムは多数ありますが、最終的に選択肢を次の 2 つに絞り込みました。
1)レディサーチ
2)フレックスサーチ
RediSearchは全文検索を実現するRedisのプラグインモジュールで、オープンソース、高効率、多分野検索、完全一致、検索結果集約などの特徴があります。
参考URL:https: //redis.io/docs/stack/search/
FlexSearch は、オープン ソース、軽量、純粋な JS、依存関係なし、インメモリ インデックス作成という特徴を持つ Nodejs モジュールです。
参考URL:https: //github.com/nextapps-de/flexsearch
2つの製品を注意深く比較すると、RediSearchには成熟度、柔軟性、および多くの参照リソースという利点があることは明らかです.商用製品または長期計画を作成したい場合は、RediSearchを選択する必要があります.
FlexSearch の紹介と API インターフェースを見ると、参照ドキュメントの哀れな不足と成熟したケースがほとんどないことを除けば、大きな欠点はないようで、私の要件も満たすことができます。さらに魅力的なのは軽量なJSソースコードで、問題があればソースまでたどって修正できる点で、まさに私の気質と一致しています。
私はFlexSearch を選択しましたが、それが最高というわけではありません. より高度な商用システムを作りたい場合は、やはり RediSearch を使用することをお勧めします.
中国語の単語のセグメンテーション (トークン化とセグメンテーション)
全文検索エンジンを使用する場合、重要な作業は単語の分割です。索引付けプロセスでは、最初に元のテキストを分割してから、単語の分割結果を索引付けします。検索プロセスでは、最初に質問を分割してから、単語の分割結果を使用してクエリを実行します。
中国語の単語の分割は、ラテン語などの他の言語とは大きく異なります. ラテン語は単語の分割記号としてスペースと句読点を使用します. 各単語には明確な意味があるため、単語の分割プロセスははるかに簡単です.
中国語の単語分割はより複雑で抽象的です. 個々の独立した漢字は、別の単語に配置されると異なる意味を持ちます. 各漢字を単語分割の結果として使用すると、予想どおりに検索したい場合、予測不能で不安になります.大量の全文が生成されるため、ノイズによって目的の結果が完全にかき消される可能性があります。
中国語の単語セグメンテーションでは、テキスト シーケンスをスキャンして逆方向に処理し、単語のセグメンテーション位置と単語のセグメンテーション結果を判断するために、単一文字と複数文字の組み合わせを辞書内の単語 (または独自の定義済みの単語と用語) と比較する必要があります。 .
そこで、中国語のワード ブレーカーを探し始めたのですが、幸いなことに、選択したい 2 つの全文検索システムには、中国語のワード ブレーカーが用意されていました。
RediSearch は、中国語の単語セグメンテーションにFrisoライブラリを使用します. Friso は、C 言語で開発されたオープン ソースの高性能中国語単語セグメンターであり、一般的な mmseg アルゴリズムを使用して実装されています。モジュール設計と実装に完全に基づいているため、他のプログラムに簡単に組み込むことができます。このライブラリを参照するために Github に行ったところ、非常に優れていることがわかりました。
参考URL:https: //github.com/lionsoul2014/friso
FlexSearch はより柔軟で、使いやすい中国語シソーラスを選択できます。前述のFrisoは、php5、php7、ocaml、luaプラグインをカプセル化していますが、Nodejsパッケージはカプセル化していません.使用したい場合は、自分でカプセル化する必要があります.これについては、N-APIを参照してください.または Nodejs の Node-Addon-API。もちろん、私の現在の開発プロジェクトでは、Friso を Nodejs プラグインとしてパッケージ化する必要はありません。これは少し回り道です。Nodejs ファミリーで中国語のシソーラスを簡単に見つけることができるはずですが、確かに、github を検索すると多くのオプションがあります。
ノジェバは星が一番多いので試してみて単語の切り出し効果も悪くない気がするので使ってみます。
ドキュメント構造
技術の選択が完了したら、チャット コーパスのドキュメント構造の設計を開始します。チャット インタラクションの各ラウンド (1 つの質問と 1 つの回答) のコンテンツをドキュメントとして定義し、json オブジェクトで記述します。ドキュメント構造は次のように定義されます。
{
id:1, //文档编号,用于唯一标记一个文档
tag:"business", //标签,用于将语料进行分组归类
query:"你好", //问句
answer:"你好,有何吩咐?"//答句
}
すべてのドキュメントは配列に保持されます。
[
{
id:1, //文档编号,用于唯一标记一个文档
tag:"business", //标签,用于将语料进行分组归类
query:"你好", //问句
answer:"你好,有何吩咐?"//答句
},
{
id:2, //文档编号,用于唯一标记一个文档
tag:"business", //标签,用于将语料进行分组归类
query:"你贵姓", //问句
answer:"我叫云云" //答句
}
]
文書のクエリ属性は全文検索エンジンに渡され、索引付けされます. 検索プロセスは、一致する質問を検索するプロセスです. 一致する質問を検索した後、回答の内容が質問者にフィードバックされます.
大規模なコーパスでは、文書の質問で単語の繰り返しが一般的であり、質問が複数の結果を返す可能性があるため、最も一致するものを選択し、質問者の期待にできるだけ近い回答を作成する手段が必要です。 . これはより複雑な問題であり、後で詳しく説明します。
実装の詳細
技術の選定も終わり、文書構造も設計され、以下はコーディングの実装で、とてもわくわくしています。前の週に非常に多くの技術を参照しましたが、デモンストレーションは比較的十分だったので、さらに 1 週間かけて開発と実装を行う予定です。
バックエンド サービス
Nodejs+socketio は主にインスタント テキスト通信を実装し、その他の WebAPI インターフェイスをいくつか実装する必要があります。これは、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("接口服务已启动,端口:",serverPort);
});
/**
* 消息结构体 答句时code非0时表示没有对应答案,问句时省略
* {
* code:0,
* msg:"hello"
* }
*/
//加载语料
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;
/**
* 问句 交给聊天机器人处理,返回 答句
*/
let response_msg = chatter.chat(msg);
let response_data = {
code:response_msg?0:1,
msg:response_msg
};
callback(response_data);
});
});
以下は、チャットボットのコア ロジックです。全文検索エンジンのパッケージ ファイル 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; //搜索结果最多返回数
const documents = []; //存储所有文档
var id = 0; //id递增器
//创建全文索引器,具体参见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);
/**
* 添加语料接口
*/
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 }
このモジュールには、フルテキスト インデックス システムの作成、トークナイザーの作成、コーパス インターフェイス、クエリ インターフェイス、ドキュメント取得インターフェイスの追加など、多くのコンテンツが実装されていることがわかります。
最終的な機能の出力は、チャット インターフェイスを介して実現されます。チャット機能のコードを見ると原理は単純で、質問文に応じて回答文を取得し、複数ある場合は最初のものを返す。
コーパスの読み込みは、app.js にローダーを実装することで実現されます。
//加载语料
loader.loadall(chatter);
ローダーのタスクは、コーパスをメモリにロードし、インデックス作成のために 1 つずつフルテキスト インデックス システムに渡すことです。
表紙
フロントエンド ページは、フロントエンド ビューティーによって実現されます. チャット インターフェースの設計には数分かかります. ロボットの答えには、ロボットがデータを取得している ChatGPT のように、アニメーションを待つスチーム バッグがあります.
フロントエンドコード、通信部分はざっくりこんな感じです。
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){
//渲染聊天数据
}
});
効果向上
どんな時でも、自分を過大評価してはいけません。数日間のハードワークの後、私のチャットボットはすでにあなたとチャットできますが、その効果は何ですか? 評価はおおよそ次のとおりです:
你好
你好
你在哪里
我在北京
上海在哪里
我在北京
科灵顿在哪里
我在北京
それはただ退屈で、多くの質問への答えは答えを与えることにかかっています!
実はこれは想定内のことなのですが、1つはコーパスの内容が限られていることと、もう1つは検索結果が最適化されていないことです。Flexsearch の複数キーワード検索 (マルチサーチ) のスコアは大きく外れるため、単体で最適化するしかありません。オープンソースであるため、最適化することも、さまざまな方法で利点を利用して欠点を回避することもできます。
最適化 1、最適な一致結果を見つける
複数のレコードが見つかった場合、一致度が最も高いレコードを確認し、一致度を計算する方法を教えてください。単純な方法、つまり、質問文のすべての分詞が最も多く出現する回答を使用して、その回答を選択します。
したがって、クエリ プロセスを最適化します。
1) 検索前のアクティブな単語のセグメンテーション、重複排除、干渉単語の除外
2) 検索結果を比較し、最も頻度の高い結果を見つける
したがって、chatter で次の検索インターフェイスを実装します。
/**
* 复杂搜索入口,输入一个整句,这里进行分词、去重、搜索、合并
* 同步函数
* @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;
}
//限制搜索词个数
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);
}
});
//取最优结果
let result = null;
if(arrIds.length==1){
result = arrIds[0];
}else if(arrIds.length>1){
result = arrUtils.mixmix(arrIds);
}
return result;
}
最適化後、テストしてみると、案の定、精度が大幅に向上し、基本的には期待どおりの結果が得られました。
最適化 2、ビジネス コーパスを最適化し、独自の語彙を定義する
このステップも非常に重要です. ビジネスコーパスは顧客の質問に答えるために使用されます. 簡潔で人気のあるものにするようにしてください (大衆の習慣に沿って), 気を散らす言葉を取り除く.
たとえば、次の質問では、明らかに 2 番目の文の方が適切です。
你们公司的产品资料给我发一份吧
产品资料发一份
次に、シソーラスを定義し、顧客の一般的な単語、会社の製品、用語の辞書を作成し、単語セグメンターに渡すことで、カスタム辞書に従って単語をセグメント化できるため、検索のヒット率が向上します。良くなります。
最適化 3、状況依存検索
コンテキスト依存検索は、フィードバック結果に関連するコンテンツをより高い優先度で配置することで、インテリジェント ロボットによって返される結果が実際の人のチャット コンテンツにより似たものになるようにします。または同様のトピックですよね? もっと楽しく。
コーパスパッケージ
コーパスにはすべての質問と回答があります.チャットボットをより知識が豊富でインテリジェントにしたい場合は、コーパスを継続的に充実させる必要があります. コーパスの回答スタイルは、チャットボットのスタイルでもあり、コーパスの内容によって、彼女は優しいアシスタントになることも、凶暴な男になることもあります。
コーパスを 2 つの部分に分割し、それらにタグを付けました。1 つは特別なビジネス コーパス パッケージで、一般的な顧客のあらゆる種類の質問と回答をカバーしており、この部分は峨眉の貴社のビジネス スタッフによって提供および最適化されており、常に充実しています。1 つはゴシップ コーパスで、顧客との雑談やビジネス上の問題以外の問題に対処するために使用され、インターネットで検索したり、商用チャネルで入手したりできます。
最終的に、1,000 件のビジネス コーパスを編集し、インターネットから 100 万件のチャット コーパスを見つけました。100万件って結構あるんですか? 実はそんなに多くないんですけど、全文検索エンジンなら片面数ミリ秒で検索できるので、効率を気にする必要はありません。
最後の質問です。ChatGPT ではないのはなぜですか
先に述べたように、ChatGPT のようなシステムの研究開発には、才能、投資、膨大なコーパス/データ、および多くのコーパスのクリーニングと修正作業が必要であるため、企業の投機の一般的な概念は問題なく、この困難なタスクはまだ私たちの技術巨人に残されています。
ChatGPT は、米国の人工知能研究所である OpenAI によって発表された新しい人工知能技術主導の自然言語処理ツールであり、長年にわたる技術の蓄積と数十億ドルの投資を経て、世界の技術エリートによって開発されたものです。電子メールの作成、ビデオ スクリプト、コピーライティング、翻訳、コーディングなどのタスク。ChatGPTは、シーケンスデータを処理するためのモデルであるTransformerニューラルネットワークアーキテクチャを使用し、言語理解とテキスト生成機能を備えています.特に、現実世界の会話を含む多数のコーパスを接続してモデルをトレーニングします. ChatGPTは天文学を上から、地理を下から知る能力を持ち、チャットの文脈に応じたやり取りもできるため、実際の人間とほぼ同じチャットシーンでコミュニケーションをとることができます。
ChatGPTが注目された大きな理由は、新技術RLHF(Reinforcement Learning with Human Feedback、つまり人間のフィードバックに基づく強化学習)の導入です。RLHF は、生成モデルの核となる問題、つまり、人工知能モデルの出力を人間の常識、認知、ニーズ、および価値観と一致させる方法を解決します。ChatGPT は、AIGC (AI-Generated Content、人工知能生成コンテンツ) の技術進歩の結果です。
技術的な障壁やアルゴリズムや計算能力への投資はさておき, コーパスだけから始めましょう. ChatGPT は数百億のコーパスを使用します. チャットコーパスに加えて, 膨大な量のニュース情報, 天文学, 地理, 音楽, 絵画, 金融と書籍や資料には、中国の歴史的なアンソロジー、詩、歌などもほとんど含まれています。
従来のチャットボットにはインテリジェンスがないか、限られたインテリジェンスしかありません. 主なタスクは検索と回答であり、次のステップはコンテキスト環境と対話し、タスク ミドルウェアに挿入できる対話型チャットです。見積もり、電気機器の制御、業界の質問応答などはすべて、従来のチャットボットの範囲内です。一方、ChatGPT には、学習、模倣、関連付け、要約、および作成の機能があります。
さて、チャットはここまでです. 私のチャットボットはまだ最適化と改善が必要です. 貴重なアドバイスをいただければ幸いです. 今すぐ彼女とチャットできます: http://v.ruiboyun.cn/chat /
このロボットの心は限られています、ご容赦ください~ :)