【セッションレポート】OpenSearch のベクトル機能による検索の改善(AWS-47) #AWSSummit

ベクトル検索が求められるようになってきた背景から、OpenSearch を利用したベクトル検索と、LLM を組み合わせた RAG の実装について解説されるセッションです。
2024.06.22

コーヒーが好きな emi です。

本記事は 2024 年 6 月 20 - 21 日の 2 日間開催された AWS Summit Japan 2024 のセッションレポートとなります。

オンデマンド配信の動画リンクと資料のダウンロードは以下です。
動画の視聴と資料のダウンロードには AWS Summit Japan のマイページのログインが必要です。

概要

  • 6/21(金) 15:50 - 16:30
  • テーマ:生成 AI、AWS for Data、機械学習、データレイク、分析、BI
  • セッションタイトル:「OpenSearch のベクトル機能による検索の改善(AWS-47)」

昨今の生成 AI の普及によりベクトル検索への注目が高まっています。ベクトル検索を活用することで、従来のテキストマッチングによる検索ではカバーしきれなかった、パーソナライズされたアイテム推薦や RAG (検索拡張生成)、問い合わせ内容の文脈を考慮したセマンティック検索などのユースケースに対応できるようになります。本セッションでは、OpenSearch のベクトル機能にフォーカスをあてて解説していきます。

スピーカー

榎本 貴之

アマゾン ウェブ サービス ジャパン合同会社 データ事業本部 スペシャリストソリューション本部 OpenSearch スペシャリストソリューションアーキテクト

レベル

Level 300: 中級者向け

アジェンダ

  • はじめに~全文検索の特徴と課題
  • ベクトル検索・ベクトルデータベースの紹介
  • OpenSearch によるベクトル検索の実装(+ デモ)
  • OpenSearch と LLM の連携による RAG の実装(+ デモ)
  • まとめ~ OpenSearch ベクトル検索の今後の発展

セッションレポート

はじめに~全文検索の特徴と課題

  • 検索技術の進化

テキストマッチング

ファセット

自然言語検索

会話型検索

テキストマッチング、ファセット

  • 全文検索(テキストマッチング)
    • クエリと正確に一致するドキュメントを探すことに長けている
  • ファセット
    • カテゴリや属性で集計結果を絞り込み。絞り込み検索 を実現
  • インデックス(テキスト検索のコア機能)
    • ドキュメント内の各要素ごとにインデックスを作成
    • 文章から意味のあるキーワードを抽出しドキュメント ID と紐づけて管理
    • キーワードの抽出方法はさまざまだが、日本では一般的に「形態素解析」という技術を用いて抽出を行っている
  • 全文検索の課題
    • クエリの正確さに依存する
      • 厳密に一致するものを探すため曖昧な指示だと意図しない結果が返る
    • コンテキストは判断できない
  • 課題を解決するために…
    • 検索フィールドに重みづけ
    • ファセットを使い UI でドリルダウンを作ることで絞り込み
    • サジェスタ、入力補完でユーザーが正しいクエリを入力するように誘導
    • トークン(文言の区切り)分割方法の見直し
    • 正規化
    • ストップワードリスト *1の管理

ベクトル検索・ベクトルデータベースの紹介

  • 自然な文章による問い合わせをどのように処理するか、という文脈で昨今注目されているのが ベクトル検索
    • 類似度の高いアイテムを効率的に扱うことに長けている
    • すべてのデータ(絵画、音楽、文章 etc…)をベクトルに変換し、距離と角度に基づいて関連度を判断する
    • マルチモーダルな問い合わせが可能
      • 例)ドレスの画像を提示し「このドレスに合う靴を探してください」など
  • ベクトルは数字の配列
    • ベクトル検索をやりたい場合はまず検索元のデータを数字のベクトルデータに変換する必要がある
    • ベクトルへの変換=埋め込み(embedded)、と呼ばれる
  • ベクトル検索を実際に実装するときに考慮すること
    • 従来の全文検索の場合
      • アプリクライアントが DB にクエリを投げて検索対象がパイプラインデータセットからデータ持ってきて処理
    • ベクトル検索の場合
      • データを投入する際、まずモデルサーバーにデータを投げてベクトルに変換・取得しベクトル DB に格納する必要がある
        • 機械学習のモデルによってテキスト → ベクトルに変換する
    • ユーザーが投げ込むクエリも何かしらのマイクロサービスからモデルサーバーに接続してベクトルに変換する必要がある
  • ベクトルデータベースとは何か?
    • ベクトル検索を行う際、数十億規模のベクトルデータを扱う必要があり、単体のマシンで実行するのは難しい
      • スケールアウトが可能なように設計されている
    • ベクトルの追加・削除・更新をリアルタイムでおこなう
    • API、JDBC など使い慣れたインターフェイスで検索できる

