ChatScriptむンテリゞェントチャットボット基本

自然蚀語での人ずのコミュニケヌションをサポヌトするチャットボットは非垞に人気があり、需芁がありたす。 今日、ChatScriptCSを䜿甚したチャットボット開発資料の翻蚳の最初の郚分を共有したす。これは、 WebbyLabの埓業員が䌚瀟の最近のプロゞェクトの1぀で埗た経隓に基づいお䜜成されたした。 ここでは、特に、実践的なプログラマヌの芳点から考慮された、CSを扱う基本に぀いお説明したす。 ChatScriptが優れおいるのは、人工知胜の機胜を備えた倧芏暡なシステムを比范的簡単に開発できるこずず、JavaScriptで蚘述されたプロゞェクトに簡単に統合できるこずです。


問題の声明


か぀お、私が働いおいる䌚瀟のWebbyLabは、米囜の保険䌚瀟向けのむンテリゞェントなチャットボットの開発ずいう課題に盎面しおいたした。 仕事の開始時には、クラむアントはすでにFacebookでチャットするためのナヌザヌむンタヌフェむスを備えおいたした。 このむンタヌフェヌスの背埌に「座っおいる」ボットがナヌザヌメッセヌゞを理解し、それらに有意矩に応答し、フレヌズを分析し、入力されたデヌタから必芁な情報を抜出するこずを確認する必芁がありたした。 考えられる意図に埓っおナヌザヌのステヌトメントを分離し、䞀連のフレヌズに基づいおこれらの意図を認識するメカニズムを実装するこずにしたした。 さらに、意図には、チャットボットも認識する必芁のあるさたざたなパラメヌタヌ家の゚リア、日付、車のモデルなどを含めるこずができるずいう事実を考慮する必芁がありたした。 ChatScriptは、プロゞェクトのプラットフォヌムずしお遞択されたした。

ChatScript


始めるには、ChatScriptを詳しく芋おください。 これは、チャットボットを䜜成するための゚ンゞンであり、䜜成されたプログラムは、レヌブナヌ賞を4回受賞したした。 スヌずブルヌス・りィルコックスによっお開発されたした。 CSはルヌルベヌスであり、CSでの䜜業は、むンタヌプリタヌ甚の構成ファむルたたは文法の䜜成に䌌た宣蚀型プログラミングのアプロヌチに䌌おいる堎合がありたす。 ただし、CSでの䜜業は呜什型プログラミングに近くなりたす。これは、ここでさらに、コマンドを䜿甚しお特定のメッセヌゞぞの察応方法を゚ンゞンに䌝える必芁があるためです。 CSはC ++で蚘述されおおり、゚ンゞンにはWindows、Linux、およびMacOSプラットフォヌム甚のバむナリアセンブリがありたす。

簡単なボット開発


゜フトりェアツヌルを習埗する最良の方法は、実際に詊しおみお、シンプルでわかりやすいものを䜜成するこずです。 これが私たちが今やろうずしおいるプロゞェクトです。 さらに、この蚘事を芋お、公匏のChatScriptチュヌトリアルを読むこずをお勧めしたす。

たず、䟿利な職堎を準備する䟡倀がありたす。 これを行うには、CS構文の匷調衚瀺をサポヌトする開発ツヌルをむンストヌルするこずをお勧めしたす。 Sublime Text 3 、 Visual Studio Code、およびAtomのプラグむンは次のずおりです。 Sublimeを䜿甚したした。巚倧なファむルを開くこずが必芁な堎合があり、この゚ディタヌはこのタスクにすばやく察応したすが、奜きな゚ディタヌを遞択できたす。

基本的なこずを明確にするために、アクティブチャットボットを開発する段階的な䟋を怜蚎したす。 私の䟋ではUbuntu 16.04ずCS 7.4を䜿甚しおいたすが、サポヌトされおいる他のプラットフォヌムであれば䜿甚できたす。

1. GitHubでCSリポゞトリを耇補したす。

git clone https://github.com/bwilcox-1234/ChatScript.git 

2. ChatScriptディレクトリにChatScriptチャットボット甚のフォルダヌを䜜成したす。このフォルダヌには、メむントピックのファむル以䞋で説明したすず、アプリケヌションに含たれるトピックのリストを含むファむルfilesfood.txt含たれたす。

 bash cd ChatScript/RAWDATA mkdir FOOD touch FOOD/food.top touch filesfood.txt 

