TECH BLOG
技術ブログ
  • 2025-08-20 PostgreSQLPostgreSQL ナレッジ

    PostgreSQL+pgvectorをOpen-WebUIのベクトルDBとして利用する

はじめに

本記事では、PostgreSQLにpgvectorを組み合わせて、Open-WebUIのベクトルDBとして活用する方法を解説します。

※ 本記事の内容は執筆時点での検証に基づいており、必ずしも正確性や完全性を保証するものではありません。動作環境やバージョンによって挙動が異なる場合があります。実際に利用される際は Open-WebUI の公式ドキュメント等もあわせてご確認ください。

Open-WebUI について

Open-WebUI は、大規模言語モデル(LLM)と対話するための オープンソース Web インターフェースです。
ローカル環境や社内ネットワーク内のインフラ上で動作させることができ、GUIベースでチャットやナレッジ検索が行える環境を構築できます。
インターネットに接続されない環境に構築した際には、通信やデータの処理がすべてローカル環境内で完結するため、社外に機密情報が流出するリスクを最小限にできます。

公式サイトの URL は下記となります。
https://docs.openwebui.com/

LLM とベクトルDB

LLM(大規模言語モデル)は、膨大なテキストデータから学習した「パターン」や「ルール」に基づいて、ユーザーの質問(プロンプト)に対して推論的に自然言語で回答(応答)する仕組みです。
ただし、LLM は学習済みの情報しか持たないため、最新の情報や社内独自の情報などについては対応できません。
Open-WebUIは、LLM とのチャット機能に加えて、ベクトル DB と呼ばれるデータベースに格納された外部情報を検索・参照し、回答する RAG(Retrieval-Augmented Generation) という仕組みを利用できます。
このベクトル DB には、文書やテキストをベクトル(数値の集合)として変換した情報が保存されており、ユーザーの質問に対して意味的に近い情報を効率的に検索できます。

PostgreSQL + pgvector をベクトル DB として利用する

Open-WebUIは、ベクトルDBとして PostgreSQL を利用できます。その際、PostgreSQL には pgvector 拡張モジュールが導入されている必要があります。
pgvector 拡張モジュールは GitHub からダウンロードできます。
https://github.com/pgvector/pgvector

もちろんパフォーマンスについては、専用のベクトル DB の方が高性能ではありますが、中規模(データが数百万程度)であれば PostgreSQL + pgvector でも十分実用的と評価されているようです。
新たに専用のベクトル DB(Qdrant など)を導入する際には、運用方法・設定・監視体系などを一から学習する必要があります。
使い慣れた PostgreSQL を利用することで、学習コストを抑えられる他、既存の監視ツールやバックアップ、ログ管理、アラート通知といった運用基盤に組み込めるという利点があります。

実際の導入手順

以下の手順は、下記の環境で行いました。

  • RokcyLinux 9.6
  • Open-WebUI 0.6.18
  • Ollama 0.9.6
  • PostgreSQL 17.5
    • /usr/local/pgsql-17.5 にインストール
  • pgvector-0.8.0

※ 基本的には Docker コンテナ上に環境構築すると思いますが、今回は検証のため、Docker を利用しない方法で環境構築しています。

pgvector の導入手順

まずは、pgvector を GitHub からダウンロードします。
2025/08 時点では、バージョン 0.8.0 が最新でした。

pgvector のダウンロードと展開
$ cd /tmp
$ wget https://github.com/pgvector/pgvector/archive/refs/tags/v0.8.0.tar.gz
$ tar -xvzf v0.8.0.tar.gz

これで /tmp に pgvector のソースコードが展開されました。

pgvector のインストールと導入

次に pgvector をインストールします。
sudo すると、デフォルトでは環境変数が引き継がれないため、make install では --preserve-env=PG_CONFIG を記述して、PG_CONFIG 環境変数が引き継がれるようにしています。

$ cd ./pgvector-0.8.0/
$ export PG_CONFIG=/usr/local/pgsql-17.5/bin/pg_config
$ make
$ sudo --preserve-env=PG_CONFIG make install

これで pgvector のインストールが完了しましたので、最後に PostgreSQL のデータベースに pgvector を導入します。
Open-WebUI のベクトル DB として利用するデータベースの名前は「openwebui_db」とします。
openwebui_db に postgres ユーザでログインし、CREATE EXTENSION コマンドを実行して pgvector を導入します。

openwebui_db=# CREATE EXTENSION vector;
CREATE EXTENSION

CREATE EXTENSION に指定する名前は pgvector ではなく vector です。

openwebui_db=# SELECT * FROM pg_extension;
  oid  | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition 
-------+---------+----------+--------------+----------------+------------+-----------+--------------
 13595 | plpgsql |       10 |           11 | f              | 1.0        |           | 
 16390 | vector  |       10 |         2200 | t              | 0.8.0      |           | 
(2 rows)

無事に導入されていることを確認できました。

Open-WebUI のベクトル DB の指定を PostgreSQL + pgvector にする。

