Dela via


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
  • ReadOnlyMemory<flyttal>
  • IEnumerable<float>
Indextyper som stöds
  • HNSW (32, 8 eller 4 bitar)
  • FLAT (32, 8 eller 4 bitar)
Avståndsfunktioner som stöds
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
  • MaxInnerProduct
Filtersatser som stöds
  • AnyTagEqualTo
  • EqualTo
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.