Mac+PostgreSQLでベクトル検索

Date:

Share post:

前回の投稿で予告したように、今回からは再びベクトル検索関連の検証を行なっていきたいと思います。

ただ、過去の投稿「Ubuntu22.04にPostgreSQL17をインストールしてみた」にあるように、以前はUbuntu上でPostgreSQLを動かしていました。
しかし、昨今実施していたセグメンテーションなども含めて今後は深層学習を利用した識別や判断を絡めていく可能性が高く、その際には性能向上のためGPUを使用できるようにしたいのですが、vagrantで構築した仮想マシン(Ubuntu)からホストマシン(Mac)のGPUを使用できるようにするのは「非常に困難、または事実上不可能」(Gemini先生談)らしいです。

PostgreSQLのみUbuntuで動かして、TensorflowはMacで動かすと言うこともできるかとは思いますが、逆に、そこまでしてPostgreSQLをUbuntuで動かしたい理由がある訳でもありません。
もともと、スクラップ&ビルドしやすいvagrant環境の方が気軽に色々試せると思っていたのですが、実際には、PostgreSQLの環境をスクラップ&ビルドすることはなかったですし、Pythonに関してはvenvによる環境の使い分けができるので、改めて考えてみるとvagrant環境を使うメリットはあまりなかったように思います。

と言うことで、今後はMac上でPostgreSQL17で動かすようにしたいと思います。
今回は、そのための環境構築に関して記載します。

事前準備

まず、使用中のMacに関する情報は以下の通りです。

# sw_vers
ProductName:		macOS
ProductVersion:		15.3.1
BuildVersion:		24D70

上記環境にPostgreSQL17をインストールしますが、パッケージマネージャとしてはHomebrewを使用したいと思います。

と言うことで、Homebrewのバージョン情報を確認します。

# brew --version
zsh: command not found: brew

現在のMacは数ヶ月前に購入したもので、またHomebrewがインストールされていなかったようです。

改めて、Homebrewをインストールします。
本作業はHomebrewの公式ページに従います。

# /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

上記コマンド一発です。

再度、Homebrewのバージョン情報を確認してみましょう。

# brew --version
Homebrew 4.5.8

Homebrewがインストールできました。

PostgreSQLインストール

続いて、PostgreSQL17をインストールします。

# brew install postgresql@17

上記によりPostgreSQL17および関連コマンドがインストールされますが、コマンド群がインストールされた環境にパスが通っていないようです。

と言うことで、パスの設定を行います。

# echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc
# source ~/.zshrc

パスが設定できたら、コマンドを使用してPostgreSQLを起動してみます。
なお、Mac起動時に自動的にPostgreSQLを起動するようにもできるのですが、深層学習時を考慮して、普段から極力余計なリソースを消費しないよう、PostgreSQLは手動起動するようにしたいと思います。

まず、起動方法は以下の通り。

# pg_ctl -D /opt/homebrew/var/postgresql@17 start

停止する場合は以下のように実行します。

# pg_ctl -D /opt/homebrew/var/postgresql@17 stop

蛇足ながら、一気に再起動したい場合は以下のような方法もあります。

# pg_ctl -D /opt/homebrew/var/postgresql@17 restart

PostgreSQLが起動できたら、アクセス確認も兼ねてバージョン確認を行なってみます。

# psql --version
psql (PostgreSQL) 17.5 (Homebrew)

問題なくインストールできたようです。

パッケージインストール(pgvector)

続いて、ベクトル検索のための拡張機能(pgvector)をインストールします。

# brew install pgvector

インストール後にPostgreSQLの再起動が必要っぽいですが、それも先に示したrestartを実行するだけなので、コマンド2発で完了です。

テーブル作成からベクトル検索実行まで

以前の投稿「PostgreSQLでベクトル検索」において実施した手順に従って、動作確認用のテーブル生成からベクトル検索の実行までを行なっています。

なお、Mac環境では日本語表示に対応しているようで、出力内容がある程度日本語化されていました。

# psql postgres
psql (17.5 (Homebrew))
"help"でヘルプを表示します。

postgres=# CREATE DATABASE testdb;
CREATE DATABASE
postgres=# \c testdb;
データベース"testdb"にユーザー"toshi"として接続しました。
testdb=# \dx
                    インストール済みの拡張一覧
  名前   | バージョン |  スキーマ  |             説明             
---------+------------+------------+------------------------------
 plpgsql | 1.0        | pg_catalog | PL/pgSQL procedural language
