Aracılığıyla paylaş


Qdrant bağlayıcısını kullanma (Önizleme)

Uyarı

Qdrant Vektör Deposu işlevi önizleme aşamasındadır ve yayınlanmadan önce sınırlı durumlarda önemli değişiklik gerektiren iyileştirmeler yine de gerçekleşebilir.

Uyarı

Semantik Çekirdek Vektör Deposu işlevselliği önizleme aşamasındadır ve sürümden önce sınırlı koşullarda kırıcı değişiklikler gerektiren iyileştirmeler yine de gerçekleşebilir.

Uyarı

Semantik Çekirdek Vektör Deposu işlevselliği önizleme aşamasındadır ve sürümden önce sınırlı koşullarda kırıcı değişiklikler gerektiren iyileştirmeler yine de gerçekleşebilir.

Genel bakış

Qdrant Vektör Deposu bağlayıcısı, Qdrant'taki verilere erişmek ve verileri yönetmek için kullanılabilir. Bağlayıcı aşağıdaki özelliklere sahiptir.

Özellik Alanı Destek
Koleksiyon eşlemeleri Filtrelenebilir veri alanları için yük dizinlerine sahip Qdrant koleksiyonu
Desteklenen anahtar özellik türleri
  • ulong
  • GUID
Desteklenen veri özelliği türleri
  • Dize
  • Int
  • uzun
  • çift
  • yüzmek / şamandıra
  • boolean
  • ve bu türlerden her birinin numaralandırılabilirleri
Desteklenen vektör özelliği türleri
  • Sadece Okunabilir Bellek<float>
  • Float ekleme<>
  • float[]
Desteklenen dizin türleri Hnsw
Desteklenen uzaklık işlevleri
  • Cosine Benzerliği
  • Nokta Ürün Benzerliği
  • Öklid Mesafesi
  • ManhattanDistance
Desteklenen filtre yan tümceleri
  • AnyTagEqualTo
  • EqualTo
Bir kayıtta birden çok vektör destekler Evet (yapılandırılabilir)
Indexed destekleniyor mu? Evet
IsFullTextIndexed destekleniyor mu? Evet
StorageName destekleniyor mu? Evet
HybridSearch destekleniyor mu? Evet
Özellik Alanı Destek
Koleksiyon eşlemeleri Filtrelenebilir veri alanları için yük dizinlerine sahip Qdrant koleksiyonu
Desteklenen anahtar özellik türleri
  • ulong
  • GUID
Desteklenen veri özelliği türleri
  • Dize
  • Int
  • uzun
  • çift
  • yüzmek / şamandıra
  • boolean
  • ve bu türlerin her birinin yinelenebilirleri
Desteklenen vektör özelliği türleri
  • liste[float]
Desteklenen dizin türleri Hnsw
Desteklenen uzaklık işlevleri
  • Cosine Benzerliği
  • Nokta Ürün Benzerliği
  • Öklid Mesafesi
  • ManhattanDistance
Desteklenen filtre yan tümceleri
  • AnyTagEqualTo
  • EqualTo
Bir kayıtta birden çok vektör destekler Evet (yapılandırılabilir)
Filtrelenebilir mi destekleniyor? Evet
IsFullTextSearchable destekleniyor mu? Evet
StorageName destekleniyor mu? Evet

Desteklenmiyor

Şu anda desteklenmiyor.

Başlarken: İlk Adımlar

Projenize Qdrant Vektör Deposu bağlayıcısı NuGet paketini ekleyin.

dotnet add package Microsoft.SemanticKernel.Connectors.Qdrant --prerelease

Semantic Kernel tarafından sağlanan uzantı yöntemlerini kullanarak KernelBuilder bağımlılık enjeksiyonu kapsayıcısına veya IServiceCollection üzerinde kullanılabilen bağımlılık enjeksiyonu kapsayıcısına vektör deposunu ekleyebilirsiniz.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;

// Using Kernel Builder.
var kernelBuilder = Kernel
    .CreateBuilder();
kernelBuilder.Services
    .AddQdrantVectorStore("localhost");
using Microsoft.Extensions.DependencyInjection;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddQdrantVectorStore("localhost");

Parametre almayan uzantı yöntemleri de sağlanır. Bunlar, sınıfın bir örneğinin Qdrant.Client.QdrantClient bağımlılık ekleme kapsayıcısına ayrı olarak kaydedilmesini gerektirir.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Qdrant.Client;

// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.Services.AddSingleton<QdrantClient>(sp => new QdrantClient("localhost"));
kernelBuilder.Services.AddQdrantVectorStore();
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Qdrant.Client;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<QdrantClient>(sp => new QdrantClient("localhost"));
builder.Services.AddQdrantVectorStore();

Doğrudan bir Qdrant Vektör Deposu örneği oluşturabilirsiniz.

using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;

var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);

Adlandırılmış bir koleksiyona doğrudan başvuru oluşturmak mümkündür.

using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;

var collection = new QdrantCollection<ulong, Hotel>(
    new QdrantClient("localhost"),
    "skhotels",
    ownsClient: true);

