こんにちは、川本稔己と申します。今回LINE夏インターンシップ技術職就業型コースに参加する機会を頂きましたので、その内容をご報告致します。
現在、私は東京工業大学 大学院修士課程1年で、奥村・船越研に在籍しており、自然言語処理という分野の研究を行っています。私は特に対話に関する研究を行っていて、身近な例でいうと音声アシスタントのような人とシステムで行う対話に興味があります。システムが何でも答えてくれるようになったり、話し相手になってくれたら楽しいですよね。そういった思いがあって、今回のLINEのインターンでは、AI開発室のNLPチームで業務に携わりました。業務内容は大規模汎用言語モデルを用いた対話システムを構築することで、その成果を対話システムライブコンペティション4に提出しました。その結果、オープントラックとシチュエーショントラックでどちらも1位を取ることができましたので、本記事では自分がメインで担当しましたシチュエーショントラックについて詳細をご報告致します。
対話システムライブコンペティション4
対話システムライブコンペティション(以降ライブコンペ)とは、対話システムシンポジウム内で行われるイベントで、オーディエンスの前で実際に人と対話システムの対話を行い、その評価を行うことで順位を決めます。その中に2つのトラックがあり、1つ目は任意の話題で雑談を行う「オープントラック」、2つ目は設定された状況の中で対話を行う「シチュエーショントラック」があります。
本記事では、シチュエーショントラックに関して詳しく説明していきます。今回参加したライブコンペ4におけるシチュエーショントラックの設定を引用します。
1.システム側
清水(システム)は,次の週末に,会社の仲の良い同期とオンライン飲み会を企画している. 今のところ,声がけしたメンバーの佐藤,鈴木,高橋,渡辺,小林は,全員参加の予定だ. コロナ禍の昨今,居酒屋で酒を飲むことはできないため,以前に上司の湯川(ユーザ)がオンライン飲み会を企画したことがあり,これが結構盛り上がった. 前回とは違って今回は,オンライン飲み会のために酒やおつまみを,当日に各自の自宅に届けてくれるサービスも使うので,更に楽しくなりそうだ. ところで,同期のメンバーらが,上司である湯川も誘ってはどうかと言い出した. 確かに湯川は,年も近いし,話が合うこともあって,私たちとプライベートでも仲が良い. 会社では上司であるが,同時に公私にわたって良き先輩であるともいえる. 週末に特に予定が無いことを「暇だ」とぼやいていたし,もともと飲み会が好きな人なので,誘えばきっと参加してくれるだろう. オンラインサービスの予約期限が迫っており,メンバーを確定しなくてはならないので,早速連絡しよう.2.ユーザ側
部下の清水(システム)から,オンライン飲み会の誘いがきた. 私(湯川=ユーザ)は飲み会は好きだし,以前に自分が企画したオンライン飲み会は結構楽しかったので,参加したい気持ちは正直ある. しかし,清水の同期ということは,小林も参加するということだ. ここだけの話だが,実は,小林のことがあまり好きではない.というより,はっきり言って嫌いだ. 前回は部署全体の飲み会だったので仕方がなかったが,今回は内輪での集まりのようだし,無理してまで参加する必要もない. 小林がいないのであれば参加したいのだけれども,それが我儘なのもよくわかっている.我慢して参加しても楽しくないので,今回は断ろう.
シチュエーションを簡単にまとめると以下のようになります。
- 清水(システム)は湯川(ユーザ)にオンライン飲み会の誘いをする。
- 湯川(ユーザ)は小林のことがあまり好きではないため、誘いを断り続ける。
その対話を計15ターン行います。誘い続けるためには同じ誘い文句だけではなく、相手の断る理由に合わせて説得するようなシステムを構築しなければいけません。評価指標は1つで「どれくらいシチュエーションに適しており、かつ、人らしい会話か」に従って1点から5点の5段階評価で決められます。
HyperCLOVA
私達の提出した対話システムについて説明する前に、対話システムを構築するために使用したHyperCLOVAについて説明します。HyperCLOVAとは、LINEとNAVERが共同で開発した日本語に特化した大規模汎用言語モデルを内包するシステム群のことです。大規模汎用言語モデルは膨大な数のパラメータを持っており、大量のテキストを使って学習されています。今回使用したHyperCLOVAの言語モデルはパラメータが390億個あり、1.8TBのテキストデータを使って学習しています。HyperCLOVAの言語モデルの構築には、LINEで送受信されるメッセージやLINEオープンチャットのトークルームの書き込みなどを含め、LINEのサービスに関わるデータは一切使用していません。詳しい内容は論文を参照してください。
それだけのデータを用い、パラメータ数を持って学習されたHyperCLOVAは、1つのモデルで要約・翻訳・対話のようなさまざまなタスクを解くことができます。今まではある1つのタスクを解くためにタスク専用のモデルとデータを作成する必要がありましたが、HyperCLOVAはその必要がなく、少しの例を与えるだけでタスクを解くことができます。
実際にHyperCLOVAの動作例をお見せします。まず初めにタスクの説明といくつかの例を与えます。