OpenSearch によるベクトル検索の実装(+ デモ)

  • AWS ではベクトルエンジンとして OpenSearch Service が利用できる
    • 数十億規模のベクトル検索ができる
    • Amazon Music は 1 億トラックの楽曲に対し、ピーク時 7,100 クエリ/秒のレコメンデーション要求を OpenSearch Service でさばいている
  • OpenSearch によるベクトル検索の流れ
    • 元データからデータ抽出しチャンキング(チャンクという単位で分割)
    • 各チャンクに対し ML モデルと連携しベクトルデータに変換、インデックスというテーブルに格納することで検索可能になる
    • インデックスはメタデータも格納できる
      • キーワード検索と組み合わせられる
  • OpenSearch によるベクトル埋め込み(embedded、変換)
    • Bedrock と組み合わせてベクトルを生成しインデックスに格納
    • ユーザークエリも Bedrock でベクトルに変換しベクトル検索を実行
    • データ投入パイプラインとかも必要だったが、ニューラルプラグイン(Neural plugin)という機能を活用することで、OpenSearch だけでモデルサービス(Bedrock)と連携してベクトル検索が可能

OpenSearch Service ベクトル検索デモ

  • OpenSearch にベクトル変換のためのモデルを登録
    • モデルエンドポイントの情報を持つ「コネクタ」
    • モデルをグループ化して管理するための「モデルグループ」
    • 「モデル」登録
  • インデックス登録
    • モデルを呼び出す機能である「パイプライン」を作成
    • インデックスを作成
    • ドキュメントを登録
      • この時パイプラインが自動でモデルを呼びに行ってベクトル変換までおこなう
  • 検索を実行
    • テキスト検索とベクトル検索の結果を比較
  • サンプルデータは以下

デモでは SageMaker にのっているモデルを利用されていました。

OpenSearch と LLM の連携による RAG の実装(+ デモ)

自然言語会話型検索

  • AI/ML ブーム
    • LLM(大規模言語モデル、Large Language Model)、チャットボットなど…
  • RAG(Retrieval-Augmented Generation:検索拡張生成)
    • 検索結果を生成 AI を使ってなめらかな言語で回答する

OpenSearch Agents による RAG デモ

  • Agents(エージェント)という機能を使うことでベクトル検索の結果を LLM に渡して文章を生成して回答することが可能になる
  • さっきのデモでベクトル検索まで実施済みなので、OpenSearch Agents と LLM と連携するためのコネクタを作成

デモでは Bedrock で提供されているモデル Cohere Command R+ を利用されていました。

まとめ~ OpenSearch ベクトル検索の今後の発展

  • マイクロサービスなど他のサービスを利用することなく、OpenSearch Service だけでベクトル機能も RAG もできた
  • ベクトル検索は全文検索の弱点をカバーする
    • ベクトル検索は厳密なマッチングではなく、類似アイテムを返すことに特化
    • 検索対象データが画像・動画・音声などのテキストではない場合や、自然言語による検索などにベクトル検索を持ってくると望む検索が実装できる
  • ベクトルは万能ではない
    • 厳密なマッチングは得意でない
    • 未知語、学習していない言語、専門用語などに対応するにはモデルを学習し直す必要がありコストがかかる
    • 要件に応じて全文検索とベクトル検索を併用するのが望ましい
      • ベクトル検索の結果をもとに、テキスト検索のインデックスを使って絞り込み(フィルタリング)をする(AND をとる)
      • ハイブリッド検索
        • テキスト検索とベクトル検索の結果を合体しソートして関連度の高い結果を返す(OR をとる)
  • OpenSearch Service の今後
    • 既にハイブリッド検索に対応
    • 外部連携を強化中
    • ver2.14 はより汎用的なコネクタが使える
      • Amazon ComprehendAmazon Translate など
      • ベクトル検索の精度改善手法の一つである「再ランキング」ランキングに特化した外部サービスを活用することで精度を上げる
      • Amazon Personalize と連携しユーザー固有の属性で検索結果をソート表示

OpenSearch Service の進化発展をお楽しみに!

感想

ベクトル検索が求められるようになってきた背景を知ることができたのがとても良かったです。私は昨今の生成 AI ブームの流れで「ベクトル検索良いぞ」と言われつつも「ベクトルって何だ?矢印?」みたいなところから学習し始めたところで、何が嬉しいのか、いつ活用すべきなのかなどがあまりピンときていませんでした。

従来のテキスト検索との比較や使い分けなども紹介いただけて理解が深まりました。

これからの検索技術の発展も非常に楽しみです。

参考

脚注

  1. 検索語として利用する可能性がない、もしくは検索効率が低下するため、あらかじめ検索語から除外することを定めた語。助詞「が」「の」「は」など