はじめに
こんにちは。エンタープライズ部のウルフです。 世間は生成AIブームの真っ只中、みなさんいかがお過ごしでしょうか?
社内でも生成AIの開発・検証が活発になってきているので、今日はベクタストアについて少し調査したので紹介します。
ベクタストアとは?
- まず言葉の定義として「Vector」とは一般的に「方向と大きさを持つ量」のことを指し示します。
- そして、ベクトアストアを語る上で、もう一つ重要な用語に「Embedding」があります。
- 「Embedding」は、テキストや単語を数値の「ベクトルに変換するための手法」です。
- つまり、ベクタストアとはテキストや単語がもつ方向性と大きさの量(”Vector”)を数値でグループ化(”Embedding”)したものを格納するデータベースのことをさします。
ベクタを使ったユースケース
- ベクタを使うことで、類似性検索が実現できます。
- つまり、オンラインショッピングで「これと似た商品を探す」機能とか、あなたの好きな映画に似た作品を見つけるといったシステムの実現。
- また、従来のキーワード検索とは異なり、ベクトルにより検索結果を得ることが可能となるため、より高度な文書検索や応答システムの実現に役だつことが期待できます。
ベクタストアを使うメリット
- 類似度検索に特化しているため、単純な文字列検索と比べ検索処理が高速。
- 今回紹介するRAGの構成では、ベクタストアを使うことで類似検索の際、外部データへの依存が少なくなります。
pgvectorについて
pgvectorとは?
- 「pgvector」は、PostgreSQLが新しくサポートし始めた機能で、データベースに数値のリスト(ベクタ)を保存して、それらがどれだけ似ているかをサクッと検索できます。
- Amazon Bedrockでも使用できる言語モデルなどでテキストを数値に変換して、意味を持たせた数値データをデータベースにぎゅっと詰め込むイメージですね。
なぜpgvectorか?
AWSで使えるベクタストアを前提とした場合、2023年11月時点で以下のベクタストアが候補に上がります。
- Amazon OpenSearch Serverlessは、k-NN(k近傍方)といったアルゴリズムを使ってインタラクティブに、リアルタイム検索を行えるのが利点。
- Amazon Neptune MLは、GNNs(グラフニューラルネットワーク)といったグラフデータを使った機械学習の予想アルゴリズムを利用できるのが利点。
- Amazon Aurora PostgreSQLは、Embedding化されたデータを格納し、効率的な類似検索に最適な拡張機能pgvectorを提供。
- Amazon RDS for PostgreSQLは、Aurora PostgreSQL同様。
上記のことから、各ベクタストアには特徴があり、ユースケースに応じて使い分けをするのがベストかと思われます。
- AWS上で簡単な類似性検索の仕組みを実現するベクタストアとしてはPostgreSQLで利用できるpgvectorがちょうど良いと思いました。
もちろん、AWS以外で使えるベクタストアも巷にはたくさん溢れているのでユースケースに応じて選定するで良いかと思います。
構成
本記事ではRAG(Retrieval Augmented Generation)と呼ばれる外部ソース検索により文章生成を強化した生成AIアーキテクチャにpgvectorを組み込んでみました。
主要なコンポーネントは以下の通りです。
- AWS Lambda
- Pythonライブラリ
- LangChain
- pgvector
- psycopg2-binary
- google-api-python-client
- Pythonライブラリ
- Amazon Bedrock(オレゴンリージョン)
- Amazon Titan Embeddings
- Anthropic Claude V2
- Amazon RDS for PostgreSQL
Google Custom Search
インフラ周り
- VPC
- NAT Gateway
- SecurityGroup
- AWS Lambda
その他、必要に応じて以下を調整してください。
- Amazon API Gateway
- Amazon EC2(DB管理用)
始めかた
1. Amazon RDS for PostgreSQLの起動〜EC2で接続
AWS公式ドキュメントPostgreSQL DB インスタンスを作成して接続するを参考にして構築。
もちろん使い慣れたCloudFormationやCDKで構築してもOK!
2. vector拡張機能の有効化
2-1. 上記手順で構築したEC2、またはお使いのpsgl実行環境から、PostgreSQLにログイン
psql --host=ENDPOINT --port=5432 --username=USER_NAME -d DATABASE_NAME
※ ENDPOINT、USER_NAME、DATABASE_NAMEは、ご自身でセットアップした環境に合わせて読み替えてください。
2-2. vector拡張機能を有効化
CREATE EXTENSION vector;
2-3. PostgreSQLへ接続するユーザーへTableへのアクセス権権付与
GRANT CONNECT ON DATABASE DATABASE_NAME TO USER_NAME;
※ DATABASE_NAME、USER_NAMEは、ご自身でセットアップした環境に合わせて読み替えてください。
3. Amazon Bedrockの有効化
- 注意点として、2023年11月現在、リージョンによって使える基盤モデルが異なります。
- その為、本構成ではオレゴンリージョンを使っています。
AWS公式ドキュメントモデルアクセスを参考にして、基盤モデルを有効にします。
4. Google Custom Searchの設定
- https://www.google.com/cse/all
検索エンジン ID
を取得し、次の手順でそのIDソースに埋め込みます。
- https://console.cloud.google.com/apis
API Key
を発行し、次の手順でそのKeyソースに埋め込みます。
5. AWS Lambda(LangChain)の実装
- Lambdaの実装としてはLangChainで以下クラスを使用して実装します。
- PGVector:PostgreSQLの接続用途
- Google Search:Google Custom Searchの接続用途
- WebResearchRetriever:Web検索と、回答生成用途
6. スクリプト実行後の確認
- テーブルがなくてもLangChain側がリレーションをよしなに作ってくれるようですね。
- カラムもなんだかよろしく作ってもらっちゃってます。素晴らしい。
もちろん、実用的なベクタストアとして使用するためには他にも設定、考慮する点ががありますが、pgvectorの実装としては以上になります。
おわりに
- 使ってみた感想とまとめ
- SQLを知っていれば、pgvectorの使用は特別な学習は不要で、あっという間にベクタストアをアプリに組み込めました。
- 何よりLangChain側が割とよしなにやってくれるので、テーブル設計に頭を悩ませなくてい良い。
- 「どのベクタストアも同じ」かと思っていましたが、今回調査してみてAWSで利用できるベクタストアだけでもユースケースが異なる発見につながりました。
- AWS以外でもベクタストアサービスは世の中に非常に多く存在します。それぞれ特徴やユースケースに応じて使い分けるのが良いと思いました〜!
参考リソース
今回参考にしたドキュメントたち
Pricing
pgvector拡張機能利用可能バージョン
ウォルフ圭 (Kei Wolfe) 記事一覧はコチラ
サーバーワークス・エンタープライズ部のウルフ。
アプリ開発が大好物🐺