経緯
こんにちは、よわよわのWeb開発エンジニアです😁
今回、個人用にアプリケーション開発を行うために初めてPostgreSQLの環境構築をしてみて、割と手こずってしまったため、それを備忘録としてまとめておきます。
私のDBに関する経験値としては、Microsoft SQL ServerとAzure CosmosDBを実務で、MySQLを個人で少し触ったことがあるくらいで、RDBに関する知識やコマンド知識は薄めです。
なので、私のようなDB初心者向けに書ければと思います。
環境構築
1. 利用機能を整理する
そんなことわかってるよ!と思われるかもしれませんが…
PostgreSQLって単体で使いたい場合はWindowsに直接インストールでいいんですが、拡張機能を使う場合この方法はバージョン管理などの観点からあまりよろしくないようで。
ベクトル検索は拡張機能になるので、将来的に拡張機能を使いたい人はDockerまたはWSL2(Ubuntu)で構築するようにしましょう。
(私はこのあたりをちゃんと調べずWindowsに直接インストールしてしまい、あとからDockerに作り直すという二度手間をやらかしました💦)
ちなみに、筆者はDockerで構築したので、以下はDockerでの環境構築方法です。
2. compose.ymlの作成
今回はベクトル検索の拡張機能を使いたかったため、その拡張機能が入ったイメージを使ってDockerを立ち上げます。
もし必要ない人は、docker-compose.ymlファイルのimage部分を書き換えておいてください。
ではまず、pgvectorのイメージを使って立ち上がるコンテナを作ります。
任意のフォルダの中に以下のdocker-compose.ymlファイルを作りましょう。
githubに上げる場合はユーザー名やパスワードを上げられないので、別途.envファイルを作成して任意のDB_USER、DB_PASSWORD、DB_NAMEを設定しておきます。
これらの値は、Dockerコンテナの初回立ち上げ時にPostgreSQLに登録されます。
2回目以降のアクセスでは、これらの値は一致していないとPostgreSQLにアクセスできなくなるので注意!
services:
db:
# もし拡張機能が必要ない場合はpostgres:17と記述
image: pgvector/pgvector:pg17
container_name: <任意のコンテナ名>
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
restart: always
volumes:
pgdata:
# 任意の値に変えてください
DB_USER="test"
DB_PASSWORD="test_password"
# データベースの名前を入力
DB_NAME="test-db"
実際の画面
Dockerコンテナの立ち上げ
次は、作ったdocker-compose.ymlを使ってコンテナを立ち上げ、PostgreSQLが使える環境にします。
コマンドプロンプトを立ち上げて、Dockerfileがあるフォルダと同じ位置まで移動した後以下を実行!
docker compose up -d
これで、imageで指定されたpgvector:pg17のイメージをもとにコンテナが作られます。
立ち上がったら、コンテナ内のPostgreSQLに入ります。
docker exec -it <docker-compose.ymlに記載したコンテナ名> psql -U <.envのDB_USER> -d <.envのDB_NAME>
コマンドの意味は、
docker exec: Dockerコンテナ内でコマンドを実行する
-it ~: 今立ち上げているターミナルから、直接入力できるようにする
psql: PostgreSQLを操作するコマンド
-U ~: ~のユーザー名に接続
-d ~: ~のデータベースに接続
ここまでできたら環境構築は完了!🎉🎉🎉
あとはDBやテーブルを作ればOKです。
テーブルを作ってみる
ここからはGeminiが考えたSQL文のコピペです💦
ベクトル検索を試してみます。
-- ① 拡張機能の有効化
CREATE EXTENSION IF NOT EXISTS vector;
-- ② テスト用テーブルの作成(3次元のベクトル列)
CREATE TABLE test_items (
id serial PRIMARY KEY,
name text,
embedding vector(3)
);
-- ③ データの挿入(インサート)
INSERT INTO test_items (name, embedding) VALUES
('リンゴ', '[1.0, 0.2, 0.1]'),
('バナナ', '[0.1, 0.9, 0.2]'),
('宇宙飛行士', '[0.0, 0.1, 0.9]');
作ったテーブルのデータをもとに、ベクトル検索を試します。
SELECT name, 1 - (embedding <=> '[0.0, 1.0, 0.0]') AS similarity
FROM test_items
ORDER BY embedding <=> '[0.0, 1.0, 0.0]'
LIMIT 2;
embedding <=> '[0.0, 1.0, 0.0]' が「embeddingと[0.0, 1.0, 0.0]の類似度(コサイン距離)」を計算するためのpgvector専用の書き方みたいです。
試してみると、以下が出力されました🎉
name | similarity
--------+---------------------
バナナ | 0.9704949586814732
リンゴ | 0.19518002192997685
(2 rows)
まさかSQLDBでベクトル検索を簡単に実装できるとは驚きです!
終わりに
今回はPostgreSQLを試してみました。
まさかこんなに簡単にベクトル検索できるとは…最初はRAGづくりにAWS Kendraを使おうと思っていたのですが、利用料が高額で断念し代替手段を探しているときにPostgreSQLと出会いました。
今後はより詳細な使い方を調べていきたいと思います!
記載内容の間違いやアドバイス等ありましたらぜひお願いします☺️
