アカデミーニュース

PgVectorを使用した.NETでのベクター検索の構築、開発者ガイド

.NETアプリケーションを構築しており、大量のデータ、ドキュメント、製品カタログ、顧客記録、またはスキャンファイルを扱う場合、検索は常に課題です。 キーワード検索はコンテキストを見逃します。 全文検索にも限界があります。 しかし、ベクター検索は完全に方程式を変えます。

最近、Milan Jovanovićによる優れたガイドを見つけました。彼は.NETコミュニティで最も尊敬されている声の一つであり、Microsoft MVPです。そのガイドは、PgVectorを使用して.NETでベクター検索を実装する方法を直接的に解説しています。PostgreSQL拡張機能です。既存のデータベースに直接意味検索機能をもたらします。

ベクター検索とは何か、そしてそれはどのように機能するのか?

従来の検索は正確な単語やフレーズを一致させます。 ユーザーが"請求書滞納"を検索した場合、キーワード検索はそれらの正確な単語を含むドキュメントのみを見つけます。 それは"支払い保留"や"残高あり"と言うドキュメントを表示しません。これらは同じ意味を持っているにもかかわらず。

ベクター検索は異なる方法で動作します。 単語を一致させる代わりに、意味を一致させます。

実際にこのパイプラインがどのように機能するかは次の通りです:

まず、テキストは埋め込みと呼ばれる数値表現に変換され、コンテンツの意味的意味を捉える多次元の浮動小数点数配列になります。 例えば、"滞納請求書"と"支払い保留"という文は、共通の単語を持たないにもかかわらず、ベクトル空間で数学的に互いに近い埋め込みを生成します。

これらの埋め込みは、通常OpenAIのテキスト埋め込みモデルのようなAPIを介して、機械学習モデルによって生成され、データベース内のデータと共に保存されます。

Image 1

ユーザーが検索クエリを実行すると、そのクエリも同じモデルを使用して埋め込みに変換されます。 データベースは、その埋め込みと保存されたすべての埋め込みとの距離を計算し、ベクトル空間で最も近い、つまり最も意味的に類似した結果を返します。単なるキーワード一致とは限りません。

PgVectorはこれをPostgreSQL内で直接可能にし、専用のベクトルデータベースを必要とせずに、効率的にあなたのリレーショナルデータと並んで類似性検索をサポートします。

データベースの初期化

ベクトルを保存する前に、PgVector拡張機能を有効にしてテーブルをセットアップします。


var builder = DistributedApplication.CreateBuilder(args);

var ollama = builder.AddOllama("ollama")
    .WithLifetime(ContainerLifetime.Persistent)
    .WithDataVolume()
    .WithGPUSupport();

var embeddingModel = ollama.AddModel("qwen3-embedding:0.6b");

var postgres = builder.AddPostgres("postgres", port: 6432)
    .WithLifetime(ContainerLifetime.Persistent)
    .WithDataVolume()
    .WithImage("pgvector/pgvector", "pg17")
    .AddDatabase("articles");

builder.AddProject<Projects.PgVector_Articles>("pgvector-articles")
    .WithReference(embeddingModel)
    .WithReference(postgres)
    .WaitFor(embeddingModel)
    .WaitFor(postgres);

builder.Build().Run();

var builder = DistributedApplication.CreateBuilder(args);

var ollama = builder.AddOllama("ollama")
    .WithLifetime(ContainerLifetime.Persistent)
    .WithDataVolume()
    .WithGPUSupport();

var embeddingModel = ollama.AddModel("qwen3-embedding:0.6b");

var postgres = builder.AddPostgres("postgres", port: 6432)
    .WithLifetime(ContainerLifetime.Persistent)
    .WithDataVolume()
    .WithImage("pgvector/pgvector", "pg17")
    .AddDatabase("articles");

builder.AddProject<Projects.PgVector_Articles>("pgvector-articles")
    .WithReference(embeddingModel)
    .WithReference(postgres)
    .WaitFor(embeddingModel)
    .WaitFor(postgres);

builder.Build().Run();

Aspireを使用していない場合、docker-compose経由で実行し、通常の接続文字列を使用してそれを指すことができます。

このセクションはMilan Jovanovićのオリジナル記事に基づいています。 完全なコードサンプルと実装の詳細はこちらで利用可能です。

なぜこれはIron Softwareの顧客に重要なのか

多くの顧客が大量のドキュメントを処理するためにIronPDFIronOCRIronBarcodeを使用しています。 請求書、レポート、スキャンされた記録、出荷ラベル。

Iron SoftwareライブラリとPgVectorを組み合わせた実用的なワークフローは次のようになります:

  1. Extract – スキャンされたPDFや画像からテキストを抽出するためにIronOCRを使用します
  2. Embed – 抽出したテキストを埋め込みモデルに送信し、ベクトル表現を生成します
  3. StorePgvectorを使用して、埋め込みをドキュメントのメタデータとともにPostgreSQLに保存します
  4. Search – 意味でクエリを行い、正確なキーワードの一致ではなく、意味的に最も関連性の高いドキュメントを返します

結果として、既存 for .NETおよびPostgreSQLスタック内で完全に構築された、追加のインフラストラクチャを必要としないスマートなドキュメント検索システムが得られます。

Milanのガイドに含まれる内容

Milanの記事は、PostgreSQLでPgVector拡張機能を設定し、Entity Framework CoreをNpgsqlで構成し、埋め込みを生成し、パフォーマンスのためにベクトルインデックスを作成し、類似クエリを実行するという、C#実装全体を順を追って説明しています。 実用的で生産向き、かつ.NET開発者にとって即時に適用可能です。

Iron Softwareの開発チームは定期的に.NETリソース、チュートリアル、エンジニアリングの洞察をコミュニティと共有しています。

.NETでドキュメントワークフローを構築していますか? Iron Suiteには必要なものがすべて揃っています。