PostgreSQLの進化!ベクタストアとは?

記事タイトルとURLをコピーする

はじめに

こんにちは。エンタープライズ部のウルフです。 世間は生成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以外で使えるベクタストアも巷にはたくさん溢れているのでユースケースに応じて選定するで良いかと思います。

出典:https://aws.amazon.com/what-is/vector-databases/

構成

  • 本記事ではRAG(Retrieval Augmented Generation)と呼ばれる外部ソース検索により文章生成を強化した生成AIアーキテクチャにpgvectorを組み込んでみました。

  • 主要なコンポーネントは以下の通りです。

    • AWS Lambda
      • Pythonライブラリ
        • LangChain
        • pgvector
        • psycopg2-binary
        • google-api-python-client
    • Amazon Bedrock(オレゴンリージョン)
      • Amazon Titan Embeddings
      • Anthropic Claude V2
    • Amazon RDS for PostgreSQL
    • Google Custom Search

    • インフラ周り

      • VPC
      • NAT Gateway
      • SecurityGroup
  • その他、必要に応じて以下を調整してください。

    • Amazon API Gateway
    • Amazon EC2(DB管理用)

RAG-Architecture
RAG-Architecture

始めかた

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

ENDPOINTUSER_NAMEDATABASE_NAMEは、ご自身でセットアップした環境に合わせて読み替えてください。

2-2. vector拡張機能を有効化

CREATE EXTENSION vector;

2-3. PostgreSQLへ接続するユーザーへTableへのアクセス権権付与

GRANT CONNECT ON DATABASE DATABASE_NAME TO USER_NAME;

DATABASE_NAMEUSER_NAMEは、ご自身でセットアップした環境に合わせて読み替えてください。

3. Amazon Bedrockの有効化

  • 注意点として、2023年11月現在、リージョンによって使える基盤モデルが異なります。
  • その為、本構成ではオレゴンリージョンを使っています。

AWS公式ドキュメントモデルアクセスを参考にして、基盤モデルを有効にします。

4. Google Custom Searchの設定

5. AWS Lambda(LangChain)の実装

  • Lambdaの実装としてはLangChainで以下クラスを使用して実装します。

6. スクリプト実行後の確認

  • テーブルがなくてもLangChain側がリレーションをよしなに作ってくれるようですね。

tables

  • カラムもなんだかよろしく作ってもらっちゃってます。素晴らしい。

relations

もちろん、実用的なベクタストアとして使用するためには他にも設定、考慮する点ががありますが、pgvectorの実装としては以上になります。

おわりに

  • 使ってみた感想とまとめ
    • SQLを知っていれば、pgvectorの使用は特別な学習は不要で、あっという間にベクタストアをアプリに組み込めました。
    • 何よりLangChain側が割とよしなにやってくれるので、テーブル設計に頭を悩ませなくてい良い。
    • 「どのベクタストアも同じ」かと思っていましたが、今回調査してみてAWSで利用できるベクタストアだけでもユースケースが異なる発見につながりました。
    • AWS以外でもベクタストアサービスは世の中に非常に多く存在します。それぞれ特徴やユースケースに応じて使い分けるのが良いと思いました〜!

参考リソース

ウォルフ圭 (Kei Wolfe) 記事一覧はコチラ

サーバーワークス・エンタープライズ部のウルフ。
アプリ開発が大好物🐺