pg_vectorsearch:pgvector の IVFFlat および HNSW より高速なインデックス

2026/10/14 20:47

pg_vectorsearch:pgvector の IVFFlat および HNSW より高速なインデックス

RSS: https://news.ycombinator.com/rss

要約▶

Japanese Translation:

PostgreSQL の新しい拡張機能 PRISM(Partitioned Routing Index for Similarity Matching)は、近似最近傍検索のための高性能なソリューションを提供しており、現在アルファテスト中です。IVF 式のルーティング、RaBitQ 量化、SIMD 最適化計算を採用した設計により、PRISM は pgvector よりも著しく高速でありながら、大規模データセットにおいて同等の再現率を維持し、必要なメモリはわずか 25% で済みます。重要な特徴としては、シームレスな互換性があり、ユーザーは既存の

pgvector
クラムに PRISM インデックスを構築してデータを再書き込みする必要なく利用でき、またはバイナリ互換性の高いネイティブ型(
vec32
、
vec16
)を採用することで、両システムが同一スキーマ内で共存可能となります。システムは特定の手順を通じて完全な動的更新(追加、更新、削除)をサポートし、
nprobe
などのパラメータによってパフォーマンスを調整できます。ただし、プレリリース間でのアップグレードは容易ではなく、通常はインデックスの削除と再作成が必要となります。拡張機能をソースから構築するには PostgreSQL 18 以上、最新の C コンパイラ、Meson が必要であり、L2、内積、コサインなど様々な距離測地をサポートします。PostgreSQL そのものと同様に、PostgreSQL ライセンスの下でリリースされています。

本文

pg_vectorsearch:高性能な近似最近傍検索(ANN)エクステンション

PostgreSQL エキステンション

pg_vectorsearch
は、1 億以上のベクトルを効率的に処理するための高性能な近似最近傍検索(Approximate Nearest Neighbor, ANN)を実装します。

⚠️ 状態と注意事項

  • α版(アルファ版):テスト用途のみで、本番環境での利用は推奨されません。
  • アップグレード制限:プリリリース間でのアップグレードが不可能な場合があるため、拡張機能とインデックスの削除および再構築を計画してください。
  • 既知の不具合:詳細は Changelog をご参照ください。

PRISM インデックスの特徴

PRISM(Partitioned Routing Index for Similarity Matching)は、pgvector の

IVFFlat
とコンセプトは似ていますが、最新のクアンタ化・ルーティング・パーティショニング技術を採用した PostgreSQL ネイティブなインデックスです。

主要機能

  • アルゴリズム: IVF スタイルの実装で、階層的ルーティングを採用しています。
  • クアンタ化: 二段階検索の誤差 bound を持つ RaBitQ クアンタ化を使用します。
  • パフォーマンス: SIMD 最適化された距離計算(AVX2, AVX512, NEON)をサポート。
  • 動的更新対応: インサート、アップデート、デリートをサポートし、
    prism_rebalance
    を用いたポストインゴストの再分割が可能です。
  • pgvector 互換性: 既存のベクトルおよび
    halfvec
    カラムをそのままインデックス化できます(詳細は後述)。

パフォーマンス比較

PGVector の

IVFFlat
や HNSW と比較し、以下の利点があります:

  • 検索およびインデックス構築の双方で大幅な高速化。
  • 1 億ベクトル規模でも同等の再現率(recall)を達成可能。
  • グラフベースの HNSW よりも高速でありながら、メモリ使用量は HNSW の四分の一以下。

アーキテクチャ概要

PRISM は階層的セントロイド木を用いてベクトルをクラスター分割し、PostgreSQL バッファキャッシュを活用してメモリ上に温存します。

  1. クアンタ化: RaBitQ でエンコードされ、誤差 bound が含まれるため「近傍ではないはずのベクトル」を事前に除外可能です。
  2. ページレイアウト: SIMD 距離計算に最適化されたポストインゴスト構造。

クエリフロー

  1. セントロイド木の巡回で最も近いクラスター特定(バッファキャッシュ利用)
  2. ポストインゴストのスキャンと候補選択(バッファキャッシュ・非同期 I/O 利用)
  3. RaBitQ 二段階フィルタリング:推定 → 誤差 bound 判定 → リランク
  4. ヒープからの全精度再ランク付け
  5. $k$ 個の最近傍 neighbor を返却

詳細なアーキテクチャは

docs/architecture.md
を参照してください。


使い方

拡張機能のインストール後、ベクトル格納場所に応じて以下の 2 パスから選択します。両方とも同じ演算子クラス(

<->
,
<#>
,
<=>
)とパラメータを使用可能です。

パス 1:ネイティブ型

新しいプロジェクト向け、または pgvector を使用しない場合です。独自の

vec32
または
vec16
カラムを使用します。

# リリースビルド
meson setup builddir --buildtype=release
meson install -C builddir

実装例(ネイティブ型)

-- 拡張機能をインストール
CREATE EXTENSION pg_vectorsearch;