Veri eşleme

Qdrant bağlayıcısı, veri modelinden depolamaya veri eşlerken varsayılan bir eşleyici sağlar. Qdrant özelliklerin kimlik, veri yükü ve vektör gruplandırmalarına eşlenmesi gerekir. Varsayılan eşleyici, her özelliğin türünü belirlemek ve bu eşlemeyi yapmak için model ek açıklamalarını veya kayıt tanımını kullanır.

  • Anahtar olarak işaretlenen veri modeli özelliği, Qdrant noktası kimliğiyle eşlenir.
  • Veri olarak ek açıklanan veri modeli özellikleri, Qdrant noktası yük nesnesine eşlenecektir.
  • Vektör olarak belirtilen veri modeli özellikleri Qdrant vektör nesnesine eşlenir.

Özellik adı geçersiz kılma

Veri özellikleri ve vektör özellikleri için (adlandırılmış vektörler modu kullanılıyorsa), veri modelindeki özellik adlarından farklı depolama alanında kullanmak üzere geçersiz kılma alanı adları sağlayabilirsiniz. Qdrant'ta bir anahtarın sabit bir adı olduğu için bu, anahtarlar için desteklenmez. Vektör sabit bir ad altında depolandığından, tek bir adlandırılmamış vektör modundaki vektörler için de desteklenmez.

Özellik adı geçersiz kılma işlemi, StorageName seçeneği veri modeli öznitelikleri veya kayıt tanımı aracılığıyla ayarlanarak yapılır.

Öznitelikleri ve Qdrant'ta nasıl gösterileceğine ilişkin bir veri modeli StorageName örneği aşağıda verilmiştir.

using Microsoft.Extensions.VectorData;

public class Hotel
{
    [VectorStoreKey]
    public ulong HotelId { get; set; }

    [VectorStoreData(IsIndexed = true, StorageName = "hotel_name")]
    public string HotelName { get; set; }

    [VectorStoreData(IsFullTextIndexed = true, StorageName = "hotel_description")]
    public string Description { get; set; }