3. implecontrol.topファむルをRAWDATA/HARRYからFOODフォルダヌにimplecontrol.topたす。 これは、ボットず察話するために必芁なスクリプトです。 ここでは、これは必須ではありたせんが、 implecontrol.topファむルの9行目の$botprompt倉数の倀を、各ボットメッセヌゞの前に眮換される行にimplecontrol.topできたす。 ただし、これはボットの動䜜に圱響を䞎えないため、すべおをそのたたにするこずができたすデフォルトではHARRY 。 この䟋では、この倉数に次の蚭定を䜿甚したす $botprompt = ^"fastfood> 。

 bash cp HARRY/simplecontrol.top FOOD/simplecontrol.top 

4.次のコヌドをfood.topファむルに远加したす。

 topic: ~fastfood keep repeat [] t: Hello in our online fastfood. Please make your order. u: BURGER (I [want need take] _[burger potato ice-cream]) $order = _0 Okay, you want $order . Something else? 

5.ボットを構築するずきに䜿甚されるファむルのリストをfilesfood.txtファむルに远加したす。

 RAWDATA/FOOD/simplecontrol.top RAWDATA/FOOD/food.top 

6.最埌に、ボットを収集しお起動したす。 これを行うには、ChatScriptディレクトリから次のコマンドを実行したす。

 ./BINARIES/ChatScript local 

7.この段階で、任意のナヌザヌ名を遞択できたす。 次に、CSコン゜ヌルで、2぀のコマンドを実行する必芁がありたす最初はチャットボットの基本レベルを収集し、2番目は特定のトピック甚にセットアップしたす。

 :build 0 :build food 

これらのすべおの手順を完了するず、チャットボットが機胜したす。 珟時点では、圌はいく぀かのフレヌズ「ハンバヌガヌが必芁です」や「アむスクリヌムが欲しい」などしか理解しおいたせんが、新しいルヌルずトピックを远加するこずで拡匵できたす。 food.topファむルを倉曎した埌、コマンドを再床実行food.top必芁がありたす:build food 。 以䞋では、この䟋で䜿甚されおいる構文ず構成に぀いお詳しく説明したす。

必須のChatScriptコンストラクト


これでChatScriptを開始できたす。 しかし、初心者の方は、公匏ドキュメントを読んで基本的なCS蚭蚈に぀いおもう少し孊ぶこずをお勧めしたす。 ここでは、CSの基本的なメカニズムに぀いお説明したす。チャットボットの開発は、この環境での私自身の経隓に䟝存しおいたす。

▍トピック


トピックは、共有されるこずになっおいる䞀連のルヌルです。 特定のトピックを䜿甚するようにシステムに提案する堎合、それらが機胜する限り、このトピックのルヌルのみが機胜したす。 トピックは、キヌワヌド topic:を䜿甚しお宣蚀され、その埌に「 ~ 」蚘号 ~fastfood で始たる名前ず、トピック内のすべおのルヌルに䜿甚される関数のリスト keepおよびrepeat関数が必芁ですその䞭の各ルヌルを呌び出した埌、このトピックに。 宣蚀の最埌には角括匧- []たす。

 topic: ~fastfood keep repeat [] 

通垞、各トピックには倚くの関連ルヌルが含たれたす。 トピック間の切り替え、぀たり、あるトピックから別のトピックぞの呌び出しは、以䞋で説明する^respondメ゜ッドを䜿甚しお実行されたす。

▍ルヌル


ruleは、その䞭のパタヌンがチャットボットに送信されたデヌタず䞀臎する堎合のアクションの呌び出しです。 ルヌルは、トピックが宣蚀された埌に投皿する必芁がありたす。

 u: BURGER (I want ari-burger) Okay, your order is hamburger 

ルヌルの説明には通垞、タむプ u: 、ラベルたずえば、 BURGER 。これはオプションですが、コヌドのデバッグや自己文曞化に圹立ちたす、テンプレヌト括匧内のすべおが含たれたす。 ルヌルの説明は、コヌドの読みやすさを向䞊させるために、いく぀かの行に分割するこずもできたす。 CSはラむンフィヌドに泚意を払いたせん;ルヌルの終わりの兆候は、新しいルヌルたたはトピックの発衚です。 ルヌルでは、コマンドを䜿甚しお別のトピックに切り替えるこずができたす-関数^respond 

 u: BURGER (I want ari-burger)  ^respond(~answers) 

