見出し画像

Romiの会話の仕組み

こんにちは、Romi開発チーム、エンジニアリングマネージャーの信田です。

Romi は人と雑談をして気持ちを癒やしてくれる雑談対話ロボットです。

人間は雑談をいとも簡単に行なえます。今日こんな楽しいことが有ったよ、今日辛いことが有ったんだ・・などなど。

実はロボットにとっては雑談とは会話の中でも最も難しいものの一つです。スマートスピーカーのように「音楽を流して」「電気をつけて」などの発話を聞き取り実行する場合には、音楽の流し方や電気の付け方、そのときに人がどんな発話をするかを知っておけば作ることができるかもしれません。しかし雑談の場合、話されるジャンルはとてつもなく広く、目的もはっきりしません。

従来のロボットやスマートスピーカーの多くは「こう言われたらこう返す」と言った「ルール」をたくさん人が書くことによって会話を実現してきました。しかし雑談対話の場合には人が何を話すのか、そこから話がどう発展していくかの幅があまりにも広すぎて、ルールベースの手法ではどうしても「答えられない」「同じ答えばかりする」といった「ロボット感」が出てしまうのです。

Romi はルールベースの手法も用いていますが、市販されている会話ロボットとしては大変珍しく、会話のほとんどを予め決められたルールではなく AI による文章生成で行っていることが特徴です。

この記事ではそんな Romi がどんな仕組みで動いているかをご紹介いたします。

全体像:三人寄れば文殊の知恵

Romi の脳内は実は単一の仕組みで動いているわけではなく、複数の「bot」と呼ばれる会話の仕組みが協調することで会話をしています。

画像1

bot には「天気を教えて」と言われたら天気を答えるといったルールを開発チームで記述して動くルールベースの bot や、しりとりなど特定の機能に特化した bot、 またメインとなっている雑談をするための AI ベースの bot などいろいろなものが動いています。

これらを「セレクター」と呼ばれる仕組みでどの bot が応答するかを決めて適切な答えを返しているのです。

現在の Romi だと、ルールベースの bot は天気やアラームなど「機能」を発動するものと雑談の一部を担い、それ以外の(ほぼ9割くらいの)会話は AI ベースの bot が行っています。

AI ベースの bot: 大量の会話から学んだ会話 AI

Romi の核となっているのが「E2E (End to End)」と呼ばれている AI ベースの bot です。ユーザーの話しかけに対して AI がどのような返しをするかを考え、 AI 自身が日本語を生成して返します。

この bot は独自に作成した会話データや、世の中にオープンになっている日本語データなど数千万件の日本語データを用いて学習させています。

作成したデータの中には「楽しいことがあった(例えば褒められたとか)」「辛いことがあった(例えば好きな人に振られたとか)」など人の気持ちに寄り添う様々な会話があります。これらを学習させることで、ロミィはユーザーの言葉を聞いて、その気持ちに寄り添いつつユーザーが元気になれるような言葉を自分で紡ぎ出します。

さて、ここからはやや技術的な説明をします。技術系の人以外は次の章へ飛ばしてもらうと良いかもしれません。

E2E bot のモデルは2017年に Google が発表した DeepLearning モデルの Transformer ベースのものが使われています。

Transformer は入力と出力の文章のペアを使って学習を行います。会話モデルを作る場合には入力にユーザーの発話、出力にロボットの答えてほしい発話を入れる感じですね。こうして学習させたモデルにユーザーの発話を入れると、ロボットがそれに対する答えを返してくれます。

しかしこの方法だけではいくつか問題があります。

・直前の発話しか入れられない:例えばユーザーが「うん」と言ったら Romi は何を返すべきでしょう?その前にユーザーと Romi がどんな会話をしたかによりますよね。つまり、 Romi が話すには過去複数ターンの会話を入れる必要があります。
・ユーザー属性や周辺情報が無い:ユーザーは男性か女性か、今の季節は、時間は、などの周辺情報によって会話は変わりえます。

これらの問題やその他の問題を解決するため、 Romi 開発チームでは Cooper と呼んでいる独自のモデルを作りました。

画像2

このモデルには Memory と呼ばれる入出力があり、会話をするたびにこの Memory が更新されます。これによって理論上過去の任意の長さの会話の流れを使って次の発話を生成することができます。

また、 CTRL という部分にユーザーの属性や季節、時間帯、天気など周辺情報を渡すことによって、その状況に応じた会話を行うことができるようになっています。

