概要
現在、AWS上で一般提供(GA)されているナレッジベース向けサービスには、OpenSearch や Aurora(PostgreSQL)などがあります。
しかし、これらを本番環境レベルで運用しようとすると、ナレッジベース1つあたりでも月に数万円規模のコストが発生してしまいます。
また、1つのナレッジベースにあらゆる情報を詰め込む構成では、余計な情報まで探索してしまい小回りが利きません。
一般的にも、ナレッジベースに限らずですが、生成AIは取り扱う情報を細かく分けたほうが精度が上がるとされています。
とはいえ、大規模システムでもない限り、複数のナレッジベースを“艦隊運用”のように運用するのはナレッジベース1つあたり月数万円かかってしまうため、そう易々と実行できるものではないかなと考えています。
しかし、S3 Vectorsを利用することで、複数のベクトルDBを艦隊のように運用しても低コストで実現できるような未来が見えてきました。
艦隊のように運用できることで、S3のフォルダ単位でナレッジベースを構築できるようになり、階層構造の表現がぐっと容易になります。
これにより、特定の領域に特化したナレッジとのやり取りもスムーズに行えるようになります。
そこで、この記事ではS3 Vectorsを活用し階層構造を意識したアーキテクチャの構築にチャレンジしてみます。
構成図
今回構築する構成図とアプリでの利用イメージです。
今回は最近行われたプロ野球のドラフトを題材にしてます。
AWS構成図
アプリでの利用イメージ
実践
1. S3の用意
構成図に沿ってS3のフォルダ構成を作成します。
2. 各球団のフォルダにドラフトの結果を格納
各球団ごとのフォルダに下記のようなドラフトの結果をテキストファイルで格納します。
※ 今回は、こちらのサイトを参考にさせていただきました。
阪神タイガース(支配下5名・育成2名)
順位 選手名 守備 所属
1位 立石正広 内野手 創価大
2位 谷端将伍 内野手 日本大
3位 岡城快生 外野手 筑波大
4位 早瀬朔 投手 神村学園高
5位 能登嵩都 投手 オイシックス新潟
育成1位 神宮僚介 投手 東農大北海道オホーツク
育成2位 山崎照英 外野手 KDL兵庫
補強ポイント:大学No.1スラッガーの立石選手を獲得し、内外野のバランス良い補強に成功。投手も高校生から社会人まで幅広く指名し、若手育成と即戦力の両面を強化。
3. ナレッジベース用意
「Bedrock->ナレッジベース->ベクトルストアでナレッジベースを作成」よりS3 Vectorsを構築します。
※ まだプレビュー版のため、利用できるリージョンに制限があります。
基本デフォルトのまま進めていけば問題なく、下記の手順をS3のフォルダの数分繰り返します。(2リーグ+12球団=14個のS3 Vectors)
・「データソース選択->S3」を選択
・「S3のURI」でリーグもしくは球団のS3のパスを入力
・「ベクトルデータベース」でS3 Vectorsを選択



結果
「3. ナレッジベースを作成」で作成したナレッジベースと通信ができるWebアプリをローカルで構築し、ナレッジベースの動作を確認します。
リーグ選択時
リーグ選択時は、特定の球団に限らず、リーグフォルダ内に作成した各球団のドラフト結果すべてのサマリを教えてくれました。
球団選択時
球団選択時は、他球団の余計な情報は除外されつつ選択した球団に絞ったドラフト結果を取得することができました。
まとめ
今回の検証では、ただS3 Vectorsを利用するではなく、少し見方を変えて階層構造をもつナレッジベースを低コストで構築するというテーマに挑戦しました。
これまで、ナレッジベースをAWS上で運用する場合はOpenSearchやAuroraなどの高機能な選択肢がありましたが、1つあたりの運用コストが高く、用途ごとに分割して運用することは現実的ではありませんでした。
しかし、S3 Vectorsの登場により、S3フォルダ単位でベクトルデータを管理できるようになり、「リーグ → 球団」といった階層構造の表現や、ドメインごとにナレッジを切り分けた精度の高い検索が容易に実現できることを確認できました。
今回検証したように大項目・中項目ごとにナレッジベースを分けて検索できるようにしたいという需要は現場でもよくあるかと思いますので、1案として役に立てば幸いです。