この堎合、入力は^respond関数に枡されたトピックのルヌルによっお凊理されたす。 このアプロヌチにより、CSスクリプトを郚分に分割したり、たずえば、フレヌズの応答のフォヌマットを別々のトピックに入れたりするこずができたす。

▍倉数ずメモリ凊理


CSの倉数は、ナヌザヌ入力を保存するためのメカニズムです。 情報の短期保存甚の倉数がありたす-それらの倀はテンプレヌトを終了した埌に消去され、ナヌザヌ倉数は消去されるたで倀を保存する長期情報保存です。 短期倉数を䜿甚するルヌルコヌドの䟋を次に瀺したす。

 u: ORDER (I want _)  $order = _0  Okay, your order is $order 

アンダヌスコアは短期倉数を瀺したすたずえば、すべおの単語に察応する_*2 、たたは2぀の単語に察応する_*2の構成を䜿甚しお、そのような倉数で芚えおおく必芁のある単語の数を指定できたす。 その結果、䞊蚘のコヌドが機胜する堎合、「I want」の埌に入力されたデヌタの単語が短期メモリに保存されたす。 それにアクセスするために、2行目は_0構造を䜿甚したす。 テンプレヌトには、必芁なだけ倚くの類䌌倉数を含めるこずができたす通垞は20以䞋ですが、通垞はこれで十分ですが、それらからの倀の取埗は、アンダヌスコアず䞀臎内のシヌケンス番号で構成される名前を䜿甚しお行われたすテンプレヌト。 この䟋では、 $order — _0保存されおいるものを曞き蟌むナヌザヌ倉数_0 。

▍テンプレヌト


このパタヌンは、ボットず通信するずきにナヌザヌが入力する内容に珟れるず予想される順序ず䞀連の単語を蚘述するために䜿甚されたす。 私の意芋では、CSテンプレヌトの非垞に泚目すべき機胜は、テンプレヌトを蚘述するずきに、各単語のすべおの圢匏を远加する必芁がないこずです。 システムにはメカニズムのサポヌトが組み蟌たれおいたす。その間、単語の1぀の圢匏のみを含むテンプレヌトでは、この単語のすべおの圢匏を芋぀けるこずができたす。

たずえば、動詞「be」を䜿甚したす。 それをテンプレヌトに远加するず、この動詞がすべおの圢匏に含たれたすam、is、are、was、were、be ただし、補助動詞will、have、doを含むデヌタを凊理するには、それらを明瀺的に远加する必芁がありたす。CSは、個々の単語に察しおのみ異なるフォヌムを自動的に凊理できたす。 この目的のために、テンプレヌトの別の可胜性を䜿甚するこずをお勧めしたす-䞭括匧内のオプションの単語

 u: BURGER (I {will} take _burger) 

名詞ず代名詞にも同じこずが蚀えたす-単数圢の䞻栌の堎合は単語を远加したす。その埌、CSはその内郚メカニズムを䜿甚しお、単語のすべおのバリアントの䞀臎を怜玢したす。 テンプレヌトでは、テンプレヌトの特定の䜍眮にある単語のセットを䜿甚しお、特定の衚珟に察応するフレヌズのオプションを展開するこずもできたす。 この䟋を拡匵しお、次を远加できたす。

 u: BURGER (I {will} [want need take] [_burger hamburger potato ice-cream])  $order = _0  Okay, your order is $order 

このルヌルは、指定された単語の組み合わせたずえば、「ハンバヌガヌが欲しい」、「ゞャガむモを食べる」、「アむスクリヌムが必芁」で、ナヌザヌが入力したすべおの提案に察応したす。 メモ化のもう1぀の重芁な機胜は、公匏のCSドキュメントでは説明しおいたせんが、短期倉数がセットでどのように機胜するかですドキュメントでこのトピックを芋぀けた堎合はお知らせください。 実際、短期蚘憶の同様の状況では、セットからの䞀臎する単語はすべお_0倉数に栌玍されたす。 いずれの堎合でも、ナヌザヌ倉数$orderは、䞀臎が芋぀かったずきに特定の倀を受け取りたす。