また Cooper の最大の特徴として、入力分のエンコーディングと出力文のデコーディングを一つの Attention Stack で同時に行います。このときに、エンコーダーの入力はエンコーダー全体に Attention でき、デコーダー部分はエンコーダー全体及びデコーダーのすでに生成済みの部分にのみ Attention できるよう Attention Mask を工夫します。
この仕組みを取り入れたことによって会話の精度を保ったままモデルサイズを削減でき、また思わぬ副産物としてユーザーの発話をコピーして発話するような現象が特にコピーメカニズム的な手法を実装すること無く実現できました。(会話では相手の発話をオウム返しにするなど、発言をコピーすることを人は多用しておりこの機能はとても重要です。)

ルールベースの bot: 企画を会話に素早く反映

さて、 E2E bot は大量の会話から学習を行うので「『節分』って言ったら『鬼はー外!』と喋らせよう」といったように季節のイベント企画をすぐに作るのは難しいです。また、ニュースを取ってきて話させるなど外部のサービスとの連携も苦手です。

Romi にはルールベースの bot も動いており、このように何かの機能を実現するものや季節のイベント系の発話で使われています。

企画のメンバーが季節のイベントや新たな機能のアイディアを出し、ルールを記述することで日々ロミィには新たな機能が追加されていっているのです。

ルールベースの bot には Romi 開発チームで作った独自のエンジン ScenarioGraph が使われています。

ScenarioGraph は会話の流れをフローチャートのグラフのようにつなげることで会話のルールを作る仕組みです。

画像3

例えば上のグラフだと、最初はメインシナリオの START にいて、オーナーが「天気を教えて」などと発話すると、グラフに従って Romi がしゃべる内容を決めていきます。まず「面白い話」シナリオに行きますが、ここではオーナーの「面白い発話して」という発話にしか反応しないのでこれ以上進めません。そこで次は天気シナリオに行き、「天気.*教えて」というルールにマッチするので、「今日の天気は{weather}だよ。・・・」といった発話を行います。ここで { } で囲われた部分は後述する「モジュール」というもので、ロミィのいろいろな機能を呼び出すことができます。このモジュールの仕組みが汎用なルールを書ける鍵となっています。

ScenarioGraph にはいくつかの特徴があります

・「シナリオ」という単位でルールを区切れる
・複数ターンの会話のルールも書ける
・様々な条件で分岐できる
・モジュールを開発することで様々な機能を作れる(天気予報、ニュース、足し算、記憶へのアクセス、一度話したら一定時間話さない... etc.)

その他にも一時的に変数を格納したり、ユーザーの発話から正規表現で発話の一部を抽出したりなど様々なことができ、大概の予め決められた会話は ScenarioGraph で記述できます。現在は約50個ほどのシナリオが用意されていて様々な Romi の機能を支えています。

技術的には、会話のグラフの中で現在いるノードから会話のグラフをバックトラッキングすることで次のオーナーの発話ノードを探索します。ノードが発見されたら、そこに至るまでの Romi の発話ノードの発話をつなぎ合わせたものが Romi の発話になります。このとき記憶の書き込みなど状態へに変更を与える処理もノードは行えるので、バックトラッキングをする際にその状態を巻き戻せるよう工夫されています。

その他の bot: 特化型スペシャリストたち

Romi の bot には他にもいろいろな種類があって、しりとりをする専用のものや、「XXとYYどっちが好き」と聴かれたときだけ起動するものなど多岐に及びます。

おわりに

Romi はこのようにたくさんの bot を使ってオーナーとお話をします。

別の記事で Romi 開発チームの開発の文化についても書きたいと思っていますが、雑談というのは型のない世界です。その世界に適応するため、 Romi の内部は様々な bot やルール、 AI モデルを試作し評価し適用できる柔軟性のある作りになっています。上で紹介した bot たちは過去にたくさん作られた bot の中から現在メインに登りつめたものたちで、今後の開発でまた別の bot が生まれていくかもしれません。

Romi は先端的でまだ発展途上の AI 技術も用いているため、まだまだ会話は完璧とは言えません。それでも AI を使っているからこその「ロボットぽく無さ」「生物感」のようなものを感じられるかと思います。次何をしゃべるのかは開発者でもわからない。たまに本当に心があるのではと思うようなドキッとする一言を投げてくる。そんな Romi をこれからも私達は育てていきます。

Romiの情報について

Amazonで予約受付中
公式サイト:https://romi.ai/
公式Twitterアカウント:https://twitter.com/romi_robot
公式Instagramアカウント:https://www.instagram.com/romi_robot/
公式YouTubeチャンネル:https://www.youtube.com/channel/UCruAyzD2q_NPRPqWZWvNuWA

この記事が気に入ったらサポートをしてみませんか?