Amazon Web Services ブログ

Amazon Bedrock および Amazon OpenSearch Service を使用して IMDb データセット上に生成系 AI 会話型検索アシスタントを構築する方法

このブログでは、大規模言語モデル(LLM)、Amazon Bedrock、Amazon OpenSearch Service を使用しておすすめの映画を教えてくれるチャットボットを作成する方法をご紹介します。このデモンストレーションでは、幅広いエンターテイメントのメタデータを提供する IMDb and Box Office Mojo Movies/TV/OTT のライセンス可能なデータパッケージを使用します。Amazon Web Services(AWS)の Media & Entertainment(M&E)のお客様の多くは、AWS Data Exchange を通じて IMDb データのライセンスを取得しています。これにより、コンテンツが見つけやすくなり、顧客エンゲージメントと定着率が高まります。完全一致クエリとセマンティック一致クエリの両方において、IMDb データセット上に検索拡張生成(RAG)チャットボットを構築する方法について説明していきます。

背景

映画やテレビ番組を見ているときに、「他にもこのような映画がないかな?」、「この映画の俳優は他にどんな映画に出演しているのかな?」などと思ったことはありませんか?このブログ記事では、Amazon Bedrock サービスの LLM と IMDb などの外部データソースを使ってこれらの質問に答える方法をご紹介します。

この記事では、オンラインの M&E プラットフォームで会話型検索を有効にして、使いやすいユーザーエクスペリエンスを提供する方法について順を追って説明します。昨今、LLM はさまざまな自然言語処理や自然言語理解(NLP/NLU)タスクの分野で画期的な成果を上げています。LLM は、未加工のユーザーの意図を正確に理解し、特定のコンテキストに沿った結果を生成することができます。また、いくつかの例(few-shot 学習)を与えることで、RAG 技術を通じてナレッジベースに基づいて質問に答えることができます。これらの技術と IMDb のようなデータセットを併用することで、ストリーミングプラットフォームのユーザーは「トム・クルーズが出演するコメディー映画」や「ロンドンで撮影されたトム・ホランド出演のスパイダーマンの映画」などの高度な検索クエリを作成することができます。さらに、LLM の会話機能のおかげで、ユーザーは洗練されたクエリから始める必要がなくなります。ユーザーは LLM に一連の探索的なクエリを実行し、興味のある映画を絞り込むことができます。

IMDb と Box Office Mojo Movie/TV/OTT のライセンス可能なデータセット

AWS Data Exchange の IMDb データセットは、16 億件を超えるユーザー評価、1,300 万人を超えるキャストとクルーのクレジット、1,000 万本もの映画/テレビ/エンターテイメント作品、ならびに 60 か国以上の世界の興行収入レポートデータを保持しています。

大規模言語モデル(LLM)

大規模言語モデル(LLM)は、一連の単語やフレーズを予測できるように、膨大な量のテキストデータを用いた広範囲にわたるトレーニングされた人工知能(AI)モデルです。これらのモデルは、言語翻訳、テキスト生成、感情分析など、さまざまな自然言語処理業務に精通しています。特にラベル付けされたデータが不十分な状況で真価を発揮し、ラベル付けされていないデータから単語の適切な文脈や解釈を予測できるため、人の言葉に近いテキストを作成することができます。

検索拡張生成(RAG)

検索拡張生成(RAG)は、コンテンツの検索と生成を組み合わせたニューラルテキスト生成手法です。LLM の最近の進歩により、一貫性のある流暢なテキストを生成できるようになりました。しかしながら、これらのモデルは生成機能のみに依存しているため、事実に即した正確で一貫性のあるテキストの生成は苦手です。この問題を克服するために、研究者たちは、ニューラルテキスト生成とニューラル情報検索を組み合わせた RAG を提案しました。まず、検索モデルを使用してナレッジソースから関連情報を取得します。ここで取得した情報が、その後のテキスト生成プロセスに情報を提供する基盤となります。次に、取得した情報はニューラルテキスト生成モデルに統合されます。この統合は、生成プロセスをガイドし、制約を課す役割を果たします。この方法を組み合わせた結果、生成モデルは、取得した情報と一貫性のある、より事実に即した出力を生成できるようになります。

Amazon OpenSearch Service

