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

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

はじめに

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

Open-WebUI について

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

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

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 データベースへの接続文字列を、環境変数「DATABASE_URL」に指定します。
export する場合を例として下記に記載します。

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

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

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

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;
                  id                  |       filename       
--------------------------------------+----------------------
 173b8644-1c2a-4bbd-b689-18dfc87a1f07 | WAL のアーカイブ.txt
(1 row)

まとめ

以上が、簡単ではありますが、Open-WebUI のベクトル DB に PostgreSQL + pgvector を利用する方法についての解説となります。
すでに PostgreSQL を運用している実績やノウハウがあるようでしたら、PostgreSQL + pgvector は、(中規模用途には)十分実用的な選択肢になると思います。

CATEGORY

ARCHIVE

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

CONTACT