-- テーブル定義
-- PLAIN: 内联格納。EXTERNAL(デフォルト)は値が 2kB を超えるとトーストされ、追加のフェッチが発生します。
CREATE TABLE items (
    id serial PRIMARY KEY,
    embedding vec32(3) STORAGE PLAIN
);

-- データロード
INSERT INTO items (embedding)
SELECT ARRAY[i::real, (i % 7)::real, (i % 5)::real]::vec32
FROM generate_series(1, 1000) i;

-- インデックス構築
-- vec32_l2_ops: L2 距離演算子クラス
CREATE INDEX ON items USING prism (embedding vec32_l2_ops);

-- パラメータ設定(再現率向上のため nprobe を上げる、速度向上のため下げる)
SET prism.nprobe = 40;

-- クエリ実行
SELECT * FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 5;
  • vec16: ベクトルデータを半分サイズ化したい場合に使用。演算子クラスは
    vec16_*
    に変更してください。

パス 2:既存の pgvector テーブル

vector
または
halfvec
を使用している既存テーブルへの追加です。テーブル構造やクエリに変更を必要としません。

実装例(pgvector テーブル互換)

-- pgvector 拡張機能(既存の場合、既にインストール済み)
CREATE EXTENSION vector;

-- 既存の HNSW インデックスがあるテーブル
CREATE TABLE documents (
    id        bigserial PRIMARY KEY,
    body      text,
    embedding vector(384)
);
CREATE INDEX documents_embedding_hnsw
    ON documents USING hnsw (embedding vector_l2_ops);

-- pg_vectorsearch を追加インストール
CREATE EXTENSION pg_vectorsearch;

-- 既存のカラムに対し、PRISM インデックスを構築
-- カラム自体は書き換えられません。
CREATE INDEX documents_embedding_prism
    ON documents USING prism (embedding vec32_l2_ops);

-- クエリは変更不要。通常 PRISM は高速なため、プランナーが自動的に優先します。
EXPLAIN (COSTS OFF)
SELECT id, body
FROM documents
ORDER BY embedding <-> (SELECT embedding FROM documents WHERE id = 42)
LIMIT 10;

-- 確認後に不要となった HNSW インデックスを削除
DROP INDEX documents_embedding_hnsw;

演算子クラス

距離尺度とカラムタイプ(

vec32
/
vector
,
vec16
/
halfvec
)に合わせて適切な演算子クラスを選択してください。

距離演算子
vec32
/
vector
vec16
/
halfvec
L2
<->
vec32_l2_ops
vec16_l2_ops
内積
<#>
vec32_ip_ops
vec16_ip_ops
コサイン
<=>
vec32_cosine_ops
vec16_cosine_ops

マッピングルール: pgvector の

vector_<metric>_ops
は
vec32_<metric>_ops
に、
halfvec_<metric>_ops
は
vec16_<metric>_ops
に対応します。HNSW インデックスの置換時に名前を変更してください。


チューニング

  • デフォルト値: 大規模なベンチマークで決定されており、多くの場合
    prism.nprobe
    のみを変更すれば十分です。
  • 詳細: 各パラメータ、GUC、トレードオフについては チューニングガイド を参照してください。

保守管理

インサートやアップデートによりリストが成長しても自動分割は行われません。REINDEX の他に、以下の手順で過大化したリストを再分割できます。

  • プロシージャ:
    prism_rebalance
    を使用してポストインゴストの分割を行います。
  • 詳細: 動作方法と制限については 保守ガイド を参照してください。

ビルド要件

  • PostgreSQL: 18 以降(開発ヘッダー付き)
  • コンパイラ: GNU C11 (GCC 11 以上 または Clang 14 以上)
  • ビルドシステム: Meson
  • オプション: CBLAS (RaBitQ エンコーディングの高速化用)

詳細なビルドオプションについては開発ガイドを参照してください。


ドキュメント一覧

  • [チューニング]: インデックスパラメータ、GUC、トレードオフ
  • [保守]: ポストインゴストの再均衡と分割
  • [アーキテクチャ]: 高レベル設計とデータ構造
  • [SIMD]: ビルドオプションと距離計算の詳細
  • [開発]: ビルド・テスト・CI スクリプト

リンク集 & ライセンス

研究論文

  • RaBitQ: 理論的な誤差 bound を持つ二値クアンタ化(SIGMOD 2024)
  • SPFresh: インクリメンタル更新のための LIRE プロトコル(SOSP 2023)
  • SPANN: バウンダリレプリケーションによる十億規模の ANN(NeurIPS 2021)
  • ScaNN for AlloyDB: 階層的クラスタリング(Google)

関連プロジェクト

  • pgvector: PostgreSQL のベクトルタイプと演算子
  • pgvectorscale: PostgreSQL 用ディスク ANN ベースのベクトルインデックス

ライセンス: PostgreSQL ライセンス

同じ日のほかのニュース

一覧に戻る →

2026/10/15 4:26

がん患者さんが知っておくべきこと:2026年版

