學院新聞

加入Iron Academy

如果您正在建構處理大量資料、文件、產品目錄、客戶記錄或掃描文件的.NET應用程式,搜尋總是個挑戰。 關鍵字搜索缺少上下文。 全文搜索有其限制。 但向量搜索完全改變了這個等式。

我們最近發現了一篇由.NET社區中最受尊敬的聲音之一的Milan Jovanović撰寫的優秀指南,他也是一位Microsoft MVP,詳細介紹了如何使用PgVector在.NET中實現向量搜索,這是將語義搜索功能直接帶入您現有資料庫的PostgreSQL擴充套件。

什麼是向量搜索,它如何運作?

傳統搜尋匹配精確的字詞或短語。 如果使用者搜索"逾期發票",關鍵字搜索將僅找到包含那些確切字詞的文件。 它不會顯示"付款待處理"或"餘額到期"的文件,即使它們的意思是一樣的。

向量搜索運作不同。 它不匹配字詞,而是匹配意義。

以下是管道實際如何運作的描述:

首先,文字被轉換為一種數值表示,稱為嵌入,即一個高維度的浮點數陣列,捕捉內容的語義意義。 例如,句子"逾期發票"和"付款待處理"將產生在向量空間中數學上彼此接近的嵌入,儘管它們沒有共有的字詞。

這些嵌入由機器學習模型生成,通常通過類似OpenAI的文字嵌入模型API生成,並與您的資料一起儲存在資料庫中。

圖片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 – 使用IronOCR從掃描的PDF或圖像中提取文字
  2. Embed – 將提取的文字發送到嵌入模型以生成向量表示
  3. Store – 使用Pgvector將嵌入與文件元資料一起保存在PostgreSQL中
  4. Search – 根據意義查詢,返回語義上最相關的文件,而不是精確的關鍵字匹配

結果是一個更智能的文件搜索系統,完全內建於您現有的.NET和PostgreSQL堆疊中,無需額外的基礎設施。

Milan的指南涵蓋了什麼

Milan的文章介紹了完整的C#實作:在PostgreSQL中設置PgVector擴充套件,配置Entity Framework Core與Npgsql,生成嵌入,為性能建立向量索引以及運行相似性查詢。 它是實戰導向的,立即適用於任何.NET開發者。

Iron Software的開發團隊定期與我們的社區分享.NET資源、教程和工程見解。

在.NET中構建文件工作流程? Iron Suite擁有一切您所需的。