Dela via


Använda Qdrant-anslutningsappen (förhandsversion)

Varning

Funktionen Semantic Kernel Vector Store är i förhandsversion, och förbättringar som kräver icke-bakåtkompatibla ändringar kan fortfarande ske under begränsade omständigheter före lanseringen.

Översikt

Qdrant Vector Store-anslutningsappen kan användas för att komma åt och hantera data i Qdrant. Anslutningsappen har följande egenskaper.

Funktionsområde Support
Samlingskartor till Qdrant-samling med nyttolastindex för filterbara datafält
Nyckelegenskapstyper som stöds
  • ulong
  • GUID
Dataegenskapstyper som stöds
  • sträng
  • heltal
  • lång
  • dubbel
  • flyttal
  • bool
  • och uppräkningar av var och en av dessa typer
Egenskapstyper för vektorer som stöds ReadOnlyMemory-flyttal<>
Indextyper som stöds Hnsw
Avståndsfunktioner som stöds
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
  • ManhattanDistance
Stöder flera vektorer i en post Ja (kan konfigureras)
Stöds IsFilterable? Ja
Stöds IsFullTextSearchable? Ja
Stöds StoragePropertyName? Ja

Komma igång

Lägg till NuGet-paketet för Qdrant Vector Store-anslutningsappen i projektet.

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

Du kan lägga till vektorlagret i den beroendeinmatningscontainer som är tillgänglig i containern KernelBuilder eller till containern för IServiceCollection beroendeinmatning med hjälp av tilläggsmetoder som tillhandahålls av semantisk kernel.

using Microsoft.SemanticKernel;

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

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

Tilläggsmetoder som inte har några parametrar tillhandahålls också. Dessa kräver att en instans av Qdrant.Client.QdrantClient klassen registreras separat med containern för beroendeinmatning.

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.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();

Du kan skapa en Qdrant Vector Store-instans direkt.

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

var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"));

Det går att skapa en direktreferens till en namngiven samling.

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

var collection = new QdrantVectorStoreRecordCollection<Hotel>(
    new QdrantClient("localhost"),
    "skhotels");

Mappning av data

Qdrant-anslutningsappen tillhandahåller en standardmappare när data mappas från datamodellen till lagringen. Qdrant kräver att egenskaper mappas till ID-, nyttolast- och vektorgrupper. Standardmapparen använder modellanteckningarna eller postdefinitionen för att fastställa typen av varje egenskap och för att utföra den här mappningen.

  • Datamodellegenskapen som kommenteras som en nyckel mappas till Qdrant-punkt-ID:t.
  • Datamodellegenskaperna som kommenteras som data mappas till Qdrant-punktnyttolastobjektet.
  • Datamodellegenskaperna som kommenteras som vektorer mappas till Qdrant-punktvektorobjektet.

Åsidosättning av egenskapsnamn

För dataegenskaper och vektoregenskaper (om du använder namngivet vektorläge) kan du ange åsidosättningsfältnamn som ska användas i lagring som skiljer sig från egenskapsnamnen i datamodellen. Detta stöds inte för nycklar eftersom en nyckel har ett fast namn i Qdrant. Det stöds inte heller för vektorer i ett enda namnlöst vektorläge , eftersom vektorn lagras under ett fast namn.

Åsidosättningen StoragePropertyName av egenskapsnamnet görs genom att alternativet anges via datamodellattributen eller postdefinitionen.

Här är ett exempel på en datamodell som StoragePropertyName har angetts för dess attribut och hur den ska representeras i Qdrant.

using Microsoft.Extensions.VectorData;

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

    [VectorStoreRecordData(IsFilterable = true, StoragePropertyName = "hotel_name")]
    public string HotelName { get; set; }

    [VectorStoreRecordData(IsFullTextSearchable = true, StoragePropertyName = "hotel_description")]
    public string Description { get; set; }

    [VectorStoreRecordVector(4, DistanceFunction.CosineDistance, IndexKind.Hnsw, StoragePropertyName = "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],
    }
}

Komma igång

Installera semantisk kernel med qdrant-extrafunktionerna, som innehåller qdrant-klienten.

pip install semantic-kernel[qdrant]

Du kan sedan skapa en vektorlagerinstans med hjälp av QdrantStore klassen. Då skapas en AsyncQdrantClient med hjälp av miljövariablerna QDRANT_URL, QDRANT_API_KEY, QDRANT_HOST, QDRANT_PORT, QDRANT_GRPC_PORT, och QDRANT_PATHQDRANT_LOCATION QDRANT_PREFER_GRPS för att ansluta till Qdrant-instansen kan dessa värden också anges direkt. Om inget anges faller det tillbaka till location=:memory:.


from semantic_kernel.connectors.memory.qdrant import QdrantStore

vector_store = QdrantStore()

Du kan också skapa vektorarkivet med din egen instans av qdrant-klienten.

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

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

Du kan också skapa en samling direkt.

from semantic_kernel.connectors.memory.qdrant import QdrantCollection

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

Serialisering

Qdrant-anslutningsappen använder en modell som kallas PointStruct för att läsa och skriva till arkivet. Detta kan importeras från from qdrant_client.models import PointStruct. Serialiseringsmetoderna förväntar sig utdata från en lista över PointStruct-objekt och deserialiseringsmetoden får en lista över PointStruct-objekt.

Det finns några särskilda överväganden för detta som har att göra med namngivna eller namnlösa vektorer, se nedan.

Mer information om det här konceptet finns i serialiseringsdokumentationen.

Qdrant-vektorlägen

Qdrant stöder två lägen för vektorlagring och Qdrant Connector med standardmappning stöder båda lägena. Standardläget är en enskild namnlös vektor.

Enskild namnlös vektor

Med det här alternativet får en samling bara innehålla en enda vektor och den kommer att vara namnlös i lagringsmodellen i Qdrant. Här är ett exempel på hur ett objekt representeras i Qdrant när ett enskilt namnlöst vektorläge används:

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]
}
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],
)

Namngivna vektorer

Om du använder det namngivna vektorläget innebär det att varje punkt i en samling kan innehålla mer än en vektor, och var och en kommer att namnges. Här är ett exempel på hur ett objekt representeras i Qdrant när ett namngivet vektorläge används:

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],
    }
}
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],
    },
)

Om du vill aktivera namngivet vektorläge skickar du detta som ett alternativ när du skapar ett vektorlager eller en samling. Samma alternativ kan också skickas till någon av de angivna metoderna för containertillägg för beroendeinmatning.

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

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

var collection = new QdrantVectorStoreRecordCollection<Hotel>(
    new QdrantClient("localhost"),
    "skhotels",
    new() { HasNamedVectors = true });

I Python är standardvärdet för named_vectors True, men du kan också inaktivera det här enligt nedan.

from semantic_kernel.connectors.memory.qdrant import QdrantCollection

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