pgvector入門 ~環境構築編~
はじめに
こんにちは。ミスミグループ本社 Gateway推進本部の飯塚です。レコメンドや検索、DB構築などを幅広く担当しています。
本記事は【pgvector 入門】と題して、PostgreSQL の環境構築からベクトルデータの格納、アプリ実装までを三部構成で連載していきます。
今回は ~環境構築編~ になります。10分もあればベクトル検索の環境構築が出来ますのでぜひ試してみてください。
pgvector とは
- ベクトルデータの類似性検索機能を提供する PostgreSQL の拡張機能
- "int" や "varchar" のようにベクトルデータを "vector" として型で扱うことが可能
- 様々な近似計算、インデックス機能を提供
つまり、今まで RDB で管理していた商品データやトランザクションデータなどの構造化データと、ベクトルデータを同一DB、同一テーブル内で管理することが出来るようになります。
また近似計算を SQL のクエリで行うことが出来るため、例えば WHERE 句で商品データを絞ってから近似計算を行うなど、一般的な従来通りの PostgreSQL での検索と比べ簡便な類似検索が可能になります。
環境構築
では早速作ってきましょう。今回使用するサービスは以下になります。
データベースの作成
今回はデモ用として最小かつシンプルな構成を目指します。
なお、インスタンスタイプや ACU(Aurora Capacity Unit) はコストと処理性能に影響しますのでデータベースの用途に合わせて設定してください。
設定内容は以下の通りです。
項目 | 設定値 | 備考 |
---|---|---|
データベース作成方法を選択 | - | - |
データベース作成方法を選択 | 標準作成 | - |
エンジンのオプション | - | - |
エンジンのタイプ | Aurora (PostgreSQL Compatible) | - |
Babelfish for PostgreSQL 機能をサポートするバージョンを表示 | オフ | デフォルト |
利用可能なバージョン | Aurora PostgreSQL(Compatible with PostgreSQL 15.4) | - |
RDS 延長サポートの有効化 | オフ | デフォルト |
テンプレート | - | - |
テンプレート | 開発/テスト | - |
設定 | - | - |
DB クラスター識別子 | database-1 | デフォルト |
マスターユーザー名 | postgres | デフォルト |
認証情報管理 | セルフマネージド | - |
マスターパスワード | <任意のパスワード> | - |
マスターパスワードを確認 | <任意のパスワード> | - |
クラスターストレージ設定 - 新規 | - | - |
設定オプション | Aurora スタンダード | デフォルト |
インスタンスの設定 | - | - |
DB インスタンスクラス | Serverless v2 | コストに影響 |
容量の範囲-最小キャパシティ (ACU) | 0.5 | 性能/コストに影響 |
容量の範囲-最大キャパシティ (ACU) | 8 | 性能/コストに影響 |
可用性と耐久性 | - | - |
マルチ AZ 配置 | Aurora レプリカを作成しない | - |
接続 | - | - |
コンピューティングリソース | EC2 コンピューティングリソースに接続しない | デフォルト |
ネットワークタイプ | IPv4 | デフォルト |
Virtual Private Cloud (VPC) | <任意のVPC> | 後続のCodeEditorと同一環境 |
DB サブネットグループ | <任意のサブネットグループ> | - |
パブリックアクセス | なし | デフォルト |
VPC セキュリティグループ (ファイアウォール) | default | デフォルト |
アベイラビリティーゾーン | 指定なし | デフォルト |
RDS Proxy を作成 | オフ | デフォルト |
認証機関 - 任意 | <デフォルト値> | デフォルト |
RDS Data API | オフ | デフォルト |
データベースポート | 5432 | デフォルト |
タグ - オプション | - | - |
タグ - オプション | なし | デフォルト |
Babelfish の設定 | - | - |
Babelfish をオンにする | オフ | デフォルト |
データベース認証 | - | - |
IAM データベース認証 | オフ | デフォルト |
Kerberos 認証 | オフ | デフォルト |
モニタリング | - | - |
Performance Insights をオンにする | オフ | - |
拡張モニタリングの有効化 | オフ | - |
追加設定 | - | - |
最初のデータベース名 | <任意のデータベース名> | - |
DB クラスターのパラメータグループ | default.aurora-postgresql15 | デフォルト |
DB パラメータグループ | default.aurora-postgresql15 | デフォルト |
フェイルオーバー優先順位 | 指定なし | デフォルト |
バックアップ保持期間 | 7日間 | デフォルト |
スナップショットにタグをコピー | オン | デフォルト |
暗号を有効化 | オン | デフォルト |
AWS KMS キー | (default)aws/rds | デフォルト |
PostgreSQL ログ | オフ | デフォルト |
マイナーバージョン自動アップグレードの有効化 | オン | デフォルト |
メンテナンスウィンドウ | 指定なし | デフォルト |
削除保護の有効化 | オン | デフォルト |
基本的にはデフォルト設定で行いますが、大事なポイントはVPC設定です。PostgreSQL へ接続するためにこの後 Code Editor 環境を作成しますが、これらサービスは同一のVPC上に立てるようにしてください。
設定に問題が無ければ「データベースの作成」ボタンを押下します。
作成したデータベースのページへ遷移し、「接続とセキュリティ」タブからライターのエンドポイント情報をメモしておきます。
Code Editor の作成
Amazon Sagemaker Studio の一機能である Code Editor 環境を作成します。
Code Editor とは Code-OSS ベースの Visual Studio です。簡単にAWS上で VSCode 環境を作れるということで、今回はこれを利用します。
Amazon SageMaker ドメインの作成
設定内容は以下の通りです。
項目 | 設定値 | 備考 |
---|---|---|
SageMaker Domain を設定 | - | - |
SageMaker Domain を設定 | 組織向けの設定 | - |
ドメインの詳細とユーザーを設定 | - | - |
ドメイン名 | <任意の名前> | アカウントの AWS リージョン内で一意であること |
Studio にはどのようにアクセスすることをご希望ですか? | <環境依存> | SSOの場合は「AWS アイデンティティセンター」。IAMの場合は「IAM 経由でログイン」を選択。 |
誰が SageMaker を利用しますか? | <環境依存> | 前項目に合わせて設定 |
ロールと ML アクティビティを設定 | - | - |
ユーザーはどのような ML アクティビティを実行しますか? | 新しいロールを作成 | 既存ロールが存在する場合は「既存のロールを使用」を選択 |
機械学習アクティビティ | Run Studio Applications | 必要最低限の設定 |
アプリケーションを設定 | - | - |
このドメインで Amazon Q Developer を有効にする | オフ | デフォルト |
アプリケーション | SageMaker Studio - New | デフォルト |
Studio UI をカスタマイズ | - | - |
このドメインのユーザーに Studio で表示されるアプリケーションを選択します。 | 全てオン | デフォルト |
このドメインのユーザーに Studio で表示される機械学習ツールを選択します。 | 全てオン | デフォルト |
ネットワーク設定を編集 | - | - |
他の AWS サービスとどのように接続することをご希望ですか? | 仮想プライベートクラウド (VPC) のみ | デフォルト |
Studio にはどの VPC を使用することをご希望ですか? | <データベースで設定したVPC> | - |
ストレージを設定 | - | - |
暗号化キー - オプション | カスタム暗号化なし | デフォルト |
デフォルトのスペースサイズ - オプション | 5 | デフォルト |
最大スペースサイズ - オプション | 100 | デフォルト |
こちらも基本的にはデフォルト設定で問題ありませんが、ユーザーやネットワーク関連については環境に合わせて設定が必要です。設定に問題が無ければ「送信」ボタンを押下します。
ユーザープロファイルの作成
作成されたドメイン内の「ユーザープロファイル」タブからユーザーの割り当てを行います。
ドメイン作成時にSSOログインを選択した場合、候補となるユーザーとグループが列挙されているので、この環境へアクセスしたいユーザーを選択します。
Code Editor へアクセス
Code Editor の最後の設定であるスペースの作成を行います。
作成したユーザープロファイルから「アプリケーションを起動」-「Studio」を押下します。
起動後左上の「Applications」内から「Code Editor」を選択し、右上に出てくる「Create Code Editor space」を押下します。
任意の名前を入力しスペースを作成後、「Run space」ボタンを押下しインスタンスを起動します。この時、インスタンスタイプやイメージを変更することも可能です。
インスタンス起動後に表示される「Open Code Editor」ボタンを押下し、 Code Editor が別タブで開かれたら作成完了です。
データベースへアクセス
作成したデータベースに Code Editor を使ってアクセスし、pgvector の有効化を行います。
PostgreSQL のインストール
データベースへのアクセスに必要な「psql」コマンドを実行出来るようにするため、PostgreSQL をインスタンスにインストールします。
sudo apt update
sudo apt install postgresql postgresql-contrib
途中で [Y/n] を求められるので Y を入力します。
次に事前にメモしておいたデータベースのエンドポイント情報と、データベース作成時に設定したユーザー/パスワードを使ってデータベースへアクセスします。
psql -h <データベースエンドポイント> -U <ユーザー名> -p <ポート番号>
例:psql -h xxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U postgres -p 5432
エンターを押下するとパスワードを求められるので、データベース作成時に設定したパスワードを入力し、下記が表示されればデータベースへのアクセス成功です。
postgres=>
pgvector の有効化
初期状態のままでは pgvector が利用出来ないので有効化します。
CREATE EXTENSION vector
「vector」が使えるようになっていることを確認します。
postgres=> \dx
List of installed extensions
Name | Version | Schema | Description
--------------+---------+------------+-------------------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
vector | 0.5.0 | public | vector data type and ivfflat access method
(2 rows)
ベクトルデータの格納/抽出
以上で環境構築は完了です。実用的なデータの格納方法は次回記事で紹介しますが、ここでは pgvectorのページ に載っている簡単なCRUDを紹介します。
Create
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
VALUES に配列形式でベクトルデータを記述することで、vector 型のデータを INSERT します。
Read
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
2024年8月現在、近似計算方法として4つが提供されています。
- コサイン距離: <=>
- ユークリッド距離: <->
- 内積: <#>
- マンハッタン距離: <+>
詳しくは pgvector の Querying を参照してください。
Update
UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;
Delete
DELETE FROM items WHERE id = 1;
後片付け
今回利用したサービスは使用量に応じて従量課金されるため、作業終了後に全てを停止します。
Code Editor
Sagemaker Studio Code Editor のページにある「Stop space」を押下しインスタンスを停止します。
データベース
データベースの停止には注意が必要です。
RDSページでデータベースクラスターを選択し「アクション」の選択肢を見てみると、「一時的に停止」しかありません。つまり常に停止しておくことは出来ず、1週間後に自動的に再起動されます。
したがって使用頻度によっては毎回削除することをお勧めします。
なお削除する場合は、「インスタンス」→「クラスター」の順番でないと削除出来ないのでご注意ください。
おわりに
今回は pgvector を使用するための環境構築を行いました。
ベクトル検索のサービスは各社から様々提供されていますが、柔軟性という意味では、使い慣れた RDB を使ってベクトル格納/近似計算できる pgvector は大変使い勝手が良いです。
また Aurora、 Sagemaker 共にセットアップが容易なため、環境構築で1日かかることもなくすぐにベクトル検索環境が構築できることも魅力です。
次回は LangChain を使いドキュメントのベクトル化とデータベースへの格納、pgvector が提供している各種近似計算について紹介します。
おまけ
一度停止した Code Editor のインスタンスを再起動すると psql コマンドが使えなくなっています。これは再起動によりインスタンスがイメージから再作成されていることを表しています。
再びデータベースにアクセスするためには PostgreSQL を再インストールするか、事前に PostgreSQL がインストール済みのカスタムイメージを作成し、インスタンス起動時にそれを指定する方法もあります。
Discussion