Database vektor untuk aplikasi AI .NET

Database vektor menyimpan dan mengelola penyematan vektor. Penyematan adalah representasi numerik data yang mempertahankan makna semantik. Kata- kata, dokumen, gambar, audio, dan jenis data lainnya semuanya dapat di-vektorisasi. Anda dapat menggunakan penyematan untuk membantu model AI memahami arti input sehingga dapat melakukan perbandingan dan transformasi, seperti meringkas teks, menemukan data terkait kontekstual, atau membuat gambar dari deskripsi teks.

Misalnya, Anda dapat menggunakan database vektor untuk:

  • Identifikasi gambar, dokumen, dan lagu serupa berdasarkan konten, tema, sentimen, dan gayanya.
  • Identifikasi produk serupa berdasarkan karakteristik, fitur, dan grup pengguna mereka.
  • Merekomendasikan konten, produk, atau layanan berdasarkan preferensi pengguna.
  • Identifikasi opsi potensial terbaik dari kumpulan pilihan besar untuk memenuhi persyaratan yang kompleks.
  • Identifikasi anomali data atau aktivitas penipuan yang berbeda dari pola dominan atau normal.

Database vektor menyediakan kemampuan pencarian vektor untuk menemukan item serupa berdasarkan karakteristik data mereka daripada kecocokan yang tepat pada kolom properti. Pencarian vektor bekerja dengan menganalisis representasi vektor data yang Anda buat menggunakan model penyematan AI seperti Azure model penyematan OpenAI. Proses pencarian mengukur jarak antara vektor data dan vektor kueri Anda. Vektor data yang paling dekat dengan vektor kueri Anda adalah vektor yang paling mirip secara semantik.

Sebagian besar produk database modern mendukung pencarian vektor bersama kueri tradisional; hal ini terjadi pada Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL, dan banyak produk utama lainnya. Sebagai alternatif, ada berbagai produk database vektor khusus khusus. Produk-produk ini sangat dioptimalkan untuk melakukan pencarian vektor, dan biasanya diinstal bersama database tradisional secara eksklusif untuk menangani beban kerja pencarian vektor.

Alur kerja pencarian vektor dengan .NET dan OpenAI

Database vektor dan fitur pencariannya sangat berguna dalam alur kerja RAG dengan Azure OpenAI. Pola ini memungkinkan Anda menambah model AI Anda dengan pengetahuan tambahan yang kaya secara semantik tentang data Anda. Alur kerja AI umum menggunakan database vektor mencakup langkah-langkah berikut:

  1. Buat penyematan untuk data Anda menggunakan model penyematan OpenAI.
  2. Simpan dan indeks penyematan dalam database vektor atau layanan pencarian.
  3. Konversi permintaan pengguna dari aplikasi Anda menjadi penyematan.
  4. Jalankan pencarian vektor di seluruh data Anda, membandingkan penyematan permintaan pengguna dengan penyematan dalam database Anda.
  5. Gunakan model bahasa seperti gpt-4o untuk merakit penyelesaian yang mudah digunakan dari hasil pencarian vektor.

Untuk contoh langsung alur ini, lihat tutorial Implement Azure OpenAI dengan RAG menggunakan pencarian vektor di aplikasi .NET.

Manfaat lain dari pola RAG meliputi:

  • Hasilkan respons yang relevan dan akurat secara kontekstual terhadap permintaan pengguna dari model AI.
  • Atasi batas token LLM—pekerjaan berat dilakukan melalui pencarian vektor database.
  • Kurangi biaya dari seringnya penyempurnaan pada data yang diperbarui.

Library Microsoft.Extensions.VectorData

Untuk menggunakan pencarian vektor dari .NET, Anda dapat menggunakan driver database reguler atau SDK tanpa memerlukan pustaka atau API tambahan. Misalnya, pada SQL Server, pencarian vektor dapat dilakukan di T-SQL saat menggunakan driver .NET standar, SqlClient. Namun, mengakses pencarian vektor dengan cara ini sering kali berada pada tingkat rendah, memerlukan prosedur yang rumit untuk menangani serialisasi/deserialisasi, dan kode yang dihasilkan tidak portabel antardatabase.

Sebagai alternatif, Microsoft.Extensions.VectorData library menyediakan lapisan abstraksi terpadu untuk berinteraksi dengan penyimpanan vektor di .NET.

Abstraksi kunci

Berikut adalah contoh end-to-end minimal yang membuat koleksi, memasukkan atau memperbarui rekaman, dan melakukan pencarian vektor.

using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;

// Configure an embedding generator to transform text to embeddings
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = ...;

// Create a vector store and get a collection with the embedding generator
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<int, Movie>("movies");
await collection.EnsureCollectionExistsAsync();

// Upsert some records
await collection.UpsertAsync(new Movie { Key = 1, Title = "The Lion King", Description = "An animated film about a young lion prince" });
await collection.UpsertAsync(new Movie { Key = 2, Title = "Inception", Description = "A thief who steals corporate secrets through dream-sharing technology" });
await collection.UpsertAsync(new Movie { Key = 3, Title = "Finding Nemo", Description = "A fish searches the ocean for his lost son" });

// Search for movies similar to the query text
await foreach (var result in collection.SearchAsync("animals in the wild", top: 2))
{
    Console.WriteLine($"{result.Record.Title} (score: {result.Score})");
}

// Define the data model
class Movie
{
    [VectorStoreKey]
    public int Key { get; set; }

    [VectorStoreData]
    public string Title { get; set; }

    [VectorStoreVector(Dimensions: 1536)]
    public string Description { get; set; }
}

Penyedia penyimpanan vektor

Paket Microsoft.Extensions.VectorData.Abstractions menentukan abstraksi, dan paket provider terpisah menyediakan implementasi untuk database vektor tertentu. Pilih penyedia yang cocok dengan database vektor Anda, misalnya, Microsoft. SemanticKernel.Connectors.AzureAISearch.

Nota

Terlepas dari dimasukkannya "SemanticKernel" dalam nama paket, penyedia ini tidak ada hubungannya dengan Kernel Semantik dan dapat digunakan di mana saja dalam .NET, termasuk Agent Framework.

Semua penyedia menerapkan kelas yang sama VectorStore dan VectorStoreCollection<TKey,TRecord> abstrak, sehingga Anda dapat beralih di antara mereka tanpa mengubah logika aplikasi Anda.

Petunjuk / Saran

Gunakan penyedia dalam memori (Microsoft. SemanticKernel.Connectors.InMemory) selama pengembangan/prototipe awal - tidak memerlukan layanan atau konfigurasi eksternal, dan Anda dapat menukarnya dengan penyedia produksi nanti. Hindari menggunakan penyedia InMemory untuk pengujian, karena mungkin ada perbedaan penting antara penyedia ini dan database produksi Anda. Pertimbangkan untuk menggunakan testcontainer untuk menjalankan pengujian terhadap sistem database produksi Anda.