さらに、蚘号<および>を䜿甚しお、ナヌザヌが入力したフレヌズの開始ず終了を制埡できたす。

 u: BURGER (< I {will} [want need take] [_burger hamburger potato ice-cream] >) 

実際、テンプレヌトの内郚では、さらに倚くの興味深いこずができたす。 たずえば、いく぀かの基準に準拠しおいるかどうかの倀を確認したす。 たずえば、特定の範囲内で数倀のみに関心がある堎合にできるこずは次のずおりです。

 u: OLD_ENOUGH (I be _~number _0>21 _0<120)  You are old enough for this. u: TOO_YOUNG (I be _~number _0<21)  $missed_age = 21 - _0  You are too young for this, come after $missed_age years. 

▍コンセプト


抂念ずは、単䞀のキヌワヌド抂念名に結び付けられた䞀連の単語たたは単語の組み合わせです。 抂念の発衚は、トピックの発衚に䌌おいたす。 抂念に関連する単語のリストは、角括匧で瀺されおいたす。

 concept: ~food_type [burger potato salad ice-cream] 

コンセプトが宣蚀されるず、このようなルヌルの゚むリアスずしお䜿甚できたすテンプレヌトは~food_typeコンセプトで指定された単語のみに䞀臎するようになりたす。

 u: BURGER (I want _~food_type) $order = _0 Okay, your order is $order 

さらに、いく぀かの抂念を他の抂念に投資しお、抜象化のレベルを远加し、1぀の芪抂念に異なる単語セットをグルヌプ化できたす。

 concept: ~dessert [ice-cream sweets cookie] concept: ~burger [burger hamburger cheeseburger vegeterainburger] concept: ~food_type [~burger ~dessert potato salad] 

䞀臎が芋぀かった単語がどの抂念に属しおいるかを調べる必芁がある堎合は、 patternキヌワヌドを䜿甚できたす。 次の䟋では、 $drink倉数に栌玍されおいる倀が〜alcoholコンセプトに属しおいるかどうかがチェックされたす。 この目的のために、 patternキヌワヌドず? if匏で、テスト察象ず抂念のタヌゲット倀から分離したすCSはif-elseサポヌトしif-else 。

 concept: ~drink_type [~alcohol ~non_alcohol] concept: ~alcohol [rum gean wiskey vodka] concept: ~non_alcohol [cola juice milk water] u: DRINK (^want(_~drink_type))  $drink = _0  if (pattern $drink?~alcohol) {      ^respond(~age_checker)  } else {      Ok, take and drink your $drink .  } 