## 日本語訳: 口がん(例:扁平上皮癌)と診断された人にとって最も重要な点は、疾病の深刻さが初期段階での対話(AI ツールを含む)で相対化されうる可能性があるため、適切なタイミングで高品質な医療を受けるよう執拗に努力し続けることです。個人的な経験から、術後採取した腫瘍組織で行われた検査よりも、生検組織を用いた検査を優先しないことが危険な遅れを引き起こす可能性があることが示されており、したがって患者は可能な限り総合的な遺伝子検査と上級がんセンターでの第二の意見を迅速に求めるべきです。メジャーな医療機関(例:MD Anderson)は、医師と病理科医間の強い協力関係によりより迅速かつ正確な回答を提供することが多く、US News ランキングを指針としてローカルコミュニティ病院よりも 2〜3 時間のドライブ圏内であっても訪問する価値があります。実用的な戦略には以下が含まれます: - ノートとフォローアップのための整理されたシステムを作成すること(例:予約要約や質問用の専用フォルダー)。 - NCCN ガイダンスの「標準治療」フローチャートを使用して、期待されるプロトコルを理解し、効果的にアドボケーシィを行うこと。 - 標準的な経路が停滞した際に特に Sijbrandij Foundation のようなリソースを求助すること。 外科医を選ぶ際には、年間手術件数や合併症発生率について問いかけ、同様の処置を受けた他の患者と話すことを検討すべきです。必要であれば有給休暇やホテルを使用してトップクラスのカンターにアクセスすることもできます;多くの施設は保険を受け入れています。結局のところ、これらの能動的なステップはキャンセルや保険手続きによる遅延を防ぎ、適切な標準治療を受けることを確実にします。

2026/10/15 5:48

OpenCode 2.0

## Japanese Translation: OpenCode 2.0 は、数百万人の毎日ユーザーからのフィードバックに基づいた大きなアーキテクチャ見直しであり、パフォーマンス向上、バグ修正、およびほぼあらゆるエージェント機能をサポートするように設計された全く新しい API を導入しています。主要な変更点として、すべてのインターフェース(TUI、Web、デスクトップ)を単一の中央バックグラウンドプロセス (`opencodepid`) に統合し、`@opencode/client` を使用するクライアントはこれを自動で発見できるようになりました。システムは現在、ペアリングフロー (`/pair` または `opencode pair`) を通じてスケジューリングされたタスクや外部アプリケーションとのシームレスな接続をサポートしており、ネイティブアプリの開発が進行中です。 目立つ機能の一つには、「Code Mode」(`@opencode/codemode`)があり、Node.js VM の複雑性なしにエージェントが直接スクリプトを書くことを可能にする最小限の JavaScript インタプリターを使用します。これにより、すべての MCP サーバーはデフォルトで code mode で動作します。この更新では、長時間実行されるタスクのためにバックグラウンドサブエージェントと非同期シェルコマンドを導入し、セッション中にプラグインのアップデートを行うためのホットリロードも追加されています。新しい `@opencode/sdk` を使用することで、OpenCode をサーバーまたは Durable Objects 上のライブラリとして利用できるようになります。 このアップグレードには重要なbreaking changesが含まれています:バージョン 1.x のプラグインはもはや機能せず、`tui.json` などの設定ファイルは `json` フォーマットに移動しました。最新の 1.x リリースを使用するユーザーは、2.0 に更新してこれらの変更との互換性を維持するには、最初に `opencode upgrade --major` を実行する必要があります。

2026/10/15 6:11

Jev 1.14.0 をリリースし、ドリーマー向けの試み機能を同時に提供します

## Japanese Translation: jev 1.14.0(`jev-preview` チャンネルで利用可能)は、「危険区域」API ヘッダーをゲート化した実験機能を提供します。これには、composable images(`TypeSafe-Danger-Zone-Images: true` を有効化により提供され、ただし以前の 1.13.0 ビルドに比べて多モーダル入力におけるパフォーマンス低下が報告されています)、エラーなしのバウディングボックスを返す新しい「box」検出タイプが含まれます。ユーザーはさらに、より長いコンテキスト長(`TypeSafe-Danger-Zone-Long-Context: true`)およびデバッグ用の Jaggedness レポートへの参加を選択でき、これらは特定のヘッダーを通じて利用可能です。このアップデートは 1.13.0 に基づいており、以前のパフォーマンス低下を解決すると同時に多言語サポートを拡張しています。評価については、内部インテリジェンス指標は非一貫的な推測として扱い、公式ベンチマークはデータポリシーの懸念から開示ウェイトモデルのみを対象としており、ランキングが特定のアーキテクチャにバイアスがかかっている可能性があるため、個人の実験に頼るべきです。今後、`jev-latest` 別名は 1 週間以内に 1.14.0 を採用します。企業は廃止スケジュールを監視する必要があります:バージョン 1.13.0 に対する 60 日間の警告期間に続いて、新しいリリース用の 30 日間のウィンドウを確保し、古いバージョンが廃棄される前にシステムがこれらの構造的変化に適応できるようにします。ドキュメントは docs.typesafe.ai/go/images、docs.typesafe.ai/go/box、および docs.typesafe.ai/models#context-length で利用可能です。

pg_vectorsearch:pgvector の IVFFlat および HNSW より高速なインデックス | そっか~ニュース