Amazon OpenSearch Service は、インタラクティブなログ分析、リアルタイムのアプリケーションモニタリング、ウェブサイト検索などを簡単に実行できるフルマネージドサービスです。OpenSearch は、Elasticsearch から派生したオープンソースの分散型検索および分析パッケージソフトです。OpenSearch Service は、OpenSearch の最新バージョンに加え、19 バージョンものElasticsearch(バージョン 1.5 から 7.10)をサポートしているほか、OpenSearch Dashboards と Kibana(バージョン1.5から7.10)を利用した視覚化機能も提供しています。

アーキテクチャ

IMDb and Box Office Mojo Movie/TV/OTT のデータセットを使って会話型検索とチャットがどのように行われるかを見てみましょう。

次の図は、(1)ユーザークエリを受信して結果を表示するフロントエンドとして機能する Streamlit アプリ、(2)クエリを処理してレスポンスを得る多数のバックエンドコンポーネントで構成されるソリューションアーキテクチャを示しています。

Architecture diagram

まずユーザーは、Streamlit アプリを操作して検索するユースケースに関連するクエリを入力します(上図に青丸で表示)。これには、特定のジャンルや特定の俳優が演じる映画を検索する質問などが含まれます。

バックエンドでは、Amazon Bedrock の LLM を使用して、ユーザークエリを OpenSearch ドメイン固有言語(DSL)クエリまたはエンベディングに変換します。たとえば、下記のユーザー検索クエリ:

"What movies are starring Tom Cruise?" (トム・クルーズが主演している映画は?)

は下記の検索クエリに変換されます。

{"query":{"bool":{"must":[{"terms":{"stars.keyword":
["Tom Cruise"]}}]}}, "sort": [{"rating":
{"order": "desc","missing":"_last",
"unmapped_type" : "long"}}]}

検索クエリは、OpenSearch インデックス(ここでは、全文インデックスと kNN ベースインデックスの両方を作成します)に保存されている IMDb and Box Office Mojo データセット内の最も類似した記録を返します。レスポンスには、映画のプロット、公開日、ジャンル、ロケーション、評価、監督、プロデューサーなど、関連する映画に関する情報が含まれます。

目的の出力を得るための理想的なプロンプトや指示(プロンプトエンジニアリング)は、LLM によって異なる場合があることに注意してください。こちらで指示を変更して、選択した LLM に合わせて最適化することができます。

検索結果を受け取った後、ユーザーは仮想エージェントのアクティブ化を選択できます。このエージェントは、検索クエリに対するレスポンスドキュメントと LLM を使用して、検索結果で見つかった映画に関するいかなる質問にも回答できます。さらに、チャットインタラクションにはセッション固有のメモリが保持されるので、仮想エージェントは回答する際に以前のユーザー検索クエリを参照することができます。

前提条件

このソリューションを実装するには、AWS アカウントが必要であり、OpenSearch サービスと Bedrock に精通している必要があります。このアプリケーションをテストするための大まかな手順は次のとおりです。

  1. IMDb データセットの作成
  2. IMDb エンベディングの生成
  3. OpenSearch インデックスの作成
  4. Streamlit アプリケーションのローンチとテスト

AWS CloudFormation によるリソースのプロビジョニング

ソリューションの構造をご理解頂いたところで、ソリューションをアカウントにデプロイしてサンプルワークフローを実行することができます。このワークフローは、Amazon OpenSearch Service と Amazon SageMaker Studio ドメインを適切な設定の VPC モードで起動します。

スタックは、GitHub リポジトリの cloudformation template を使用して、AWS CloudFormation コンソールの AWS Region us-east-1 上でローンチできます。

1.     IMDb データセットの作成

1.1 データを Amazon S3 にエクスポートする

IMDb データセットを使用するには、以下の手順に従います。