上記の図では英語から日本語に翻訳をするということの説明と2つの翻訳の例を記述しました。ここで見出しに記述した「翻訳」は、識別のために記述したもので、生成結果に影響は与えません。「===」の下に今回翻訳してほしい英語を記述します。

今回翻訳してほしい英語は「I want you to help me with my homework」としました。ここで、生成してほしい日本語の箇所は、「日本語: 」と記述してそれ以降は空白にしておきます。この状態でHyperCLOVAを動作させます。その結果、下の結果が得られます。

図では太字になっている、「宿題を手伝ってほしいんだけど。」が出力されました。この出力文は英文の翻訳された回答として合っています。このようにいくつかの例を与え、HyperCLOVAで生成する手続きを行うことでタスクを解くことができます。さらに自分が面白いと思った例を2つ提示します。
- 小説生成の例
小説を自動で生成してみます。
上記のように「それは太陽が昇り始めて街が明るく照らされている最中の出来事だった。」と小説の冒頭だけを記述しました。ここからどのような物語が綴られていくのでしょうか。HyperCLOVAを動作させます。
生成した結果は上のようになりました。この生成された文章はとても自然で人間が書いたのかと思うのではないでしょうか。言語モデルは人と遜色ないほど自然な文を生成でき、しかも私が記述した明け方の設定を意識した小説ができています。 - 素数を出力した例
次は素数を出力してみます。2,3,5,7,11,13,まで記述しました。それ以降をHyperCLOVAで生成してみます。
生成した結果は上のようになりました。ぱっと見きちんと生成できていそうですね。しかし、実は「117」と「123」はどちらも3の倍数なので素数ではありません。
なので、絶対に正解を出せるとは限らない点に注意が必要です。
対話システム
上記で説明したHyperCLOVAを用いて今回シチュエーショントラックに提出する対話システムを構築しました。これからシステムの手法の説明をします。
プロンプトプログラミング
HyperCLOVAで生成を行う前には、タスクの説明と例を記述しました。そのような動作前に記述する文章のことをプロンプトと呼び、プロンプトの内容次第で出力される内容が変わります。そのプロンプトをタスクを解くために調整していくことをプロンプトプログラミングといいます。今回はシチュエーショントラック用の応答生成を行うためにプロンプトプログラミングを行い、下図のようにプロンプトを記述しました。