(1 行)

testdb=# CREATE EXTENSION vector;
CREATE EXTENSION
testdb=# \dx
                                インストール済みの拡張一覧
  名前   | バージョン |  スキーマ  |                         説明                         
---------+------------+------------+------------------------------------------------------
 plpgsql | 1.0        | pg_catalog | PL/pgSQL procedural language
 vector  | 0.8.0      | public     | vector data type and ivfflat and hnsw access methods
(2 行)

testdb=# CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
CREATE TABLE
testdb=# \dt
           リレーション一覧
 スキーマ | 名前  |  タイプ  | 所有者 
----------+-------+----------+--------
 public   | items | テーブル | toshi
(1 行)

testdb=# INSERT INTO items (embedding)
SELECT ARRAY[random(), random(), random()]::vector
FROM generate_series(1, 100);
INSERT 0 100
testdb=# select * from items limit 5;
 id |              embedding              
----+-------------------------------------
  1 | [0.049053144,0.20361802,0.74592286]
  2 | [0.96567214,0.9655713,0.029284963]
  3 | [0.20561348,0.65062284,0.3650934]
  4 | [0.48262548,0.6678845,0.45768413]
  5 | [0.43116668,0.4990913,0.053313952]
(5 行)

testdb=# SELECT
    id,
    embedding,
    embedding <-> '[0.43116668,0.4990913,0.053313952]' AS distance
FROM items
ORDER BY distance
LIMIT 10;
 id |              embedding              |      distance       
----+-------------------------------------+---------------------
  5 | [0.43116668,0.4990913,0.053313952]  |                   0
 53 | [0.3102445,0.48268312,0.026516534]  | 0.12493799951848505
 22 | [0.37736848,0.52257526,0.21654187]  | 0.17346208587144024
 85 | [0.49480656,0.69643676,0.12292733]  |   0.218726514509231
 77 | [0.56124794,0.32442534,0.09252466]  | 0.22128446360402584
 42 | [0.6153535,0.34752396,0.22125705]   | 0.29172304437354346
 64 | [0.72448295,0.43784052,0.044401713] | 0.29977579629964257
 78 | [0.40781546,0.21250618,0.21689081]  |   0.330807652759913
 29 | [0.55973727,0.78118765,0.21398838]  | 0.34917763205534713
 71 | [0.6852237,0.27864528,0.15768206]   |  0.3521847833631885
(10 行)

testdb=# SELECT
    id,
    embedding,
    embedding <=> '[0.43116668,0.4990913,0.053313952]' AS distance
FROM items
ORDER BY distance
LIMIT 10;
 id |             embedding              |       distance        
----+------------------------------------+-----------------------
  5 | [0.43116668,0.4990913,0.053313952] |                     0
 47 | [0.7796771,0.8826045,0.2022415]    |  0.004054662825929922
  2 | [0.96567214,0.9655713,0.029284963] | 0.0044025228708098885
 85 | [0.49480656,0.69643676,0.12292733] |  0.006365279754002917
 53 | [0.3102445,0.48268312,0.026516534] |   0.01051041290553889
 40 | [0.22239397,0.1945082,0.039566986] |  0.010997488489644214
 29 | [0.55973727,0.78118765,0.21398838] |  0.013573116400414031
 12 | [0.8431568,0.6364739,0.15114059]   |   0.02391001480075583
 44 | [0.8831147,0.8278313,0.3522277]    |   0.02572489070102757
  8 | [0.62351716,0.8193475,0.34528482]  |  0.031173996174307717
(10 行)

以前と同様に、ユークリッド距離とコサイン距離の両方に関して動作確認して見ました。
問題なさそうです。

まとめ

まずは、Mac上でPostgreSQL17が使えるようになりました。
Ubuntu上でのインストールよりも簡単に実施できたように思います。

次回は、先に生成したモデルを使用してラベル部分をトリミングし、ベクトル化した上での検索精度に関して確認して見たいと思います。

Related articles

フロント担当のTIL 2025/06

「Today I Learned(今日学んだこと)」を記録するTIL、6月は新マシンが納品され、GPU仮想化からローカルLLM環境の構築まで、いろいろ試行錯誤しました。

ラベル画像のトリミング(6)

「ラベル画像のトリミング(5)」では...

EC-CUBE + Vagrant + Xdebu...

EC-CUBEのデバッグで今まで使用し...

EC-CUBE(4.2系~4.3系)のプラグインを...

少し前から、日本郵便で『デジタルアドレ...