Step 1: AWS Data Exchange で IMDb データにサブスクライブする

  1. こちらのリンク(https://console.aws.amazon.com/)から AWS Management Console にログインする。
  2. 検索バーで AWS Data Exchange を検索し、[AWS Data Exchange] をクリックする。
  3. 左側のパネルの [Browse catalog] をクリックする。
  4. [Browse catalog] の検索ボックスに [IMDb]と入力する。
  5. IMDb and Box Office Mojo Movie/TV/OTT Data(SAMPLE)または IMDb and Box Office Mojo Movie /TV/OTT Data(PAID)のいずれかにサブスクライブする。

IMDb は毎日 1 回、データセットを AWS Data Exchange に公開しています。

Step 2: IMDb データを ADX から Amazon S3 にエクスポートする

こちらのワークショップの手順に従い、IMDb データを ADX から Amazon S3 にエクスポートする。

Step 3: ファイルを解凍して title_essential_v1_complete.jsonl および name_essential_v1_complete.jsonl を取得する

1.2 IMDb データセットを処理する

IMDbデータをインデックス作成に使用するには、未加工データを表形式に処理する必要があります。まず、IMDbファイルを統合して映画のタイトル情報を映画のキャスト/スタッフの情報とマージし、俳優や監督などのすべての名前を1つのデータセットにまとめます。次に、それをMovieLensデータに含まれる映画の小さめのセットと合わせてサブセットを作成し、映画の数を減らして小さなカタログ状にします。このサブセットの作成は任意であり、データセット全体を処理することも可能です。

2つのIMDbデータセット(code)をマージする手順は次のとおりです。

  1.  title_essential データセットを列でフィルタリングする: `[‘image’, ‘titleId’, ‘originalTitle’, ‘titleDisplay’, ‘principalCastMembers’, ‘principalCrewMembers’, ‘genres’, ‘keywordsV2’, ‘locations’, ‘plot’, ‘plotShort’, ‘plotMedium’, ‘plotLong’, ‘imdbRating’, ‘year’, ‘titleType’]`
  2. principalCastMembers 列をカテゴリ別に分割し、Actors、Directors、Producers の 3 つの列を新たに作成する。(これらの列には数字のIDしか含まれていません)
  3. name_essential データセットのマッピングからキャストメンバー(俳優、監督、プロデューサー)の実際の名前を含めて、映画データセットに追加する。
  4. キーワード、ロケーション、ポスター URL の処理済みバージョンを追加する。
  5. 結果を Parquet ファイルとして S3 に保存する。(例:s3://<bucket>/<folder>/movies.parquet)

IMDb データセットが作成されると、追加の処理ではデータセットのサイズを小さくするために、小さい方の MovieLens データセット(ml-latest-small.zip)の映画だけが保持されます。データスキーマの一貫性を保ちつつ、大きな IMDb データセットを処理したい場合は、このステップを省略できます。

こちらのノートブックから、以下のステップを実行してください。

  1. 未加工のIMDbデータセット全体をフィルタリングして、Movie Lens データセットに含まれる映画のみにする。
  2. ロケーションを処理して、都市名と国名の重複を削除する。
  3. 結果を Parquet ファイルとして S3 に保存する。このファイルへのデフォルトパスは s3://<bucket>/<folder>/imdb_ml_data.parquetです。

以下は、サンプルデータセットのサブセットのスナップショットです。

Snapshot of the processed dataset.

2.     エンベディングの作成

前述のデータセットは、「トム・ハンクスの映画にはどんなものがある?」などのクエリをフィルタリングするのに役立つかもしれませんが、「スナイパーアクション映画にはどんなものがある?」などのクエリに答えるためには、データセットを豊富なセマンティック情報でさらに強化する必要があります。

そのためには、こちらのノートブックの指示に従い、以下のタスクを実行してください。

1.     movielens-20m データセットからの信頼性の高いキーワードで  IMDb キーワードを強化する。このステップは任意です。

2.     T5 large モデルの sentence-transformer を使用して、「プロット」、「キーワード」、「プロット+キーワード」列のエンベディング(サイズ 768)を生成する。

3.     エンベディングを元の映画データセットに追加し、Parquet ファイルとして S3 に保存する。

次に、リポジトリに戻り、src/ フォルダで以下を実行します。

python index_creation.py

このコマンドは以下のタスクを実行します。

  1. Boto3 Python ライブラリを使用して OpenSearch Service クライアントを初期化する。
  2. IMDb データセットの空白のエントリを NULL で埋める。
  3. テキストと kNN エンベディング検索用に 2 つのインデックスを作成し、ingest_data_into_os 関数を使用して結合されたデータフレームからデータを一括アップロードする。

インデックスが作成されたら、config.yml のドメイン名とインデックス名を更新します。

このデータ取り込みプロセスには 5~10 分かかります。この例では、テキストベースの検索と kNN エンベディングベースの検索を可能にする 2 つのインデックスが作成されます。テキスト検索は、ユーザーが入力する自由形式のクエリを映画のメタデータにマッピングします。「クリストファー・ノーラン監督の映画」、「俳優トム・ハンクスが出ている映画」などのクエリは、監督やプロデューサーなどの特定のメタデータにマッピングされるため、直接テキスト検索に使用されます。しかし、「スナイパーアクション映画にはどんなものがある?」などの自由形式のクエリは、エンベディングベースのセマンティック検索にルーティングされます。kNN エンベディング検索では、エンベディングの潜在空間から最も近い k 本の映画を見つけて出力として返します。

OpenSearch インデックスの詳細については、こちらのブログ記事を参照してください。

3.     Streamlit アプリを作成

OpenSearch でテキスト検索と kNN インデックスが動作するようになったので、このユースケースのフロントエンドを作成する Python パッケージである Streamlit を使用して ML を利用したアプリケーションを構築できます。

コードを実行するには、まず Streamlit と aws_requests_auth が Python 環境(EC2 や ECS コンテナなどの適切なコンピューティングインフラストラクチャ)にインストールされていることを確認する。提供されているコードリポジトリは Amazon SageMaker Studio 上で Streamlit を実行します。以下のコマンドを使用して要件をインストールします。

pip install -r requirements.txt

streamlit/フォルダーに移動して以下を実行し、Streamlit アプリの SageMaker Studio の URL を取得する。

sh run.sh

次に、Streamlit アプリケーションを実行してポート番号を取得する。

streamlit run chat.py

SageMaker Studio の URL とポート番号を{sm_studio_url}/{ port_number }/ のように組み合わせます。

Streamlit アプリでは次のように表示されます。

Screenshot of the UI.

検索とチャット

IMDb 会話型検索アプリケーションに移動したら、以下を選択できます。

LLM
このデモンストレーションでは、LangChain を使用して、LLM として Amazon Bedrock(Claude-V1)を利用しています。

Task type(タスクタイプ)
「検索(Search)」または「検索とチャット(Search and Chat)」。特定のクエリにサブスクライブしている IMDb データセット内の映画だけを特定したい場合は、「検索」を選択します。検索クエリで出力された映画についてさらに質問できるようにチャットボットにもアクセスしたい場合は、「検索とチャット」を選択します。検索およびチャット機能は、選択した特定の LLM によって実行されます。

Question(質問)
検索のユースケースに対する質問を選択します(タスクタイプに「検索」を選択した場合も、「検索とチャット」を選択した場合も)。アプリケーションには一連のデフォルトの質問のほか、次に示すように独自の質問を追加するオプションが用意されています。

Sample questions in the demo.

検索のユースケースに対する質問は、次のいずれかに分類されます。

  1. 完全一致:ロケーション、俳優、プロット、評価、監督などに基づいた映画の検索
  2. セマンティック一致:他と似ている映画の検索

たとえば、「トム・クルーズが主演するアクション映画にはどのようなものがありますか?」という質問をした場合、LLM は、IMDb データセット内の映画の中で、これと完全に一致するものを検索し、次の出力を生成します。

Generated answer for one of the built-in questions for the search task.

さらに、「検索とチャット」機能を選択した場合、次のチャットインターフェースがアプリケーションに出力されます。

Generated chat interface for the same sample question.

現在、チャットチェーンはコンテキストの長さを維持するために一度に 5 つの質問に対応しています。ただし、コンテキストの長さを一定に保つために、コンテキストをチャンク化したり、最後の k 件の会話履歴をストーリー化するなどの高度な方法を試すこともできます。

レコメンデーションによる検索結果の強化

現在のシステムは検索インデックスからコンテンツを汎用的に取得しますが、Amazon Personalize のリランキングサービスなどの別のツールと連携させて、これまでにキャプチャされたユーザー履歴に基づいて検索結果を並べ替えることもできます。

まとめ

本記事では、Bedrock と OpenSearch サービスによるテキスト検索と kNN ベースの検索を使用して、IMDb データセットの上に会話型検索を構築するソリューションを構築する方法について説明しました。このアプリケーションは LLM を使用して、ユーザーの質問を OpenSearch 経由でクエリできるコマンドに変換し、また特定の映画についてさらに質問するための会話型仮想エージェントを提供します。

この記事のコードサンプルの詳細については、GitHub リポジトリをご覧ください。


参考リンク

AWS Media Services
AWS Media & Entertainment Blog (日本語)
AWS Media & Entertainment Blog (英語)

AWS のメディアチームの問い合わせ先: awsmedia@amazon.co.jp
※ 毎月のメルマガをはじめました。最新のニュースやイベント情報を発信していきます。購読希望は上記宛先にご連絡ください。

翻訳は BD 山口、SA 石井が担当しました。原文はこちらをご覧ください。