    [VectorStoreVector(4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw, StorageName = "hotel_description_embedding")]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
{
    "id": 1,
    "payload": { "hotel_name": "Hotel Happy", "hotel_description": "A place where everyone can be happy." },
    "vector": {
        "hotel_description_embedding": [0.9, 0.1, 0.1, 0.1],
    }
}

Başlarken: İlk Adımlar

Qdrant eklentilerini, qdrant istemcisi dahil olmak üzere, içeren semantik çekirdeği yükleyin.

pip install semantic-kernel[qdrant]

Daha sonra sınıfını QdrantStore kullanarak bir vektör deposu örneği oluşturabilirsiniz; bu, , QDRANT_URLQDRANT_API_KEY, , QDRANT_HOSTQDRANT_PORTve ortam değişkenlerini QDRANT_GRPC_PORTQDRANT_PATHQDRANT_LOCATIONkullanarak bir AsyncQdrantClient oluşturur ve QDRANT_PREFER_GRPS Qdrant örneğine bağlanmak için bu değerler doğrudan da sağlanabilir. Hiçbir şey sağlanmazsa, location=:memory: varsayılan değerine geri döner.


from semantic_kernel.connectors.qdrant import QdrantStore

vector_store = QdrantStore()

Ayrıca kendi qdrant istemci örneğinizle vektör deposu da oluşturabilirsiniz.

from qdrant_client.async_qdrant_client import AsyncQdrantClient
from semantic_kernel.connectors.qdrant import QdrantStore

client = AsyncQdrantClient(host='localhost', port=6333)
vector_store = QdrantStore(client=client)

Doğrudan bir koleksiyon da oluşturabilirsiniz.

from semantic_kernel.connectors.qdrant import QdrantCollection

collection = QdrantCollection(collection_name="skhotels", record_type=hotel)

Serileştirme

Qdrant bağlayıcısı, mağazayı okumak ve yazmak için PointStruct adlı bir model kullanır. Bu, from qdrant_client.models import PointStruct uygulamasından aktarılabilir. Serileştirme yöntemleri, PointStruct nesnelerinin listesinin çıkışını bekler ve seri durumdan çıkarma yöntemi PointStruct nesnelerinin listesini alır.

Bunun adlandırılmış veya adlandırılmamış vektörlerle ilgili bazı özel noktaları vardır, aşağıya bakın.

Bu kavram hakkında daha fazla ayrıntı için serileştirme belgelerine bakın.

Qdrant vektör modları

Qdrant vektör depolama için iki modu destekler ve varsayılan eşleyici ile Qdrant Bağlayıcısı her iki modu da destekler. Varsayılan mod, tek bir adlandırılmamış vektördür.

Tek bir adlandırılmamış vektör

Bu seçenekle bir koleksiyon yalnızca tek bir vektör içerebilir ve Qdrant'taki depolama modelinde adlandırılmamış olur. Tek bir adlandırılmamış vektör modu kullanılırken bir nesnenin Qdrant'ta nasıl temsil edildiklerine bir örnek aşağıda verilmiştir:

new Hotel
{
    HotelId = 1,
    HotelName = "Hotel Happy",
    Description = "A place where everyone can be happy.",
    DescriptionEmbedding = new float[4] { 0.9f, 0.1f, 0.1f, 0.1f }
};
{
    "id": 1,
    "payload": { "HotelName": "Hotel Happy", "Description": "A place where everyone can be happy." },
    "vector": [0.9, 0.1, 0.1, 0.1]
}

Qdrant vektör modları

Qdrant vektör depolama için iki modu destekler ve varsayılan eşleyici ile Qdrant Bağlayıcısı her iki modu da destekler. Varsayılan mod, tek bir adlandırılmamış vektördür.

Tek bir adlandırılmamış vektör

Bu seçenekle bir koleksiyon yalnızca tek bir vektör içerebilir ve Qdrant'taki depolama modelinde adlandırılmamış olur. Tek bir adlandırılmamış vektör modu kullanılırken bir nesnenin Qdrant'ta nasıl temsil edildiklerine bir örnek aşağıda verilmiştir:

Hotel(
    hotel_id = 1,
    hotel_name = "Hotel Happy",
    description = "A place where everyone can be happy.",
    description_embedding = [0.9f, 0.1f, 0.1f, 0.1f],
)
from qdrant_client.models import PointStruct

PointStruct(
    id=1,
    payload={ "hotel_name": "Hotel Happy", "description": "A place where everyone can be happy." },
    vector=[0.9, 0.1, 0.1, 0.1],
)

Adlandırılmış vektörler

Adlandırılmış vektörler modunu kullanıyorsanız, bir koleksiyondaki her nokta birden fazla vektör içerebilir ve her biri adlandırılmış olur. Adlandırılmış vektörler modu kullanılırken bir nesnenin Qdrant'ta nasıl temsil edildiğinden bir örnek aşağıda verilmiştir :

new Hotel
{
    HotelId = 1,
    HotelName = "Hotel Happy",
    Description = "A place where everyone can be happy.",
    HotelNameEmbedding = new float[4] { 0.9f, 0.5f, 0.5f, 0.5f }
    DescriptionEmbedding = new float[4] { 0.9f, 0.1f, 0.1f, 0.1f }
};
{
    "id": 1,
    "payload": { "HotelName": "Hotel Happy", "Description": "A place where everyone can be happy." },
    "vector": {
        "HotelNameEmbedding": [0.9, 0.5, 0.5, 0.5],
        "DescriptionEmbedding": [0.9, 0.1, 0.1, 0.1],
    }
}

Adlandırılmış vektörler

Adlandırılmış vektörler modunu kullanıyorsanız, bir koleksiyondaki her nokta birden fazla vektör içerebilir ve her biri adlandırılmış olur. Adlandırılmış vektörler modu kullanılırken bir nesnenin Qdrant'ta nasıl temsil edildiğinden bir örnek aşağıda verilmiştir :

Hotel(
    hotel_id = 1,
    hotel_name = "Hotel Happy",
    description = "A place where everyone can be happy.",
    hotel_name_embedding = [0.9f, 0.5f, 0.5f, 0.5f],
    description_embedding = [0.9f, 0.1f, 0.1f, 0.1f],
)
from qdrant_client.models import PointStruct

PointStruct(
    id=1,
    payload={ "hotel_name": "Hotel Happy", "description": "A place where everyone can be happy." },
    vector={
        "hotel_name_embedding": [0.9, 0.5, 0.5, 0.5],
        "description_embedding": [0.9, 0.1, 0.1, 0.1],
    },
)

Adlandırılmış vektör modunu etkinleştirmek için bir Vektör Deposu veya koleksiyonu oluştururken bunu bir seçenek olarak geçirin. Sağlanan bağımlılık ekleme kapsayıcı uzantısı yöntemlerinden herhangi birine de aynı seçenekler geçirilebilir.

using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;

var vectorStore = new QdrantVectorStore(
    new QdrantClient("localhost"),
    ownsClient: true,
    new() { HasNamedVectors = true });

var collection = new QdrantCollection<ulong, Hotel>(
    new QdrantClient("localhost"),
    "skhotels",
    ownsClient: true,
    new() { HasNamedVectors = true });

Adlandırılmış vektör modunu etkinleştirmek için bir Vektör Deposu veya koleksiyonu oluştururken bunu bir seçenek olarak geçirin. Sağlanan bağımlılık ekleme kapsayıcı uzantısı yöntemlerinden herhangi birine de aynı seçenekler geçirilebilir.

Python'da için named_vectors varsayılan değer True'dur, ancak bunu aşağıda gösterildiği gibi devre dışı bırakabilirsiniz.

from semantic_kernel.connectors.memory.qdrant import QdrantCollection

collection = QdrantCollection(
    collection_name="skhotels", 
    record_type=Hotel, 
    named_vectors=False,
)