はじめに
こんにちは。データ分析エンジニアの木介です。
今回はAmazon Bedrock Knowledge BasesベクトルDB(検索エンジン)として利用できるものの比較を行っていきたいと思います。
前回はS3 VectorsとOpenSearch Serverlessの比較を行いましたが、ハイブリッド検索が必要な内容だと、精度の差が大きく出ました。
現状、Bedrock Knowledge Base でハイブリッド検索に対応しているのは、以下のベクトルDBがあります。
- OpenSearch Serverless
- OpenSearch Managed Cluster
- Aurora Serverless V2(PostgreSQL)
- MongoDB Atlas
今回、その中でも利用頻度が高いと思われる、OpenSearch ServerlessとAurora Serverless V2(PostgreSQL) を使ったハイブリッド検索での精度の比較を行っていきたいと思います。
概要
ハイブリッド検索とは、ベクトル(意味)検索と、キーワード(全文)検索を組み合わせて関連文書を探す検索方式です。
ベクトル検索による意味的な検索も行えつつ、キーワード検索により、指定されたキーワードについても考慮した検索を実行できます。
OpenSearch ServerlessとAurora Serverless V2(PostgreSQL)の比較
今回データストアとして利用するOpenSearch Serverless とAurora Serverless V2(PostgreSQL)について、それぞれ簡単な比較をしてみました。
| 観点 | OpenSearch Serverless | Aurora Serverless v2 (PostgreSQL) |
| ハイブリッド検索(Bedrock Knowledge Bases) | 対応 | 対応 |
| 日本語対応 | Kuromoji などの日本語の形態素解析が利用可 | PostgreSQL 標準の全文検索(日本語形態素解析は現状対応していない) |
| ベクトル格納形式 | 浮動小数/バイナリ両対応 | 浮動小数(pgvector) |
| 課金単位 | OCU/時間(最小 1 OCU(0.5+0.5)) | ACU/時間(最小0.5 ACU) |
| 最小構成における課金例 | $175.22(1OCU: $175.2, ストレージ: $0.02) | $87.83(1ACU: $87.60, I/O: $0.13) |
OpenSearch Serverlessでは日本語の形態素解析に対応しているため、日本語でもキーワード検索を精度よく行えます。
反面、最小構成時における料金はAurora Serverless V2(PostgreSQL)が勝っていますが、日本語の形態素解析をデフォルトではサポートしていないため、日本語のハイブリッド検索時の精度が気になるところです。
精度比較実験
今回はOpenSearch ServerlessとAurora Serverless V2(PostgreSQL)の精度比較のために以下の二種類の実験を行います。
特に日本語データセットについては、Aurora Serverless V2(PostgreSQL)が日本語形態素解析に対応していないため、精度面ではOpenSearch Serverlessが優れていることが予測されます。
1.実験設定
以下が今回利用する基本的な実験設定です。
まずBedrock Knowledgebaseの基本的な設定は以下の形で行いました。
差分は利用するベクトルストレージのみとなります。
| Embedding Model | Embedding Type | Chunking Strategy |
| Titan Text Embeddings V2 | 浮動小数点ベクトル埋め込み1024次元 | 階層チャンキング(親:2000、子:500、オーバーラップ:50) |
精度比較はBedrock Evaluationsで行います。
比較項目として以下二点のメトリクスを利用しました。
それぞれ0~1の間の値をとり、大きくなるほど質問に対する回答を高く評価します。
- Context relevance:取得したテキストが質問に対して文脈的にどの程度関連しているかを測定
- Context coverage:取得されたテキストが正解データの全情報をどの程度網羅しているかを測定
2.ハイブリッド検索比較(英語データセット)
1.データセット
利用するデータセットは以下のものを使いました。
- Amazon Reviews 2023
以下のような約2万8千件製品IDとレビューの組み合わせを利用が利用できるデータセットになります。
product/productId: B000GKXY4S product/title: Crazy Shape Scissor Set product/price: unknown review/userId: A1QA985ULVCQOB review/profileName: Carleen M. Amadio "Lady Dragonfly" review/helpfulness: 2/2 review/score: 5.0 review/time: 1314057600 review/summary: Fun for adults too! review/text: I really enjoy these scissors for my inspiration books that I am making (like collage, but in books) and using these different textures these give is just wonderful, makes a great statement with the pictures and sayings. Want more, perfect for any need you have even for gifts as well. Pretty cool!
精度検証時の質問と回答のペアは以下のようなものを用意し、ハイブリッド検索の特徴であるキーワードの検索精度を重視して評価しました。
評価用データセット例
質問:What is the review summary for product ID B000GKXY4S?[] (商品ID B000GKXY4Sのレビューの要約を教えてください。) 回答:Fun for adults too!
2.結果(英語)
以下が比較結果になります。
値が大きいほど良い評価結果となっています。
| Metric type | OpenSearch Serverless | Aurora Serverless V2(PostgreSQL) |
| Context relevance | 0.06 | 0.07 |
| Context coverage | 0.19 | 0.18 |
英語については期待通り、OpenSearch ServerlessもAurora Serverless V2(PostgreSQL)もほぼ同精度となることがわかりました。
3.ハイブリッド検索比較(日本語データセット)
では本命の日本語データセットにおける精度比較を行っていきます。
1.OpenSearch(日本語トークナイズ設定の例)
OpenSearch ServerlessではKuromoji形態素解析が利用できるため設定をしていきます。
この設定により日本語の文章を正しく分割できるためキーワード検索の精度向上を見込めます。
設定例
PUT bedrock-knowledge-base-hybrid-index { "mappings": { "properties": { "AMAZON_BEDROCK_METADATA": { "type": "text", "index": false }, "AMAZON_BEDROCK_TEXT_CHUNK": { "type": "text", "analyzer": "custom_kuromoji_analyzer" }, "bedrock-knowledge-base-default-vector": { "type": "knn_vector", "dimension": 1024, "method": { "name": "hnsw", "engine": "faiss", "space_type": "cosinesimil" } }, "id": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }, "settings": { "index": { "knn.algo_param": { "ef_search": "512" }, "knn": "true", "analysis": { "analyzer": { "custom_kuromoji_analyzer": { "tokenizer": "kuromoji_tokenizer", "filter": [ "kuromoji_baseform", "ja_stop" ], "char_filter": [ "icu_normalizer" ] } } } } } }
2.挿入した日本語ドキュメント
データセットしてはChatGPTに出力させた以下のよう徳川家将軍の人名が入ったものを利用しました。
ハイブリッド検索時で徳川の人物名をキーワードとして情報がヒットすることを期待しています。
徳川吉宗像(徳川記念財団蔵) 時代 江戸時代中期 生誕 貞享元年10月21日(1684年11月27日)[1][2] 死没 寛延4年6月20日(1751年7月12日)[3](66歳没) 改名 松平頼久→頼方→徳川吉宗 別名 幼名:源六 通称:新之助 渾名:米将軍、八十八将軍、八木将軍 戒名 有徳院殿贈正一位大相国(法号) 墓所 東叡山寛永寺円頓院 官位 従四位下・右近衛権少将兼主税頭、 従三位・左近衛権中将 参議、権中納言、 正二位・内大臣兼右近衛大将、右大臣 …
評価用データセット例
質問:徳川家康が征夷大将軍に任命された年を教えてください。 回答:慶長8年(1603年)に征夷大将軍に任命されました。
3.結果(日本語)
以下が日本語データセットでの精度の比較結果です。
値が大きいほど良い評価結果となっています。
| Metric type | OpenSearch Serverless | Aurora Serverless V2(PostgreSQL) |
| Context relevance | 0.45 | 0.43 |
| Context coverage | 1.00 | 0.93 |
上記のとおり、僅差ではありますが、OpenSearch Serverlessがで両指標で上回る形となりました。
特に質問に対する回答の網羅度を測るContext coverageがOpenSearch Serverlessが優れていることがわかります。
これはOpenSearch ServerlessのKuromojiによる日本語に対応した形態素解析により、ハイブリッド検索時におけるキーワード検索精度に差が出たと考えられます。
また、検索速度についても比較した結果を、以下に示します。
5種類のクエリを連続して行い、その最大値および最小値を取り除いたトリム平均で比較しています。
| OpenSearch Serverless[s] | Aurora Serverless V2(PostgreSQL)[s] |
| 0.48s | 0.55s |
検索速度でも、OpenSearch Serverless の方が高速に検索できているようです。
まとめ
今回はBedrock Knowledgebaseにおける、OpenSearch Serverless、Aurora Serverless V2(PostgreSQL)をそれぞれ用いた際のハイブリッド検索について比較をしてみました。
日本語の検索精度、検索速度ともに、OpenSearch Serverless が Aurora Serverless V2 を上回る結果となりました。
今回、データの量が少ない状況での検証であったので、そこまで差はつきませんでしたが、データ量が増えると、結果も変わってくる可能性があります。
ただ、どちらも、精度・速度とも、基本的には高い性能になっていると思うので、用途やデータ量に応じて、選択していくと良いかと思われます。
Acroquest Technologyでは、キャリア採用を行っています。
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。