前置き
下記記事で勉強会の資料を共有するWEBサイトを作成しました。
WEBサイトの一つの機能として、過去の勉強会資料を検索できるような仕組みを追加しました。仕組みとしてはAmazon BedrockのKnowleage Baseを使用しています。S3上の勉強会資料をRAG用のベクトルDBにエンベディングして保存。クライアントはチャット欄からキーワードを検索するとKnowleage Baseにアクセスして回答を返却する仕組みです。
アーキテクチャは下記の様な形です。
- フロントエンドをStreamlitで作成
- ALB経由でCongito認証後Streamlitに接続
- 事前にAurora ServelessをPrivate Subnetに作成
- Knowleadge Baseで事前に作成したAurora ServerlessをベクトルDBに指定
- Knowleadge BaseでデータソースとしてS3を指定
- S3に勉強会資料を保存しベクトルDBに保存
Knowledge Baseの内部通信
Aurora ServerlessをPrivate Subnetに作成していますが下記の処理が可能です。
- S3に保存したデータをベクトルDBに保存(図の赤線)
- StreamlitからBedrock問合せの際にベクトルDBを参照(図の青線)
EC2サーバからStartIngestionJobでS3のデータをベクトルDBに同期する処理とRetreiveでベクトルDBを参照する処理を考えてみます。これらの通信はBedrock AgentとBedrock Agent runtime用のVPCエンドポイントを作成すれば内部通信になります。VPCエンドポイントを作成しない場合、上記のアーキテクチャではNATゲートウェイを経由したインターネット経由の通信となります。Knowledge BaseからS3へのアクセス、ベクトルDBへのアクセスも(多分サービスVPCの様なものがあって)Knowledge Baseの内部通信によって行われます。Knowleage BaseからPrivate SubnetのAuroraへのアクセスはRDS Data APIという仕組みでアクセスを行っています。VPC内のAuroraクラスターエンドポイントにアクセスしているわけではなくこちらも内部通信によって行われます。上記よりKnowleage BaseはVPCエンドポイント作成により、インターネットを経由しない内部通信が可能になります。