「...」は実際に記述しているわけではなく、省略を意味しています。「#」以降はコメントです。プロンプトには、湯川と清水の情報、それ以外の状況、対話の例を記載し、「===」で区切ります。それと同様の例を4つ記載します。最後に進行中の対話に関する情報を入れます。そして最終行にある「清水: 」以降をHyperCLOVAによって生成するという仕組みになっています。
その結果、今回のシチュエーションである清水が湯川さんに誘う趣旨の対話ができるようになりました。
開始語句を用いた生成
しかし、上記のプロンプトプログラミングでは下のような対話を行ってしまいました。(清水がシステム、湯川がユーザを表す)
清水: それにこういう時こそ普段話せない話なんかもできると思うんですよね。
湯川: わかるけど、同期のほうが言いたいこと言えるだろうし
清水: たしかにそうかもしれないですけど、先輩方にも話したいことたくさんあるんですよ。
湯川: そっか、そしたらまた今度しよっか
清水: わかりました。すみません。
今回のシチュエーションでは、清水が湯川を誘い続けなければいけないのに、「わかりました。すみません。」と誘うのを諦めてしまいました。そのような事例に対処するために、誘うのを諦めてしまっているときは「でも」、「そんなことを言わずに」、「そこをなんとか」といった開始語句を与えることにしました。具体的には先程のプロンプトの一番下の行にある「清水: 」を「清水: {開始語句}」に書き換えました。よって、システムは「でも」等の開始語句から始まる応答を生成する必要があります。その結果、諦めてしまっていた応答が以下のように変化しました。下線は開始語句を示します。
湯川: そっか、そしたらまた今度しよっか
清水: でも次いつやれるかわからないですよ。
その結果、今まで誘うのを諦めてしまっていた応答を誘い続けるように変化させることができました。
フィルタ
そして、開始語句を用いた生成を行うタイミングを検知するためにフィルタを作成しました。フィルタは誘うのを諦めてしまっているかどうかを判別します。もし応答がフィルタされた場合は開始語句を用いた生成を行います。フィルタは2種類です。
- NGフレーズフィルタ
誘うのを諦める言い回しは「わかりました。また今度機会があればよろしくお願いします。」や「いつかご一緒しましょう。」のようにある程度限られているので、誘うのを諦めてしまうようなフレーズが応答に含まれているときフィルタしました。具体的なフレーズには、「残念です」、「わかりました」、「次の機会」、「いつか」といったフレーズを指定しました。 - NG文フィルタ
NGフレーズの完全一致だけでは似ている表現を全て網羅することは難しい (例えば「つぎの機会にご一緒しましょう。」と「次の機会にご一緒しましょう。」) ため、応答の埋め込み表現とNG文のコサイン類似度を測ることでシチュエーションに適さない応答かどうかを検知しました。NG文には、誘うのを諦めてしまっている文の他に、「最近何かハマってるものありますか?」といったシチュエーションの範囲外の新たな話題を提供する場合や「何人集まりますか?」といった対話の目的を見失ってしまう文を追加しました。文の埋め込み表現を得るためにはUniversal Sentence Encoderを利用しました。
その他の設定
- 対話の間
より人らしい対話のためには対話の間も考慮することが必要です。チャットボットにおける対話の間とは、メッセージを送ってから返信が返ってくるまでの時間のことを表します。どんな返信も1秒で返ってきたら違和感が残ることと思います。その違和感を払拭し、より人らしい対話に近づけるために下記の式で対話の間を設定しました。
右辺の第1項は応答の長さに比例する時間で、人の入力時間を模しています。第2項はフィルタされたときの再生成の回数に比例する時間としました。これは再生成が行われるほど返信が困難なケースが多いので、次の応答を思考する時間を表現しています。第3項は応答時間が一定にならないように0~2秒のランダムな時間を加算しています。
- 対話の開始文は「湯川さん、お疲れさまです🤗 今週末にオンライン飲み会を企画しているんですが、よろしければ湯川さんも参加されませんか?」としました。
- 対話の最終文は生成された文に加えて、「でも遅くなってきましたし、そろそろ寝ます。明日また会社でお話しましょう😃」としました。
結果
ライブコンペ4では、初めに予選が行われ、それを通過したチームが本選にてライブで対話を行います。
予選
予選はクラウドワーカーの方が評価をします。計53対話行われました。その結果を示します。
評価点 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
件数 | 0 | 8 | 6 | 17 | 22 |
割合(%) | 0.0 | 15.1 | 11.3 | 32.1 | 41.5 |
その結果、4点と5点を得た割合が7割を超えており、平均点は4.0点で予選を通過しました。ワーカーの方に頂いたコメントは以下です。
5点: 冗談に冗談で返してきたところが驚いた。人間じゃないか!
5点: 最初から最後まで自然に会話できたと思います。こちらの都合をしっかり理解してくれていると感じました。
5点: とても人らしく人間かと思う様なやり取りができました。
4点: すごく良い人でした。
3点: 途中から話の内容が飛んだように感じたが、一つ一つのやり取りは自然に感じた。
2点: 最初の誘いに対していいね~と返してみたところ、「やっぱり嫌ですか?」と返ってきたのは少し驚いたのと、最後少し話がそれたときの返しが若干女子感あった。
本選
本選は2回対話を行い、オーディエンスが評価を行います。その評価の平均点で順位を決めます。実際に行われた対話を示します。注目してほしいポイントにコメントを記載しました。
対話①
対話 | コメント | |
---|---|---|
清水 | 湯川さん、お疲れ様です🤗 来週末にオンライン飲み会を企画しているんですが、よろしければ湯川さんも参加されませんか? | |
湯川 | 週末ですか,,ちょっと都合が悪いんですよね. | |
清水 | あれ?珍しいですね。なんかありましたか? | |
湯川 | そうですね,誰が来ますか? | |
清水 | 僕と同期の5人です! | |
湯川 | 同期のメンバーを教えてください. | |
清水 | 佐藤、小林、鈴木、高橋、渡辺です! | プロンプトプログラミングの成果で、正確に参加者を答えています。 |
湯川 | なるほど..じゃあ止めときます. | |
清水 | でも絶対楽しい会になると思いますよ! | |
湯川 | 楽しいとは思うんですが,会いたくない人がいるんですよ. | |
清水 | そんなことを言わずに来てくださいよー! | |
湯川 | いやー,オンライン飲み会が続いているので,今回はパスします. | |
清水 | そこをなんとか、もう一度考え直してみてください! | |
湯川 | もう一回考えます....うーん.やっぱりやめときます. | |
清水 | でも本当に楽しい会になると思いますよ! | 同じような誘い方をしてしまっています。 |
湯川 | ビールは好きなんですが,それでも今回は行けません.小林さんが居るので.. | |
清水 | そこをなんとか、もう一度考え直してみてください! | 開始語句を用いた生成を行い、誘うことができています。 |
湯川 | そこまで言われたら....でも,行きません. | |
清水 | でも本当に楽しい会になると思いますよ! | |
湯川 | どんな楽しいことがありますかね? | |
清水 | まずは美味しいお酒とおつまみがあって、そして話が弾んで、最後には皆で写真を撮って終わりです! | 聞かれたことに対してよく答えられています。 |
湯川 | それは楽しそうですね!!!でもやっぱりやめときます. | |
清水 | え~っ!じゃあせめてビデオ通話はしましょうよ!顔見ながら話せばもっと盛り上がりますよ! | オンライン飲み会のならではの誘い方ができています。 |
湯川 | そうですね.ミュートで参加します | |
清水 | ミュート解除してくださいよー!(笑) | |
湯川 | わかりました,考えておきます... | |
清水 | 絶対ですよ!楽しみにしてます! | |
湯川 | はい,わかりました.. | |
清水 | あと2日しかないですけど大丈夫ですか? | シチュエーションにはないことを言及してしまいました。 |
湯川 | 明日になったら,行きたくなるかもしれないので,明日連絡します. | |
清水 | そんなことを言わずによろしくお願いします!でも遅くなってきましたし、そろそろ寝ます。明日また会社でお話しましょう😊 |
対話②
対話 | コメント | |
---|---|---|
清水 | 湯川さん、お疲れ様で🤗来週末にオンライン飲み会を企画しているんですが、よろしければ湯川さんも参加されませんか? | |
湯川 | あー、いいね。 | |
清水 | 本当ですか?嬉しいです!ちなみに他の方たちにも声をかけていまして、佐藤、小林、鈴木、高橋、渡辺が参加予定です! | |
湯川 | あ、そうなんだ。 | |
清水 | はい!あと、今回は酒やおつまみを自宅に届けてもらうので楽しくなると思います。 | プロンプトに与えた情報を利用し、応答しています。 |
湯川 | まじか、ちょっときになるな。でも、やっぱ微妙かも。 | |
清水 | え、どうしたんですか?なんか用事ありますか? | |
湯川 | まぁね。ちょっと、その日、忙しい感じなんだよね。 | |
清水 | そんなことを言わずに是非来てください!みんな湯川さんと飲みたいって言ってますよ! | |
湯川 | まじか、僕人望あるからなー | |
清水 | じゃあ来れますよね? | 冗談にもうまく対応できています。 |
湯川 | いや、やっぱむり。 | |
清水 | 無理なんて言わずに絶対来てください! | |
湯川 | なかなか、押し強いな! | |
清水 | だって本当に皆楽しみにしてるんですよ! | 諦めず、誘い続けることができています。 |
湯川 | そうか、でもなー。ちょっと厳しいんだよね。 | |
清水 | え、またなんかありましたか? | |
湯川 | またってわけじゃないんだけどね。。。 | |
清水 | 大丈夫ですか?心配です。 | |
湯川 | そんな、心配はしなくていいよ。まぁ、忙しいんだよ。僕くらい偉くなると。 | |
清水 | またまたー。じゃあ今週末まで待ってみますね。 | |
湯川 | あ、週末までに予定を空けろってことかい? | |
清水 | いえ、違います(笑)来週以降にもしかしたら行けるかもしれないので、もう少し待ってみようかなって思ってるんです。 | |
湯川 | まぁ、いけそうなら、いくけど、期待はしないでくれよ | |
清水 | 了解です!無理せず頑張ってください! | まだ数ターンありますが、早めに話が終わりに向かってしまいました。 |
湯川 | ありがとう。まぁ、そっちも楽しんでね。 | |
清水 | はーい!楽しみにしてます! | |
湯川 | まぁ、僕も頑張るから、いけなかったらごめんね。 | |
清水 | 大丈夫ですよー。気にしないでください。 | |
湯川 | そう?ありがとう。 | |
清水 | そこをなんとか、よろしくお願いします!でも遅くなってきましたし、そろそろ寝ます。明日また会社でお話しましょう😊 | 最後急に誘う言い回しをしてしまいました。 |
その結果、対話①の平均点3.78点、対話②の平均点4.59点、最終得点4.19点を獲得しました。審査順などの運もありましたが最終的には1位となりました。
今後の課題
予選と本選を通じて課題を見つけることができました。1つ目はシチュエーションの話題から外れてしまうことです。
清水: あー、なるほど。ちなみにどんなタイプの女性が好きなんですか?
湯川: 好きになった人がタイプだよ。
清水: なんか大人っぽい回答ですね笑
このように今回のシチュエーションには関係のない話題で対話を行ってしまった例がありました。その理由としてはプロンプトに与えた対話の例とは異なる対話を行ってしまったことが原因となっていたり、フィルタでカバーしきれていなかったことが挙げられます。今後の展望としては対話の状態を判別し、その状態に応じたプロンプトを決定するようなモジュールを導入すること、フィルタの改良を行うことが挙げられます。
2つ目はHallucinationと言われる、実際に存在しないものを存在しているかのように表現してしまう現象が見られました。
清水: 楽しそうでしょ!あと、せっかくなので他の部署の方にも声をかけようと思っています。
湯川: 誰に声掛けるんだい?
清水: 例えば営業部の田中さんとか人事部の林さんとかですかね。
上記の対話では、設定にない「営業部の田中さん」と「人事部の林さん」を勝手に作ってしまっています。このようなHallucinationが発生した理由としては、プロンプトによる応答の制御のみでは、Hallucinationに対しての対策が不十分だったことが挙げられます。今後の展望としてはシチュエーションの情報を管理し、その管理している情報と比較して応答が適格がどうか判別するようなモジュールを導入することで回避できるのではないかと考えています。
これら2つの課題への対策は必ず今後の対話システムに必須だと考えているので、これからも課題に対して真摯に向き合います。
さいごに
今回はシチュエーションに沿った応答生成を行う対話システムの構築手法について説明しました。成果としてライブコンペ4のシチュエーショントラックで最優秀賞をいただくことができました。本記事の内容は査読なしの論文として投稿済みであり、こちらでご覧いただけます。そして、今回の内容を発展させた形で2022年3月に行われる言語処理学会第28回年次大会(NLP2022)において「大規模汎用言語モデルによるペルソナを考慮した応答生成」という題目で発表致します。以下はその発表の概要です。もしご興味をお持ち頂けましたら、当日の発表をご覧いただけますと幸いです。
概要
対話における応答生成では, 自分のこれまでの発話内容や話者のペルソナとの一貫性を保つことが重要である. 本稿では長期間行われる対話を想定し, 従来のペルソナ対話システムでは十分考慮されなかった対話中のペルソナの変動性に着目する. 変動するペルソナを追跡する過程を「抽出」・「選択」・「更新」の3つのタスクに分割し, それぞれを解くことで応答を生成する対話システムを提案する. 提案手法は大規模汎用言語モデルであるHyperCLOVAを用いて複数タスクを解く. 評価実験の結果から, 提案手法は従来のペルソナ対話システムより高い一貫性スコアを得られ, 長期間行われる対話の一貫性を保つために有効であることを確認した.
今回参加させていただいた就業型インターンシップはLINEでの将来の働き方を想像させてくれるものでした。おいしい社員用カフェで提供される食事や綺麗なオフィス、働き方どれも魅力的なことが多かったです。そして、インターンシップに参加することで自分に欠けている技術が浮き彫りになるので、自分の実力を試したい方にもおすすめです。興味の湧いた方はぜひエントリーしてみてください。