pgvectorを使用したAiven for PostgreSQL®でのベクトル検索の有効化

<font color="Grey">*[Enabling Vector Search in Aiven for PostgreSQL® with pgvector](https://aiven.io/blog/aiven-for-postgres-supports-pgvector)の翻訳です。*</font>

2023年6月27日

# pgvectorでAiven for PostgreSQL®のベクトル検索を有効にする

Aiven for PostgreSQL®でpgvector拡張が利用可能になったことを発表しました。これにより、ベクトル化されたデータをデータベースに保存し、SQLで類似検索を実行できるようになります。

PostgreSQL®の一貫性保証、使い慣れたSQL構文、豊富な分析関数を活用し、多くの組織がデータの保存と高度な分析の実行にPostgreSQL®を使用しています。しかし、類似検索のような機械学習機能を必要とする問題を解決する際には、データセット全体を他のプラットフォームに移行せざるを得ず、データの陳腐化と結果の一貫性の欠如という2つの課題に直面していました。


今日、私たちは[Aiven for PostgreSQL®](https://aiven.io/postgresql)の拡張機能として[pgvector](https://github.com/pgvector/pgvector)を発表することができ、組織がデータのベクトル化された表現を他のデータ列と一緒に保存し、SQLで類似性検索を実行できるようになりました。


## pgvector の使用例


ベクトル化された検索をAiven for PostgreSQL®にもたらすことは、顧客データの上に新しい機能を解き放つことを意味します。例えば、pgvectorを使うと以下のことができます：


* PostgreSQLのACID機能を使って、商品情報と在庫量を結合し、ベクトル検索を行うことで、在庫のある商品のみを提案する**レコメンドシステム**を構築する。
* ベクトル検索と傾向分析の力を組み合わせることによって、パターンを理解するための**異常検知システム**を構築し、良い行動を定義し、非準拠のシナリオに対してアラートを生成します。
* 大規模言語モデル(LLMs)と pgvector の組み合わせを活用することで、プロンプトに基づ いてカスタマイズされた洞察を提供するための **自然言語処理** パイプラインを構築する。これにより、自然言語による対話を通じて、企業の既存のドキュメンテーションの検索を強化することができる。
* 画像検出機械学習モデルとpgvectorを活用することで、**物体検出**や**顔認識**のような活動を行う。これには、PostgreSQLの他のデータ列から派生した追加入力による、オブジェクトパターンのカタログのフィルタリングも含まれます。


電子商取引、メディア、ヘルスケア、その他の業界であろうと、pgvectorは新しい機能を追加し、推薦システムを強化し、ベクトル化されたデータに基づいてより多くの情報に基づいた意思決定を行うことを可能にします。例えば、eコマースシナリオで頻繁に使用される商品の推薦から、メディアやヘルスケアでの使用例で非常に一般的な画像認識まで、様々な例があります。


## pgvector の概要


pgvectorの基本的な機能は、PostgreSQLにおけるベクトル情報の格納と比較です。ベクトル表現とは、データを数値の集合として表現する方法で、各値はデータの特徴や属性を表します。この表現では、データはベクトルとしてカプセル化されます。ベクトルは大きさと方向の両方を持つ数学オブジェクトです。


ベクトル表現は、機械学習や自然言語処理で広く使用されており、**埋め込み**と呼ばれ、単語、フレーズ、文、画像、文書を表現するために使用される。これらのアプリケーションでは、ベクトルの各次元は、特定の単語の頻度やその単語が出現する文脈など、テキストの特定の特徴に対応する。


ベクトル表現は、分類、クラスタリング、類似性マッチングなどのタスクによく使用される。データをベクトルとして表現することで、2つのベクトル間の距離の測定や2つのベクトルのドット積の計算など、データに数学的演算を適用することが可能になります。これらの操作は、データを比較・分析し、そこから意味のある洞察を引き出すために使用することができます。


pgvecorはPostgreSQLにベクトルを格納、検索、比較できるようにし、与えられた問い合わせ項目と本質的な特徴や類似性を共有する項目やデータ点を特定するために類似検索を実行できるようにします。pgvectorはまた、類似性検索を高速化するために完全または部分的なインデックスを構築したり、スキャンする行の量を定義することで検索精度と問い合わせ性能を交換したりすることができます。


## pgvector の利点


pgvectorを使用することで、PostgreSQLの機能にベクトル検索を追加することになり、専用の機能を別の場所に構築する必要がなくなります。この拡張は以下の機能を提供します：


* したがって、PostgreSQLに接続できる全てのツールは、すぐに類似性検索クエリの恩恵を受けることができます。
* データ移動なし**: 既存のリレーショナルデータと一緒に埋め込みデータを格納することで、データのエクスポート、変換、照合を行うことなく、PostgreSQL上で直接クエリを実行することができます。
* 既存のアーキテクチャを強化します：PostgreSQLは既に組織で広く使用されており、pgvectorはプラグアンドプレイの拡張機能として提供され、データベースを追加することなく、あらゆるデータセットにベクトル検索機能を対応させることができます。
* ベクトル検索とトランザクションデータの混合**: ベクトル検索だけでは、かなり制限されることがあります。pgvectorの強力な点は、リレーショナルデータと一緒にベクトルの類似性関数を提供することで、ユーザが同じデータベースに格納されている他の列やテーブルに基づいて、追加の属性やフィルタでベクトルクエリを充実させることができることです。
* ACID＋類似検索**：PostgreSQLをベースにしているため、ACID（原子性、一貫性、分離性、耐久性）特性の恩恵を受け、ベクトル類似検索と混在させることができます。


## Aiven for PostgreSQLでpgvectorを使い始める


pgvectorはバージョン13以降の新しいAiven for PostgreSQLインスタンスでサポートされています。既存のAiven for PostgreSQLがバージョン13以降で、pgvectorを有効にしたい場合は、[maintenance updates](https://docs.aiven.io/docs/platform/concepts/maintenance-window#maintenance-updates)を確認してください。pgvectorに関するものを適用すると、拡張機能を使用できるようになります。


PostgreSQLインスタンスがpgvectorを装備したら、SQLクライアント（例えば[psql](https://docs.aiven.io/docs/products/postgresql/howto/connect-psql)）で接続し、以下のコマンドを実行することで拡張機能を有効にすることができます。



```
CREATE EXTENSION VECTOR
```

拡張機能を有効にすると、次元数を指定した `VECTOR` 型のカラムを定義できるようになります。以下の例では、3次元のベクトルカラムを持つテーブルを作成しています。



```
CREATE TABLE COLORS(COLOR TEXT PRIMARY KEY, RGB VECTOR(3));
```

これで `COLORS` テーブルにデータを挿入できるようになった：



```
INSERT  INTO  COLORS  VALUES  ('RED','[255,0,0]');
INSERT  INTO  COLORS  VALUES  ('GREEN','[0,255,0]');
INSERT  INTO  COLORS  VALUES  ('BLUE','[0,0,255]');
INSERT  INTO  COLORS  VALUES  ('AQUA','[0,255,255]');
INSERT  INTO  COLORS  VALUES  ('BLACK','[0,0,0]');
INSERT  INTO  COLORS  VALUES  ('WHITE','[255,255,255]');
```

そして、`COLORS`テーブルの既存の色とピンクの色`(255,153,204)`とのユークリッド距離を求める：



```
select  *,  rgb  <->  '[255,153,204]'  distance  from  colors  order  by  3;
```

結果は `WHITE` が `PINK` に最も近い色であることを示している；



```
color   | rgb             | distance
--------+-----------------+--------------------
 WHITE  |  [255,255,255]  |  114.03946685248927
 RED    |  [255,0,0]      |  255
 AQUA   |  [0,255,255]    |  279.3385043276347
 BLUE   |  [0,0,255]      |  301.72006893808043
 GREEN  |  [0,255,0]      |  342.11840055746785
 BLACK  |  [0,0,0]        |  360.62445840513925

(6  rows)
```

## 価格と在庫状況


Aiven for PostgreSQLは、AWS、Google Cloud、Microsoft Azureといった主要なクラウドサービスプロバイダーすべてにおいて、世界150以上の地域で利用可能です。  

pgvector拡張は、Aiven for PostgreSQLをPostgreSQLバージョン13以上でご利用のすべてのお客様にご利用いただけます。  

Aiven for PostgreSQLで利用可能なすべての拡張機能は[このドキュメント](https://docs.aiven.io/docs/products/postgresql/reference/list-of-extensions)にあります。


Aiven for PostgreSQLは無料で始められ、より多くのストレージや高可用性をお求めの場合は、スタートアップ、ビジネス、プレミアムプランをお選びいただけます。スタートアッププランは$0.151/時間からです。


## トランザクションデータにベクトル検索を


pgvectorは、あらゆるPostgreSQLデータベース上でベクトル検索を可能にし、日常的な問い合わせに使用するのと同じSQLインタフェースでアクセス可能な幅広い類似関数を提供します。


もっと知りたい方は


* [pgvectorドキュメント](https://docs.aiven.io/docs/products/postgresql/howto/use-pgvector)を確認し、Aiven for PostgreSQLサービスでpgvector拡張を有効にして使用する手順をステップバイステップで理解してください。
* [pgvector GitHubリポジトリ](https://github.com/pgvector/pgvector#querying)をチェックして、利用可能な演算子と関数のセットを理解してください。
* pgvectorの実用的なデモをチェックしてください：[Python、OpenCV、OpenAI CLIP、pgvectorによる画像認識](https://aiven.io/developer/find-faces-with-pgvector)