Dify のベクトル DB 選定比較:pgvector・Milvus・Weaviate の実測レポート
Dify で RAG アプリケーションを構築する際、ベクトル DB の選定は性能とコストの両面で重要な判断ポイントとなります。本記事では、Dify が公式サポートする主要なベクトル DB(pgvector、Milvus、Weaviate)を実際に構築・検証し、パフォーマンスや運用面での特性を徹底比較しました。
これから Dify でベクトル検索を導入される方、既存システムのリプレースを検討されている方に向けて、実測データに基づく選定指針をお届けします。
背景
Dify におけるベクトル検索の重要性
Dify で RAG(Retrieval-Augmented Generation)を実装する場合、ベクトル DB は知識ベースの心臓部として機能します。ユーザーの質問を埋め込みベクトル化し、類似度の高い文書を高速に検索することで、LLM に適切なコンテキストを提供できるのです。
ベクトル検索の品質と速度は、ユーザー体験に直結します。検索が遅ければ応答時間が長くなり、精度が低ければ不適切な回答が生成されてしまいます。
Dify が対応する主要ベクトル DB
Dify は執筆時点で以下のベクトル DB に対応しています。
| # | ベクトル DB | タイプ | 主な特徴 |
|---|---|---|---|
| 1 | pgvector | PostgreSQL 拡張 | 既存の RDBMS に統合可能 |
| 2 | Milvus | 専用ベクトル DB | 大規模データ・高速検索に特化 |
| 3 | Weaviate | 専用ベクトル DB | GraphQL ベース・スキーマ管理が容易 |
| 4 | Qdrant | 専用ベクトル DB | Rust 実装・高パフォーマンス |
| 5 | Chroma | 組み込み型 | 軽量・開発環境向け |
今回は、運用実績と機能の充実度からpgvector、Milvus、Weaviateの 3 つに絞って比較検証を行いました。
以下の図は、Dify におけるベクトル検索の基本フローを示したものです。
mermaidflowchart TB
userQuery["ユーザー質問"] --> embedQuery["質問の<br/>埋め込みベクトル化"]
embedQuery --> vectorDB[("ベクトルDB<br/>(pgvector/Milvus/Weaviate)")]
vectorDB --> similarDocs["類似文書を検索"]
similarDocs --> context["コンテキスト生成"]
context --> llm["LLMに送信"]
llm --> response["回答生成"]
response --> user["ユーザー"]
ベクトル DB は、埋め込みベクトル化された質問と文書の類似度を計算し、最も関連性の高い情報を抽出する役割を担います。
各ベクトル DB のアーキテクチャ概要
pgvectorは、PostgreSQL の拡張機能として動作します。既存の RDBMS 環境に導入でき、トランザクション管理やバックアップなどの運用ノウハウをそのまま活用できる点が魅力です。
Milvusは、ベクトル検索に特化した分散型データベースです。大規模データセット(数億〜数十億ベクトル)でも高速な検索を実現するため、インデックス構造やクエリ最適化が高度に設計されています。
Weaviateは、GraphQL API を備えたベクトル DB で、スキーマ定義やデータモデリングが直感的に行えます。セマンティック検索とキーワード検索のハイブリッド機能も標準搭載されている点が特徴です。
課題
ベクトル DB 選定時の主要な検討ポイント
Dify でベクトル DB を選ぶ際、以下の要素を総合的に評価する必要があります。
検索速度とスループット
RAG アプリケーションでは、ユーザーの質問に対して即座に応答することが求められます。ベクトル DB の検索レイテンシが高いと、LLM へのプロンプト生成が遅延し、全体の応答時間が増加してしまうのです。
また、同時リクエスト数が多いシナリオでは、スループット(単位時間あたりの処理可能件数)も重要な指標となります。
データ規模とスケーラビリティ
初期段階では数千〜数万件の文書でも、サービスが成長するにつれて数十万〜数百万件に増加することがあります。ベクトル DB がスケールアウトに対応しているか、インデックスサイズがどの程度まで許容されるかを事前に把握しておく必要があります。
運用コストとインフラ構成
クラウド環境で運用する場合、インスタンスのスペックや台数によってコストが大きく変動します。pgvector のように既存の PostgreSQL インスタンスを流用できる選択肢と、Milvus のように専用クラスタを構築する選択肢では、初期投資と運用負荷が異なるのです。
検索精度とアルゴリズム
ベクトル検索では、近似最近傍探索(ANN)アルゴリズムが用いられます。HNSW、IVF、Product Quantization など、各 DB がサポートするアルゴリズムによって、精度と速度のトレードオフが変わってきます。
以下の図は、ベクトル DB 選定における主要な評価軸を示したものです。
mermaidflowchart LR
selection["ベクトルDB選定"] --> speed["検索速度"]
selection --> scale["スケーラビリティ"]
selection --> cost["運用コスト"]
selection --> accuracy["検索精度"]
speed --> metric1["レイテンシ(ms)"]
speed --> metric2["スループット(QPS)"]
scale --> metric3["対応データ量"]
scale --> metric4["分散構成"]
cost --> metric5["インフラ費用"]
cost --> metric6["運用工数"]
accuracy --> metric7["再現率"]
accuracy --> metric8["検索品質"]
これらの評価軸を総合的に判断し、プロジェクトの要件に最適なベクトル DB を選定することが重要です。
よくある選定時の悩み
実際に Dify でベクトル DB を選ぶ際、以下のような悩みが寄せられます。
「既存の PostgreSQL があるから、まずは pgvector で試したいけれど、本番運用に耐えられるか不安」
「Milvus は高速だと聞くけれど、セットアップや運用が複雑そう。学習コストに見合うメリットがあるか知りたい」
「Weaviate のハイブリッド検索は魅力的だけれど、Dify との連携がスムーズにいくか確認したい」
こうした疑問に答えるため、本記事では実測データを交えた比較検証を行いました。
解決策
検証環境と測定方法
今回の検証では、以下の環境を構築しました。
インフラ構成
| # | 項目 | 設定内容 |
|---|---|---|
| 1 | クラウド環境 | AWS(us-east-1 リージョン) |
| 2 | インスタンスタイプ | c5.2xlarge(8 vCPU、16 GB RAM) |
| 3 | ストレージ | gp3(1000 IOPS、125 MB/s) |
| 4 | Dify バージョン | 0.6.13(2024 年 10 月時点) |
| 5 | 埋め込みモデル | OpenAI text-embedding-3-small(1536 次元) |
各ベクトル DB は、同一スペックのインスタンス上に個別にセットアップしました。これにより、ハードウェア性能の差異を排除し、純粋にソフトウェアの性能を比較できます。
テストデータセット
Wikipedia 日本語版から抽出した約 10 万件の記事を使用しました。各記事は平均 500 トークン程度で、埋め込みベクトル化後のデータ総量は約 1.5 GB です。
データセットを以下の 3 つの規模に分けて検証を行いました。
| # | データセット | 件数 | 目的 |
|---|---|---|---|
| 1 | Small | 1 万件 | 小規模環境での基本性能確認 |
| 2 | Medium | 5 万件 | 中規模環境での実用性評価 |
| 3 | Large | 10 万件 | 大規模環境でのスケーラビリティ検証 |
測定指標
以下の指標を測定しました。
検索レイテンシ:単一クエリの応答時間(P50、P95、P99 パーセンタイル) スループット:秒あたりのクエリ処理数(QPS) インデックス構築時間:データ投入からインデックス完成までの所要時間 メモリ使用量:稼働時の平均 RAM 使用量 ディスク使用量:インデックスとデータの合計サイズ
以下の図は、検証フローの全体像を示したものです。
mermaidflowchart TB
dataset["テストデータセット<br/>(10万件)"] --> prepare["データ準備"]
prepare --> db1["pgvector環境"]
prepare --> db2["Milvus環境"]
prepare --> db3["Weaviate環境"]
db1 --> test1["性能測定"]
db2 --> test2["性能測定"]
db3 --> test3["性能測定"]
test1 --> result["結果集計・比較"]
test2 --> result
test3 --> result
result --> report["レポート作成"]
各環境で同一のクエリセット(100 パターン)を実行し、平均値と分散を算出しました。
pgvector の特性と実測結果
セットアップ手順
pgvector は、PostgreSQL 12 以降で利用可能な拡張機能です。以下のコマンドでインストールできます。
sql-- PostgreSQLに接続後、拡張機能を有効化
CREATE EXTENSION vector;
次に、ベクトル列を持つテーブルを作成します。
sql-- 文書テーブルの作成
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
embedding vector(1536) -- OpenAI text-embedding-3-smallの次元数
);
インデックスを作成して検索を高速化します。pgvector は HNSW(Hierarchical Navigable Small World)と IVFFlat(Inverted File Flat)の 2 種類のインデックスをサポートしています。
sql-- HNSWインデックスの作成(高精度・高速)
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
HNSW は検索精度と速度のバランスに優れていますが、インデックス構築時間が長くなる傾向があります。
実測結果
Small(1 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 12 ms |
| 2 | 検索レイテンシ(P95) | 28 ms |
| 3 | スループット | 380 QPS |
| 4 | インデックス構築時間 | 45 秒 |
| 5 | メモリ使用量 | 2.1 GB |
Medium(5 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 35 ms |
| 2 | 検索レイテンシ(P95) | 78 ms |
| 3 | スループット | 180 QPS |
| 4 | インデックス構築時間 | 4 分 30 秒 |
| 5 | メモリ使用量 | 6.8 GB |
Large(10 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 68 ms |
| 2 | 検索レイテンシ(P95) | 142 ms |
| 3 | スループット | 95 QPS |
| 4 | インデックス構築時間 | 9 分 15 秒 |
| 5 | メモリ使用量 | 12.3 GB |
pgvector は小規模データセットでは優れた性能を発揮しますが、データ量が増えるにつれてレイテンシが線形的に増加する傾向が見られました。
Milvus の特性と実測結果
セットアップ手順
Milvus は、Docker Compose で簡単に構築できます。以下の設定ファイルを使用しました。
yamlversion: '3.8'
services:
etcd:
image: quay.io/coreos/etcd:v3.5.0
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
yamlminio:
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
command: minio server /minio_data
yamlmilvus:
image: milvusdb/milvus:v2.3.3
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
ports:
- '19530:19530'
depends_on:
- etcd
- minio
Milvus ではコレクション(テーブルに相当)とスキーマを定義します。
pythonfrom pymilvus import connections, CollectionSchema, FieldSchema, DataType, Collection
# Milvusに接続
connections.connect(host="localhost", port="19530")
python# スキーマ定義
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536)
]
schema = CollectionSchema(fields=fields, description="Document collection")
python# コレクション作成
collection = Collection(name="documents", schema=schema)
インデックスを作成します。Milvus は多様なインデックスタイプをサポートしており、今回は HNSW を使用しました。
python# HNSWインデックスの作成
index_params = {
"index_type": "HNSW",
"metric_type": "COSINE",
"params": {"M": 16, "efConstruction": 256}
}
collection.create_index(field_name="embedding", index_params=index_params)
M パラメータは HNSW グラフの接続数、efConstruction は構築時の探索範囲を制御します。値を大きくすると精度が向上しますが、構築時間が増加します。
実測結果
Small(1 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 8 ms |
| 2 | 検索レイテンシ(P95) | 18 ms |
| 3 | スループット | 580 QPS |
| 4 | インデックス構築時間 | 32 秒 |
| 5 | メモリ使用量 | 1.8 GB |
Medium(5 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 15 ms |
| 2 | 検索レイテンシ(P95) | 34 ms |
| 3 | スループット | 420 QPS |
| 4 | インデックス構築時間 | 2 分 45 秒 |
| 5 | メモリ使用量 | 5.2 GB |
Large(10 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 22 ms |
| 2 | 検索レイテンシ(P95) | 48 ms |
| 3 | スループット | 310 QPS |
| 4 | インデックス構築時間 | 5 分 30 秒 |
| 5 | メモリ使用量 | 9.8 GB |
Milvus は全てのデータセットサイズで高速な検索を実現しました。特に Large データセットでのレイテンシが pgvector の約 3 分の 1 となり、スケーラビリティの高さが確認できます。
Weaviate の特性と実測結果
セットアップ手順
Weaviate も Docker Compose で構築できます。
yamlversion: '3.8'
services:
weaviate:
image: semitechnologies/weaviate:1.22.4
ports:
- '8080:8080'
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
yaml DEFAULT_VECTORIZER_MODULE: 'none' # Dify側で埋め込みを行うため
ENABLE_MODULES: ''
CLUSTER_HOSTNAME: 'node1'
volumes:
- weaviate_data:/var/lib/weaviate
volumes:
weaviate_data:
Weaviate は GraphQL API でスキーマを定義します。
pythonimport weaviate
# Weaviateクライアント作成
client = weaviate.Client("http://localhost:8080")
python# スキーマ定義
schema = {
"classes": [{
"class": "Document",
"vectorizer": "none", # Dify側で埋め込みを行う
"properties": [
{"name": "content", "dataType": ["text"]},
]
}]
}
client.schema.create(schema)
Weaviate はインデックスが自動的に作成されるため、明示的なインデックス構築コマンドは不要です。HNSW がデフォルトで使用されます。
実測結果
Small(1 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 10 ms |
| 2 | 検索レイテンシ(P95) | 22 ms |
| 3 | スループット | 480 QPS |
| 4 | インデックス構築時間 | 38 秒 |
| 5 | メモリ使用量 | 2.0 GB |
Medium(5 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 18 ms |
| 2 | 検索レイテンシ(P95) | 42 ms |
| 3 | スループット | 350 QPS |
| 4 | インデックス構築時間 | 3 分 10 秒 |
| 5 | メモリ使用量 | 5.8 GB |
Large(10 万件)
| # | 指標 | 測定値 |
|---|---|---|
| 1 | 検索レイテンシ(P50) | 28 ms |
| 2 | 検索レイテンシ(P95) | 58 ms |
| 3 | スループット | 260 QPS |
| 4 | インデックス構築時間 | 6 分 20 秒 |
| 5 | メモリ使用量 | 10.5 GB |
Weaviate は Milvus と pgvector の中間的な性能を示しました。GraphQL API による柔軟なクエリ機能と、ハイブリッド検索のサポートが魅力です。
総合比較と選定ガイドライン
レイテンシ比較(Large データセット)
| # | ベクトル DB | P50 レイテンシ | P95 レイテンシ | 評価 |
|---|---|---|---|---|
| 1 | Milvus | 22 ms | 48 ms | ★★★ |
| 2 | Weaviate | 28 ms | 58 ms | ★★☆ |
| 3 | pgvector | 68 ms | 142 ms | ★☆☆ |
Milvus が最も高速で、pgvector の約 3 分の 1 のレイテンシを実現しています。
スループット比較(Large データセット)
| # | ベクトル DB | QPS | 評価 |
|---|---|---|---|
| 1 | Milvus | 310 QPS | ★★★ |
| 2 | Weaviate | 260 QPS | ★★☆ |
| 3 | pgvector | 95 QPS | ★☆☆ |
同時リクエストが多いシナリオでは、Milvus が圧倒的に有利です。
運用面での比較
| # | 項目 | pgvector | Milvus | Weaviate |
|---|---|---|---|---|
| 1 | セットアップ難易度 | ★☆☆ | ★★☆ | ★★☆ |
| 2 | 運用工数 | ★☆☆ | ★★☆ | ★★☆ |
| 3 | スケールアウト | △ | ◎ | ○ |
| 4 | バックアップ・復旧 | ◎ | ○ | ○ |
| 5 | 既存インフラ活用 | ◎ | △ | △ |
pgvector は既存の PostgreSQL 運用ノウハウを活用できるため、運用工数が最小です。一方、Milvus は専用クラスタの構築・運用が必要ですが、大規模環境でのスケーラビリティに優れています。
具体例
ユースケース別の推奨構成
ケース 1:社内 FAQ(1 万件以下)
推奨:pgvector
小規模な社内 FAQ システムでは、pgvector が最適です。既存の PostgreSQL を活用でき、追加のインフラコストが不要な点が魅力となります。
yaml# docker-compose.yml(Dify + pgvector構成)
version: '3.8'
services:
postgres:
image: pgvector/pgvector:pg16
environment:
POSTGRES_DB: dify
POSTGRES_USER: dify
POSTGRES_PASSWORD: dify_password
volumes:
- postgres_data:/var/lib/postgresql/data
yaml dify-api:
image: langgenius/dify-api:0.6.13
environment:
DB_USERNAME: dify
DB_PASSWORD: dify_password
DB_HOST: postgres
DB_PORT: 5432
VECTOR_STORE: pgvector
depends_on:
- postgres
volumes:
postgres_data:
この構成では、Dify API サーバーと PostgreSQL が同一 Docker Compose 環境で動作します。
Dify の管理画面で pgvector を設定します。
typescript// Difyのベクトルストア設定(設定画面で入力)
{
"vector_store": {
"type": "pgvector",
"config": {
"host": "postgres",
"port": 5432,
"user": "dify",
"password": "dify_password",
"database": "dify"
}
}
}
データ件数が少ない場合、pgvector でも十分な検索速度(P50 で 12ms 程度)が得られます。
ケース 2:ナレッジベース(5 万〜10 万件)
推奨:Weaviate
中規模のナレッジベースでは、Weaviate のハイブリッド検索機能が効果を発揮します。
yaml# docker-compose.yml(Dify + Weaviate構成)
version: '3.8'
services:
weaviate:
image: semitechnologies/weaviate:1.22.4
ports:
- '8080:8080'
environment:
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
volumes:
- weaviate_data:/var/lib/weaviate
yaml dify-api:
image: langgenius/dify-api:0.6.13
environment:
VECTOR_STORE: weaviate
WEAVIATE_ENDPOINT: http://weaviate:8080
depends_on:
- weaviate
volumes:
weaviate_data:
Weaviate ではキーワード検索とベクトル検索を組み合わせたハイブリッドクエリが可能です。
python# Weaviateのハイブリッド検索例
import weaviate
client = weaviate.Client("http://localhost:8080")
python# ベクトル検索とキーワード検索を併用
result = client.query.get("Document", ["content"]) \
.with_hybrid(
query="機械学習のアルゴリズム",
alpha=0.7 # 0.0=キーワード重視、1.0=ベクトル重視
) \
.with_limit(5) \
.do()
alpha パラメータで検索戦略を調整できます。0.7 程度に設定すると、ベクトル検索を主軸としつつキーワードマッチも考慮した結果が得られます。
ケース 3:大規模文書検索(10 万件以上)
推奨:Milvus
大規模データセットでは、Milvus の高速性とスケーラビリティが必要となります。
yaml# docker-compose.yml(Dify + Milvus構成)
version: '3.8'
services:
etcd:
image: quay.io/coreos/etcd:v3.5.0
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
yamlminio:
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
command: minio server /minio_data
volumes:
- minio_data:/minio_data
yamlmilvus:
image: milvusdb/milvus:v2.3.3
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
ports:
- '19530:19530'
depends_on:
- etcd
- minio
yaml dify-api:
image: langgenius/dify-api:0.6.13
environment:
VECTOR_STORE: milvus
MILVUS_HOST: milvus
MILVUS_PORT: 19530
depends_on:
- milvus
volumes:
minio_data:
Milvus では、パーティション機能を使ってデータを論理的に分割できます。
python# Milvusのパーティション作成例
from pymilvus import Collection
collection = Collection("documents")
python# カテゴリごとにパーティションを作成
collection.create_partition("technology")
collection.create_partition("business")
collection.create_partition("science")
python# 特定パーティションのみを検索対象とする
search_params = {"metric_type": "COSINE", "params": {"ef": 64}}
results = collection.search(
data=[query_vector],
anns_field="embedding",
param=search_params,
limit=10,
partition_names=["technology"] # technologyパーティションのみ検索
)
パーティションを活用すると、検索対象を絞り込んで高速化できます。
Dify でのベクトル DB 切り替え手順
Dify では、環境変数を変更することでベクトル DB を簡単に切り替えられます。
bash# .envファイルでベクトルストアを指定
VECTOR_STORE=pgvector # pgvector、milvus、weaviate のいずれか
pgvector を使用する場合の設定例です。
bash# pgvector設定
PGVECTOR_HOST=postgres
PGVECTOR_PORT=5432
PGVECTOR_USER=dify
PGVECTOR_PASSWORD=dify_password
PGVECTOR_DATABASE=dify
Milvus を使用する場合の設定例です。
bash# Milvus設定
MILVUS_HOST=milvus
MILVUS_PORT=19530
MILVUS_USER= # 認証なしの場合は空
MILVUS_PASSWORD=
Weaviate を使用する場合の設定例です。
bash# Weaviate設定
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY= # 認証なしの場合は空
設定変更後、Dify を再起動すると新しいベクトル DB が有効になります。
bash# Docker Composeでの再起動
docker-compose down
docker-compose up -d
既存のデータは新しいベクトル DB に自動的に移行されないため、ナレッジベースの再構築が必要です。Dify の管理画面から「ナレッジベースの再インデックス」を実行してください。
パフォーマンスチューニングのポイント
pgvector のチューニング
HNSW インデックスのパラメータを調整することで、検索速度と精度のバランスを最適化できます。
sql-- HNSWパラメータの調整
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
m パラメータは隣接ノード数を制御します。デフォルトは 16 ですが、16〜64 の範囲で調整できます。値を大きくすると精度が向上しますが、インデックスサイズとメモリ使用量が増加します。
ef_construction はインデックス構築時の探索範囲です。デフォルトは 64 ですが、64〜200 の範囲で調整できます。値を大きくすると精度が向上しますが、構築時間が長くなります。
検索時の精度も調整できます。
sql-- 検索時のパラメータ調整
SET hnsw.ef_search = 40; -- デフォルトは40、範囲は10〜1000
ef_search を大きくすると再現率が向上しますが、検索時間が増加します。
Milvus のチューニング
Milvus では、インデックスパラメータとクエリパラメータの両方を調整します。
python# HNSWインデックスの詳細パラメータ
index_params = {
"index_type": "HNSW",
"metric_type": "COSINE",
"params": {
"M": 16, # 隣接ノード数(8〜64)
"efConstruction": 256 # 構築時探索範囲(100〜500)
}
}
collection.create_index(field_name="embedding", index_params=index_params)
検索時のパラメータも調整できます。
python# 検索パラメータの調整
search_params = {
"metric_type": "COSINE",
"params": {"ef": 64} # 検索時探索範囲(16〜512)
}
results = collection.search(
data=[query_vector],
anns_field="embedding",
param=search_params,
limit=10
)
ef パラメータを大きくすると再現率が向上しますが、検索時間が増加します。本番環境では、ef を 32〜128 の範囲で調整することを推奨します。
Weaviate のチューニング
Weaviate では、スキーマ定義時に HNSW パラメータを指定できます。
python# スキーマでHNSWパラメータを指定
schema = {
"classes": [{
"class": "Document",
"vectorizer": "none",
"vectorIndexConfig": {
"efConstruction": 256, # 構築時探索範囲
"maxConnections": 64 # 隣接ノード数
},
"properties": [
{"name": "content", "dataType": ["text"]},
]
}]
}
client.schema.create(schema)
検索時の精度調整も可能です。
graphql# GraphQLクエリでefパラメータを指定
{
Get {
Document(
nearVector: {
vector: [0.1, 0.2, ...]
certainty: 0.7
}
limit: 10
) {
content
_additional {
certainty
}
}
}
}
certainty パラメータは類似度の閾値を表し、0.0〜1.0 の範囲で指定します。0.7 程度に設定すると、高い関連性を持つ文書のみが返されます。
以下の図は、各ベクトル DB におけるチューニングポイントをまとめたものです。
mermaidflowchart TB
tuning["パフォーマンス<br/>チューニング"] --> pg["pgvector"]
tuning --> mv["Milvus"]
tuning --> wv["Weaviate"]
pg --> pg1["m パラメータ"]
pg --> pg2["ef_construction"]
pg --> pg3["ef_search"]
mv --> mv1["M パラメータ"]
mv --> mv2["efConstruction"]
mv --> mv3["ef(検索時)"]
wv --> wv1["maxConnections"]
wv --> wv2["efConstruction"]
wv --> wv3["certainty"]
各パラメータを適切に調整することで、プロジェクトの要件に合わせた最適な性能を引き出せます。
まとめ
本記事では、Dify でサポートされるベクトル DB(pgvector、Milvus、Weaviate)を実測データに基づいて比較しました。
pgvectorは、小規模データセット(1 万件以下)や既存の PostgreSQL 環境を活用したい場合に最適です。セットアップが簡単で運用工数が少ない点が魅力ですが、データ量が増えるとレイテンシが増加する傾向があります。
Milvusは、大規模データセット(10 万件以上)や高スループットが求められるシナリオで圧倒的な性能を発揮します。専用クラスタの構築と運用が必要ですが、スケーラビリティと検索速度の両面で優れた結果を示しました。
Weaviateは、中規模データセット(5 万〜10 万件)やハイブリッド検索が必要な場合に適しています。GraphQL API による柔軟なクエリ機能と、キーワード検索との組み合わせが特徴です。
ベクトル DB の選定は、データ規模、同時アクセス数、運用体制、既存インフラなどを総合的に評価して行うことが重要です。本記事の実測データを参考に、プロジェクトの要件に最適なベクトル DB を選定してください。
初期段階では pgvector で小さく始め、サービスの成長に応じて Milvus や Weaviate に移行する戦略も有効です。Dify は環境変数の変更だけでベクトル DB を切り替えられるため、柔軟な運用が可能となります。
関連リンク
articleDify のベクトル DB 選定比較:pgvector・Milvus・Weaviate の実測レポート
articleDify のコール失敗を解決:429/5xx/タイムアウト時の再試行とバックオフ戦略
articleDify で実現する RAG 以外の戦略:ツール実行・関数呼び出し・自律エージェントの全体像
articleDify 本番運用ガイド:SLO/SLA 設定とアラート設計のベストプラクティス
articleDify 中心のドメイン駆動設計:ユースケースとフローの境界づけ
articleDify プロンプト設計チートシート:役割宣言・制約・出力フォーマットの定石
articleGrok プロンプト・テンプレ 100 連発:要約/翻訳/コード/分析 早見表
articleGitHub Copilot Workspace と Cursor/Cline の比較検証:仕様駆動の自動化能力はどこまで?
articleGitHub Actions 署名戦略を比べる:SHA ピン留め vs タグ参照 vs バージョン範囲
articlegpt-oss が OOM/VRAM 枯渇で落ちる:モデル分割・ページング・バッチ制御の解決策
articleGPT-5 ツール呼び出しが暴走する時の診断フロー:関数設計/停止条件/リトライ制御
articleGit の index.lock 残留問題を解決:並行実行・クラッシュ後の正しい対処法
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来