ユーザーの抱える曖昧な課題を解決する動画推薦機能
我々のサービスに限らず、仕事をしている社会人の皆様は仕事に関する曖昧な課題を抱えている方が多いと思ったことが、学びナビを作ったきっかけでした。
- もっと自信をつけたい
- 仕事ができるようになりたい
- 毎日辛い
上記のような人が「頑張ってみよう」と思って、GLOBIS学び放題を使い始めてくださる方も非常に多いです。しかし、全体で3300コース以上もあって毎月70〜100の新コースがリリースされているので、ご自身の悩みや課題にマッチしたコースを見つけにくい状況でした。
ユーザーの学習行動に基づいて推薦を行う機能も元々ありますが、曖昧な課題を抱えているユーザーさんは学習が全然できていないので、推薦内容があまり刺さらないケースも多々ありました。
そして、検索機能にはキーワード検索やタグ検索、カテゴリ検索がありますが、課題が曖昧な人は入力するワードが曖昧だったり思いつかなかったりするので、適切なコースが検索でヒットしにくいのが課題でした。
では、ユーザーの曖昧な課題に答えるには何が理想なのでしょうか?
メンター(またはメンターに相当する人)からアドバイスを実際にもらって、自身の課題に対する解像度を高めて、具体的に取り組む内容を示してもらうことが過去の検証から最も効果的だと分かりました。
メンターのアドバイスとコース推薦に関して、以前は人が介入する必要がありました。しかし、 ChatGPTの登場以降はAIの文章解釈能力が向上したので、LLMに任せられるのではないかと思い始めました。
GLOBIS学び放題の中で実装するのであれば同時に学習動画の推薦もできると思って、チャットボットの推薦機能の開発に至りました。
RAGを活用して納得感のある推薦を実現
通常のRAGで実現する場合は、事前準備としてデータベースから動画学習コースのデータを取得して、Embeddingモデルでベクトルに変換して、ベクトルデータベースに入れておきます。
運用フェーズではユーザーの入力を受け取って、 同じEmbeddingモデルでベクトル化したものをクエリにして、関連度や類似度の高いデータを抽出します。抽出した内容をプロンプトのコンテキストに含ませて、最後はLLMに回答を生成させるという流れです。
同時にコースをおすすめすれば、ユーザーさんの曖昧な悩みへの回答と推薦ができるようになります。 しかし、今回はもう少しカスタマイズが必要なので、RAGを活用して実現したかったポイント毎にどのように対応したかを紹介していきます。
1つ目のポイントは、ユーザーさんの曖昧な入力に対して課題解決の糸口を見つけて良質な推薦を行いたかったというモチベーションです。
通常のRAGでは、クエリが曖昧だと取得するRetrievalの精度も良くならない懸念がありました。そこで 今回は、LLMにユーザーの曖昧な課題の解像度を高めさせた結果をRetrievalに使うと抽出精度が上がるのではないかと考えました。
森本さんの発表にあったHydeと同様の発想で今回Retrievalの精度を上げる仕組みを作っています。
ユーザーの入力が曖昧だと適切なRetrievalが得られないので、ユーザーの入力をLLMに投げて生成させたアドバイスをクエリに使って、Retrievalを行う流れに変更しました。こうすることで、LLMが生成したアドバイスに基づいたコースの生成に繋がると思いました。
2つ目のポイントは、推薦されたコースに対して納得感を持ってもらいたいという部分です。開発段階では、入力とLLMからの返答と推薦されたコースに一貫性が無いとコースを見ようと思わないとフィードバックがありました。そして、一貫性についてはコースの推薦理由がユーザーにちゃんと伝わっているかが重要であると感じました。
そのため、アウトプットは一貫性を示す形にするために、最終的にユーザーの入力とLLMが生成したアドバイスと抽出したコース情報をコンテキストとして与えて、一貫性を持たせた推薦理由を生成させるステップを追加します。
事前準備は先ほどと同じで、Retrievalにはユーザーの入力ではなくLLMに生成させたアドバイスを使います。 そして、中で生成したアドバイスやコンテキストの情報、コースの情報などを全部コンテキストに含めて、一貫性のあるアウトプットをユーザーにも示すステップを実装しました。
実際に動いている中で見てみると、最初にLLMにアドバイスを生成させています。
裏側ではアドバイスを元にRetrievalしています。おすすめコースを聞くとRetrievalの結果を表示してくれます。
1つ1つのコースに対して 一貫性を持った推薦理由をユーザーさんに出すのも1つ1つ分けて出す形で最終的な実装を行いました。
Retrievalの精度とRAGシステムの評価には改善の余地がある
これからトライしていきたい課題として、まずはRetrievalの精度に改善の余地があります。
コースのベクトルデータベースを作る段階では、動画のタイトルや概要文などのメタ寄りの情報しか使えていません。本来なら動画の中身の情報を使うべきですが、データとして活用できる形に整備ができていない状況です。文字起こしや字幕データから要約を作成して、ベクトルデータベースの構築にも活用したいと考えております。
続いてはRAGシステムとしての継続的な評価です。
現状はやり取りのログ集計や簡易分析を行う程度に留まっていて、Retrieval自体の評価や、ユーザーの入力とLLMの生成結果と推薦結果の一貫性に関する評価は実施できていません。そのため、定量的に観測していくための方法をいくつか試したいと思っています。
丸岡氏のコメントと視聴者からの質問に答える質問タイムへ
――まずは、最後の方で挙げられていた評価の手法や一貫性を保つ評価の仕組みに関する技術的観点について丸岡さんはいかがでしょうか。
丸岡:評価指標を定めて評価していくことに尽きると思います。評価用のデータセットを作っておいて、システムの変更前後での結果の変化をスコアリングしていく形です。指標の計算の仕方やツールがいくつかあるので、随時導入して改善していくのが 一般的でしょう。
私もRAGを作っていますが、一言入力したらほぼ正解の答えを100%に近い精度で返してくれる検索エンジンのような感覚でユーザーさんが使っているケースが多いです。しかし、生成AIの本当の用途としてはその感覚は違うと思います。1発で正しい答えを返すのは人間同士でも難しいのではないでしょうか。
そのため、「もう少し質問させてもらっていいですか」「これに関してはどうなんでしょうか」のような質問を加える対話形式で、AIからの情報を正しく引き出すアプローチが有効だと感じています。
田邊:おっしゃる通りでして、実際にリリースしたユーザーさんの行動を見ると、検索と同様の使い方をしているケースがほとんどでした。
少し検索してダメなら離脱してしまうケースは多いので、もう少し深掘りできる形式にしていきたいです。同時にインターフェースの課題も考えないと、AIの能力が発揮できないと思っています。
丸岡:ソフトバンクの孫さんは生成AIに関する講演で、毎日生成AIと対話や議論をしているとおっしゃっていましたが、生成AIの使い方としては非常に適していると思います。皆さんにもそういった使い方をして欲しいですが、我々としてはどうすればいいかが悩ましいところです。
――「ユーザーの入力に対する解像度を上げるプロセスからRetrievalクエリに持っていく流れをもう少し詳しく教えていただけないでしょうか」とのことですが、田邊さんいかがでしょうか。
田邊:ユーザーさんは、自身の課題に対して検索すべきキーワードが分かっているとは限りません。そのため、曖昧な感じで入力しても風呂敷を広げていく感じで解像度を上げていければ良いと思っています。
例えば、 「論理思考力を高める取り組みをすればいいかもしれません」という回答を得るときに、ユーザーさんの入力には「論理思考」というキーワードは出てこなくても、LLMがアシストして解像度を上げたものを基準にコースを取ってくれば、ユーザーさんの裏で抱えている課題に近いコースが抽出しやすくなるのではないかと思います。
――続いて、「一貫性がないコースが推薦されてしまった時に、LLMが無理やり一貫性の理由を生成する問題はないのでしょうか」とのことですが、いかがでしょうか。
田邊:正直あると思います。実際に一貫性がなくても一貫性があるかのような文章は作れますし、ユーザーさんに表示してしまうのを防ぐのは難しいです。ハルシネーション検知の課題だと思っていて、大きな課題の1つと捉えています。
丸岡:100%ではありませんが、結果をもう一度LLMに評価させるのが有効です。「関係のないことを無理やり答えていませんか」と問うステップを挟むだけで少しは精度が良くなるという研究論文もあります。