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 |
|
Dataegenskapstyper som stöds |
|
Egenskapstyper för vektorer som stöds | ReadOnlyMemory-flyttal<> |
Indextyper som stöds | Hnsw |
Avståndsfunktioner som stöds |
|
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_PATH
QDRANT_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,
)