PostgreSQL 側の準備ができましたので、Open-WebUI 側を操作します。
Open-WebUI が利用するベクトル DB の種類は、環境変数「VECTOR_DB」によって制御されます。
PostgreSQL + pgvector を利用する場合には、VECTOR_DB に「pgvector」を指定します。
また、PostgreSQL データベースへの接続文字列を、環境変数「PGVECTOR_DB_URL」に指定します。
※ 「PGVECTOR_DB_URL」のデフォルト値は「DATABASE_URL」に指定した値となるようですので、今回は「DATABASE_URL」に値を設定しています。
export する場合を例として下記に記載します。

export VECTOR_DB=pgvector
export DATABASE_URL=postgresql://openwebui_user:password@localhost:5432/openwebui_db

※ 接続文字列は「postgresql://<ユーザ名>:<パスワード>@<接続先名 or IP アドレス>:<ポート番号>/<データベース名>」という形式になります。

ちなみに、最大ベクトル長は、環境変数「PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH」で制御できるようです(デフォルト値 = 1536)。

作成されたオブジェクトを確認

Open-WebUI を起動すると、自動的にテーブルやインデックスなどのオブジェクトが作成されます。

openwebui_db=> \dt
               List of relations
 Schema |       Name       | Type  |   Owner   
--------+------------------+-------+-----------
 public | alembic_version  | table | openwebui
 public | auth             | table | openwebui
 public | channel          | table | openwebui
 public | channel_member   | table | openwebui
 public | chat             | table | openwebui
 public | chatidtag        | table | openwebui
 public | config           | table | openwebui
 public | document         | table | openwebui
 public | document_chunk   | table | openwebui
 public | feedback         | table | openwebui
 public | file             | table | openwebui
 public | folder           | table | openwebui
 public | function         | table | openwebui
 public | group            | table | openwebui
 public | knowledge        | table | openwebui
 public | memory           | table | openwebui
 public | message          | table | openwebui
 public | message_reaction | table | openwebui
 public | migratehistory   | table | openwebui
 public | model            | table | openwebui
 public | note             | table | openwebui
 public | prompt           | table | openwebui
 public | tag              | table | openwebui
 public | tool             | table | openwebui
 public | user             | table | openwebui
(25 rows)

ベクトル DB というので、てっきり RAG 専用の DB かと思いましたが、ユーザなどの以外の情報も登録されているようです。

Open-WebUI では、「ナレッジベース」に「コレクション」と呼ばれる単位で文書やナレッジ情報を追加できます。
ユーザーの質問に対して回答を生成する際、関連づけられたナレッジベースのコレクションが参照されます。
実際に「WALのアーカイブ」というタイトルでコレクションを追加すると、file テーブルなどにレコードが追加されました。

openwebui_db=> SELECT id, filename FROM file;
-[ RECORD 1 ]----------------------------------
id | 96efd786-5eb5-4b6d-bcec-d932f85bcdc5
filename | WALのアーカイブ.txt
openwebui_db=> SELECT collection_name, text FROM document_chunk;
-[ RECORD 1 ]---+----------------------------------------------------------------------------
collection_name | file-96efd786-5eb5-4b6d-bcec-d932f85bcdc5
text | アーカイブされたWALファイルは自動的に削除されない。
-[ RECORD 2 ]---+----------------------------------------------------------------------------
collection_name | df3b1fe7-4598-4b27-8898-26a5ade20288
text | アーカイブされたWALファイルは自動的に削除されない。

なぜか document_chunk には 2 レコード作成されていました。
この document_chunk テーブルのレイアウトは下記となります。

\d document_chunk
                  Table "public.document_chunk"
     Column      |     Type     | Collation | Nullable | Default 
-----------------+--------------+-----------+----------+---------
 id              | text         |           | not null | 
 vector          | vector(1536) |           |          | 
 collection_name | text         |           | not null | 
 text            | text         |           |          | 
 vmetadata       | jsonb        |           |          | 
Indexes:
    "document_chunk_pkey" PRIMARY KEY, btree (id)
    "idx_document_chunk_collection_name" btree (collection_name)
    "idx_document_chunk_vector" ivfflat (vector vector_cosine_ops) WITH (lists='100')

vector レコードにベクトル化されたデータが格納されるようです。

まとめ

以上が、簡単ではありますが、Open-WebUI のベクトル DB に PostgreSQL + pgvector を利用する方法についての解説となります。
すでに PostgreSQL を運用している実績やノウハウがあるようでしたら、PostgreSQL + pgvector は、(中規模用途には)十分実用的な選択肢になると思います。
ただ、(冒頭にも記載しましたが)こちらでもまだまだ検証段階ですので、実際の運用にあたっては必ず公式ドキュメントや最新の情報をご確認いただければ幸いです。

CATEGORY

ARCHIVE

PostgreSQLに関するご相談は
株式会社インサイトまで
お気軽にお問い合わせください。

CONTACT