これは PostgreSQL Advent Calendar 2024 2 日目の記事です。
昨日(1 日目)は yaju さんでした。
個人的な PostgreSQL 関連の持ちネタは pgvector くらいしかないので、(利用事例などは 16 日目の elhalti さんにお任せしつつ)2024 年のアップデートについて振り返ってみます。
その前に
(pgvector が扱う)ベクトル検索についてよくわからない方は、九州大学 数理・データサイエンス教育研究センターの講義資料の中から関係しそうなものをピックアップして読んでみることをお勧めします。
- 情報科学【AI・データサイエンス】第 5 回 ベクトル・距離・類似度
- データサイエンス概論 I&II / データサイエンス総論 I&II データのベクトル表現と集合
- データサイエンス概論 I&II データ間の距離と類似度
2024 年の pgvector(とその周辺)の主なアップデート
バージョン 0.6.0(1/30 リリース)・0.7.0(4/30 リリース)
こちらの記事にまとめました。
- HNSW インデックス作成のパラレル化(0.6.0)
- 半精度(16 ビット)ベクトル(0.7.0)
- バイナリ(ビット)ベクトルおよびバイナリ(ビット)量子化(同)
- 疎ベクトル(同)
- サブベクトルのインデックス化(同)
をサポートしました。
「pgvector は遅い」という評判を覆すべく、パフォーマンスと効率の向上を狙ったアップデートでした。
なお、↓はバイナリインデックスおよびバイナリ量子化を試したときの記事です。
pgvectorscale 0.2.0(6/6 リリース)
バージョン 0.7.0 でひととおりの機能を備えたかに見えた pgvector ですが、ベクトルストアとして競合する Pinecone によって
- HNSW インデックスとベクトル以外の列によるフィルタリングを併用すると、本来抽出すべきデータが抽出できない可能性がある
- HNSW インデックスがメモリの範囲を超えるサイズに達した場合、インデックスの作成やインデックスによる検索が極端に遅くなる
という欠点を指摘されました。
それに対抗して、Timescale 社がリリースした pgvector 拡張が pgvectorscale です。
こちらの記事に記したとおり、
pgvectorscale では
- StreamingDiskANN インデックス
- 統計的バイナリ量子化(SBQ)
を実装することで pgvector の欠点を補っています。
このあたりの実装およびその背景の説明は、こちらのブログ記事に記されています。
先の記事 の時点でバージョン 0.2.0 だった pgvectorscale はその後、バージョン 0.5.0 で StreamingDiskANN インデックス 向けに L2 距離(ユークリッド距離)をサポートしています。
https://github.com/timescale/pgvectorscale/releases/tag/0.5.0
バージョン 0.8.0(10/31 リリース)
「IVFFlat / HNSW インデックスとベクトル以外の列によるフィルタリングを併用すると、本来抽出すべきデータが抽出できない可能性がある」問題への対処のため、インデックスの反復スキャンをサポートしました。
結果的に、pgvectorscale とは別の実装になっています(pgvectorscale は HNSW インデックスではなく StreamingDiskANN インデックスでこの問題に対処)。
「メモリを超える容量の HNSW インデックスの作成・検索速度が極端に遅くなる」問題については特に対処は行われていないようです。
明日(3 日目)は onozaty さんです。