AKADEMI HABERLERI

.NET'te PgVector ile Vektör Arama Geliştirme, Bir Geliştirici Kılavuzu

Büyük veri hacimleri, belgeler, ürün katalogları, müşteri kayıtları veya taranan dosyalarla ilgileniyorsanız, arama her zaman bir zorluktur. Anahtar kelime araması, bağlamı kaçırır. Tam metin arama, kendi sınırlarına sahiptir. Ama vektör arama denklemi tamamen değiştirir.

Yakın zamanda, .NET topluluğunda saygın bir ses olan ve Microsoft MVP olan Milan Jovanović tarafından PgVector kullanarak .NET'te vektör aramasının nasıl uygulanacağını tam olarak anlatan harika bir kılavuzla karşılaştık, bu PostgreSQL uzantısı, semantik arama yeteneklerini doğrudan mevcut veritabanınıza getiriyor.

Vektör arama nedir ve nasıl çalışır?

Geleneksel arama, tam kelimeleri veya ifadeleri eşleştirir. Eğer bir kullanıcı "fatura gecikmiş" ifadesini arıyorsa, anahtar kelime araması yalnızca bu tam kelimeleri içeren belgeleri bulacaktır. "ödeme bekliyor" veya "bakiye vadesi geldi" diyen bir belgeyi ortaya çıkarmayacaktır, her ne kadar aynı anlamı taşısalar da.

Vektör araması farklı çalışır. Anlam yerine kelimeleri eşleştirir.

İşlem hattının pratikte nasıl çalıştığı şu şekildedir:

İlk olarak, metin sayısal bir temsil olan gömülü hale, içeriğin anlamsal anlamını yakalayan yüksek boyutlu bir kayan nokta sayılar dizisine dönüştürülür. Örneğin, "borçlu fatura" ve "ödenmemiş ödeme" cümleleri, ortak kelime içermeseler bile, vektör uzayında matematiksel olarak birbirine yakın gömü ler üretir.

Bu yerleştirmeler, genellikle OpenAI'nin metin-yerleştirme modelleri gibi bir API aracılığıyla bir makine öğrenimi modeli tarafından üretilir ve verilerinizle birlikte veritabanında saklanır.

Görüntü 1

Bir kullanıcı bir arama sorgusu çalıştırdığında, bu sorgu da aynı model kullanılarak bir gömülü temsile dönüştürülür. Veritabanı daha sonra sorgu gömme ile her saklı gömme arasındaki mesafeyi hesaplar ve yalnızca anahtar kelime eşleşmesi değil, vektör alanında en yakın olan, yani anlamsal olarak en benzer olan sonuçları döndürür.

PgVector, PostgreSQL içinde doğrudan bu özelliği sağlayarak, özel bir vektör veritabanına gerek kalmadan, ilişkisel verilerinizin yanında verimli benzerlik aramaları destekler.

Veritabanını Başlatma

Vektörleri depolamadan önce PgVector uzantısını etkinleştirin ve tabloyu kurun.


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 kullanmıyorsanız, aynı pgvector/pgvector:pg17 görüntüsünü docker-compose üzerinden çalıştırabilir ve normal bir bağlantı dizesi ile ona yönlendirebilirsiniz.

Bu bölüm, Milan Jovanović'in orijinal makalesine dayanmaktadır. Tam kod örnekleri ve uygulama detayları burada mevcuttur.

Iron Software müşterileri için bunun önemi

Birçok müşterimiz, yüksek hacimli belgeleri işlemek için IronPDF, IronOCR ve IronBarcode kullanmaktadır; faturalar, raporlar, taranmış kayıtlar, nakliye etiketleri.

Iron Software kütüphanelerini PgVector ile birleştiren pratik bir iş akışı şöyle görünebilir:

  1. Extract – Tarama yapılmış PDF'lerden veya görüntülerden metin çıkarmak için IronOCR kullanın
  2. Embed – Metni yerleştirme modeline göndererek vektör temsilleri oluşturun
  3. Store – Belge metadatası ile yan yana gömülenleri Pgvector kullanarak PostgreSQL'e kaydedin
  4. Search – Anlamına göre sorgu yaparak, tam anahtar kelime eşleşmeleri yerine en anlamsal olarak ilgili belgeleri döndürün

Sonuç, tamamen mevcut .NET ve PostgreSQL yapınızın içinde inşa edilmiş daha akıllı bir belge arama sistemi olup, ek bir altyapı gerektirmez.

Milan'ın kılavuzunda neler var

Milan'ın makalesi, PostgreSQL'de PgVector uzantısının kurulumu, Npgsql ile Entity Framework Core yapılandırması, gömmelerin oluşturulması, performans için vektör indekslerinin oluşturulması ve benzerlik sorgularının çalıştırılması gibi C# uygulanmasını kapsamlı bir şekilde ele alır. Bu, herhangi bir .NET geliştiricisi için uygulamalı, üretim odaklı ve hemen uygulanabilir niteliktedir.

Iron Software geliştirme ekibi, topluluğumuzla düzenli olarak .NET kaynakları, eğitimler ve mühendislik bilgileri paylaşmaktadır.

.NET ile belge iş akışları oluşturmak mı istiyorsunuz? Iron Suite, ihtiyaç duyduğunuz her şeye sahiptir.