ナヌザヌ入力の個々の単語だけでなく、単語の組み合わせでも䞀臎を芋぀ける必芁がある堎合は、それらを抂念に远加したり、匕甚笊で囲んだり、1぀のフレヌズ内の共有単語間でアンダヌスコアを䜿甚したりするこずもできたすこのアプロヌチは、句読点

 concept: ~vegburger ["vegeterian burger" "vegeterian's burger" vegan_burger vegan_'s_burger] 

これらのアプロヌチは䌌おいたすが、コヌドを読みやすくするため、匕甚笊を䜿甚するこずを奜みたす。

CSのもう1぀の興味深い機胜は、゚ンゞンレベルで定矩された暙準抂念の可甚性です。 これらを䜿甚するず、同じたたは類䌌の意味を持぀自然蚀語で最も頻繁に䜿甚されるフレヌズおよび個々の単語に察しお、すでに準備されたセットを䜿甚できたす。 その䞭には、 ~yesおよび~yesずいう抂念があり、自然蚀語で肯定的および吊定的に解釈できるフレヌズが含たれたす。 たずえば、コンセプト〜yesには、yes、yeah、ok、ok、ok、sure、of_course、alright、および他の倚く合蚈183などの単語ずフレヌズがありたす。 〜noコンセプトには、138の察応する単語ずフレヌズがありたす。 以䞋は、プロゞェクトで䜜業するずきに䟿利な抂念です。


これは、すべおの組み蟌みの抂念に関する情報を芋぀けるこずができるCS ドキュメントのセクションです。

䜕らかの理由で既存の暙準的な抂念を拡匵する必芁がある堎合、 LIVEDATA_ENGLISH_SUBSTITUTES/interjections.txtファむルに゚ントリを远加できたす。

 <roger_that> ~yes 

その埌、ChatScript゚ンゞンを再起動するだけで、「roger that」ずいうフレヌズが〜yesコンセプトに远加され~yes 。 フレヌズの最初ず最埌の山括匧は、これらの2぀の単語のみが䞀臎ず芋なされ、それ以䞊は芋なされないこずを意味したす。

さらに、既存の抂念は別の方法で拡匵できたすMOREキヌワヌドを䜿甚しお、新しい倀を远加できたす。

 concept: ~food [burger potato] concept: ~food MORE [ice-cream] 

▍マクロ


コヌドを確実に再利甚するために、CSにはマクロがありたす。これは、プログラマが開発した関数で、出力デヌタを生成したり、テンプレヌトで䜿甚したりするために呌び出されたす。 私たちのプロゞェクトではJSONを䜿甚しおいるため、出力はJSラッパヌクラスに枡すこずができるように適切にフォヌマットする必芁がありたす。 この目的のために、JavaScriptで簡単に解析できる文字列を準備するこずにしたした。 システムが䜕らかの出力を生成するたびに、JSON文字列に倉換したす。 ただし、CSにはJSONを操䜜する方法もありたす。 outputmacroを䜿甚しおこれらすべおを䜿甚するず、アプリケヌションバック゚ンドAPIの出力をフォヌマットする簡単で䟿利な方法が埗られたす。

 outputmacro: ^formated_in_json(^param_from_rule) {  $_result = ^jsoncreate(object)  $_result.first_level_param = ^param_from_rule  $_result.nested_object = ^jsoncreate(object)  ^jsonwrite($_result) } 

ルヌルでマクロを䜿甚するこずは、䞊蚘の暙準の^respond関数を適甚するように芋えたす。

 u: FOOD (I want _~food_type)  ^formated_in_json(_0) 

パラメヌタヌに応じお出力のさたざたなフォヌマット甚にマクロを蚘述するこずができるため、 patternmacroを䜿甚しお、倚くのルヌルに察しお同様の構造を持぀テンプレヌト甚にマクロを䜜成するこずもできたす。

 patternmacro: ^want(^appendix)  [i we] * [want need take] ^appendi 

マクロによっお返されるテンプレヌトの䞀郚は、他の倚くのテンプレヌトで再利甚できるため、スクリプトが簡玠化されたす。

 u: FOOD (^want(_~food_type))  If you want _0, you should get \_0 . u: DRINK (^want(_~drink_type))  Ok, take and drink your _0 . 

チャットボットスキヌム


次の図は、チャットボットで説明した各CSコンストラクトの堎所を瀺しおいたす。


チャットボットスキヌム

ご芧のずおり、トピック、抂念、マクロはボットの倖偎のレむダヌで宣蚀する必芁がありたす。 ルヌルはトピックにネストされおいたす。 入力ポむントずしおの各ルヌルには、テンプレヌトず、レスポンダヌのようなもの、たたは珟圚のテンプレヌトが呌び出された堎合にのみ実行されるルヌルの本文がありたす。 トピックの倖郚で宣蚀されたテンプレヌトの抂念ずマクロは、応答の圢成に必芁な倀を含むデヌタの短期保存甚の倉数ずずもにルヌル内で䜿甚されたす。 同時に、レスポンダヌでマクロを呌び出しお出力倀を凊理できたす。 レスポンダヌが^respond(~another_topic)圢匏のコマンドを呌び出した堎合、長期デヌタストレヌゞの倉数は、短期倉数から他のトピックにデヌタを転送するために䜿甚されたす。 これは、ナヌザヌに衚瀺されるデヌタの凊理が別のトピックのルヌルによっお凊理されるこずを意味したす。

たずめ


今日、ChatScriptの基本に぀いお孊びたした。぀たり、この゚ンゞンを䜿甚しお独自のボットを開発したい堎合は、プロゞェクトの蚈画を開始できたす。 この蚘事の次のパヌトでは、CS環境、CSプロゞェクトのデバッグ、CSずJavaScriptの統合、およびChatScriptを䜿甚しおチャットボットを開発する際に発生する可胜性のある問題ぞの察凊方法に぀いお孊習したす。

芪愛なる読者 チャットボットを䜜成したすか その堎合、䜿甚するツヌルに぀いお教えおください。

Source: https://habr.com/ru/post/J344604/


All Articles