Freigeben über


Verwenden des Elasticsearch-Connectors (Vorschau)

Warnung

Die Funktionalität des „Semantic Kernel“ Vektorspeichers befindet sich in der Vorschau, und Verbesserungen, die störende Änderungen erfordern, können unter bestimmten Umständen weiterhin vor der Veröffentlichung auftreten.

Überblick

Der Elasticsearch Vector Store-Connector kann verwendet werden, um auf Daten in Elasticsearch zuzugreifen und sie zu verwalten. Der Verbinder weist die folgenden Merkmale auf.

Funktionsbereich Unterstützung
Zuordnung der Sammlung zu Elasticsearch-Index
Unterstützte Schlüssel-Eigenschaftentypen
  • string
  • long
  • Guid
Unterstützte Dateneigenschaftstypen Alle Typen, die von System.Text.Json (integriert oder mithilfe eines benutzerdefinierten Konverters) unterstützt werden
Unterstützte Typen von Vektoreigenschaften
  • ReadOnlyMemory<float>
  • IEnumerable<float>
  • IReadOnlyCollection<float>
  • ICollection<float>
  • IReadOnlyList<float>
  • IList<float>
  • float[]
Unterstützte Indextypen
  • HNSW (32, 8 oder 4 Bit oder BBQ)
  • FLACH (32, 8 oder 4 Bit oder BBQ)
Unterstützte Entfernungsfunktionen
  • KosinusSimilarität
  • Punktprodukt-Ähnlichkeit
  • EuklideanDistance
  • MaxInnerProduct
Unterstützte Filterklauseln
  • AnyTagEqualTo
  • EqualTo
Unterstützt mehrere Vektoren in einem Datensatz Ja
Wird Indized unterstützt? Ja
WirdFullTextIndexed unterstützt? Ja
Wird StoragePropertyName unterstützt? Nein, verwenden Sie stattdessen JsonSerializerOptions und JsonPropertyNameAttribute. Weitere Informationen finden Sie hier.
HybridSearch wird unterstützt? Ja

Erste Schritte

Führen Sie Elasticsearch lokal aus für die lokale Entwicklung oder Tests, indem Sie das start-local Skript mit einem Befehl ausführen.

curl -fsSL https://elastic.co/start-local | sh

Fügen Sie ihrem Projekt das NuGet-Paket des Elasticsearch Vector Store-Connectors hinzu.

dotnet add package Elastic.SemanticKernel.Connectors.Elasticsearch --prerelease

Sie können den Vektorspeicher dem auf dem KernelBuilder verfügbaren Abhängigkeitsinjektionscontainer hinzufügen oder dem IServiceCollection Abhängigkeitsinjektionscontainer mithilfe von vom semantischen Kernel bereitgestellten Erweiterungsmethoden hinzufügen.

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")));

Erweiterungsmethoden, die keine Parameter verwenden, werden ebenfalls bereitgestellt. Dies erfordert, dass eine Instanz der Elastic.Clients.Elasticsearch.ElasticsearchClient-Klasse separat beim Container zum Einfügen von Abhängigkeiten registriert wird.

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

Sie können eine Elasticsearch Vector Store-Instanz direkt erstellen.

using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;

var vectorStore = new ElasticsearchVectorStore(
    new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))));

Es ist möglich, einen direkten Verweis auf eine benannte Auflistung zu erstellen.

using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;

var collection = new ElasticsearchVectorStoreRecordCollection<Hotel>(
    new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))),
    "skhotels");

Datenzuordnung

Der Elasticsearch-Connector verwendet System.Text.Json.JsonSerializer für die Zuordnung. Da Elasticsearch Dokumente mit einem separaten Schlüssel/id und Wert speichert, serialisiert der Mapper alle Eigenschaften mit Ausnahme des Schlüssels zu einem JSON-Objekt und verwendet diese als Wert.

Die Verwendung des JsonPropertyNameAttribute wird unterstützt, wenn ein anderer Speichername für den Namen der Datenmodelleigenschaft erforderlich ist. Es ist auch möglich, eine benutzerdefinierte JsonSerializerOptions Instanz mit einer benutzerdefinierten Benennungsrichtlinie für Eigenschaften zu verwenden. Um dies zu aktivieren, muss ein benutzerdefinierter Quell serialisierer konfiguriert werden.

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");

Alternativ kann die DefaultFieldNameInferrer Lambda-Funktion so konfiguriert werden, dass dasselbe Ergebnis erzielt wird oder die Benennung von Eigenschaften basierend auf dynamischen Bedingungen noch weiter angepasst wird.

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");

Da die Benennungsrichtlinie SNAKE_CASE Upper gewählt wurde, folgt hier ein Beispiel dafür, wie dieser Datentyp in Elasticsearch festgelegt wird. Beachten Sie außerdem die Verwendung von JsonPropertyNameAttribute für die Description-Eigenschaft, um die Speicherbenennung weiter anzupassen.

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

Nicht unterstützt

Nicht unterstützt.

Nicht unterstützt

Nicht unterstützt.