Använda Elasticsearch-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.
Överblick
Elasticsearch Vector Store-anslutningsappen kan användas för att komma åt och hantera data i Elasticsearch. Anslutningsappen har följande egenskaper.
Funktionsområde | Stöd |
---|---|
Samlingskartor till | Elasticsearch-index |
Nyckelegenskapstyper som stöds | sträng |
Dataegenskapstyper som stöds | Alla typer som stöds av System.Text.Json (inbyggda eller med hjälp av en anpassad konverterare) |
Egenskapstyper för vektorer som stöds |
|
Indextyper som stöds |
|
Avståndsfunktioner som stöds |
|
Filtersatser som stöds |
|
Stödjer flera vektorer i en post | Ja |
Stöds IsFilterable? | Ja |
Stöds IsFullTextSearchable? | Ja |
Stöds StoragePropertyName? | Nej, använd JsonSerializerOptions och JsonPropertyNameAttribute i stället.
Mer information finns här. |
Komma igång
Om du vill köra Elasticsearch lokalt för lokal utveckling eller testning kör du start-local
skriptet med ett kommando:
curl -fsSL https://elastic.co/start-local | sh
Lägg till NuGet-paketet för Elasticsearch Vector Store-anslutningsappen i projektet.
dotnet add package Elastic.SemanticKernel.Connectors.Elasticsearch --prerelease
Du kan lägga till vektorbutiken till beroendeinjektionsbehållaren som är tillgänglig på KernelBuilder
eller till beroendeinjektionsbehållaren IServiceCollection
med hjälp av utvidgningsmetoder som tillhandahålls av Semantic Kernel.
using Microsoft.SemanticKernel;
using Elastic.Clients.Elasticsearch;
// Using Kernel Builder.
var kernelBuilder = Kernel
.CreateBuilder()
.AddElasticsearchVectorStore(new ElasticsearchClientSettings(new Uri("http://localhost:9200")));
using Microsoft.SemanticKernel;
using Elastic.Clients.Elasticsearch;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddElasticsearchVectorStore(new ElasticsearchClientSettings(new Uri("http://localhost:9200")));
Tilläggsmetoder som inte har några parametrar tillhandahålls också. Dessa kräver att en instans av klassen Elastic.Clients.Elasticsearch.ElasticsearchClient
registreras separat med containern för beroendeinmatning.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Elastic.Clients.Elasticsearch;
// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.Services.AddSingleton<ElasticsearchClient>(sp =>
new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))));
kernelBuilder.AddElasticsearchVectorStore();
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Elastic.Clients.Elasticsearch;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<ElasticsearchClient>(sp =>
new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))));
builder.Services.AddElasticsearchVectorStore();
Du kan skapa en Elasticsearch Vector Store-instans direkt.
using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;
var vectorStore = new ElasticsearchVectorStore(
new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))));
Det går att skapa en direktreferens till en namngiven samling.
using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;
var collection = new ElasticsearchVectorStoreRecordCollection<Hotel>(
new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))),
"skhotels");
Datakartläggning
Elasticsearch-anslutningsappen använder System.Text.Json.JsonSerializer
för att utföra mappning.
Eftersom Elasticsearch lagrar dokument med en separat nyckel/ID och ett värde serialiserar mapparen alla egenskaper förutom nyckeln till ett JSON-objekt och använder det som värde.
Användning av JsonPropertyNameAttribute
stöds om ett annat lagringsnamn än datamodellens egenskapsnamn krävs. Du kan också använda en anpassad JsonSerializerOptions
instans med en anpassad namngivningsprincip för egenskaper. Om du vill aktivera detta måste en anpassad källserialiserare konfigureras.
using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.Serialization;
using Elastic.Transport;
var nodePool = new SingleNodePool(new Uri("http://localhost:9200"));
var settings = new ElasticsearchClientSettings(
nodePool,
sourceSerializer: (defaultSerializer, settings) =>
new DefaultSourceSerializer(settings, options =>
options.PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseUpper));
var client = new ElasticsearchClient(settings);
var collection = new ElasticsearchVectorStoreRecordCollection<Hotel>(
client,
"skhotelsjson");
Alternativt kan funktionen DefaultFieldNameInferrer
lambda konfigureras för att uppnå samma resultat eller för att ytterligare anpassa egenskapsnamngivning baserat på dynamiska villkor.
using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;
var settings = new ElasticsearchClientSettings(new Uri("http://localhost:9200"));
settings.DefaultFieldNameInferrer(name => JsonNamingPolicy.SnakeCaseUpper.ConvertName(name));
var client = new ElasticsearchClient(settings);
var collection = new ElasticsearchVectorStoreRecordCollection<Hotel>(
client,
"skhotelsjson");
Eftersom en namngivningsprincip för snake_case med stora bokstäver valdes, är här ett exempel på hur denna datatyp kommer att anges i Elasticsearch.
Observera också användningen av JsonPropertyNameAttribute
på egenskapen Description
för att ytterligare anpassa lagringsnamngivningen.
using System.Text.Json.Serialization;
using Microsoft.Extensions.VectorData;
public class Hotel
{
[VectorStoreRecordKey]
public string HotelId { get; set; }
[VectorStoreRecordData(IsFilterable = true)]
public string HotelName { get; set; }
[JsonPropertyName("HOTEL_DESCRIPTION")]
[VectorStoreRecordData(IsFullTextSearchable = true)]
public string Description { get; set; }
[VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineSimilarity, IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
{
"_index" : "skhotelsjson",
"_id" : "h1",
"_source" : {
"HOTEL_NAME" : "Hotel Happy",
"HOTEL_DESCRIPTION" : "A place where everyone can be happy.",
"DESCRIPTION_EMBEDDING" : [
0.9,
0.1,
0.1,
0.1
]
}
}
Stöds inte
Stöds inte.
Stöds inte
Stöds inte.