De Elasticsearch-connector gebruiken (preview)
Waarschuwing
De functionaliteit van de Semantische Kernel Vector Store is in preview en verbeteringen waarvoor ingrijpende wijzigingen nodig zijn, kunnen in beperkte omstandigheden nog steeds optreden voordat ze worden gelanceerd.
Overzicht
De Elasticsearch Vector Store-connector kan worden gebruikt voor toegang tot en beheer van gegevens in Elasticsearch. De verbindingslijn heeft de volgende kenmerken.
Functiegebied | Ondersteuning |
---|---|
De verzameling wijst naar | Elasticsearch index |
Ondersteunde belangrijke eigenschapssoorten | koord |
Ondersteunde gegevenseigenschapstypen | Alle typen die worden ondersteund door System.Text.Json (ingebouwd of met behulp van een aangepast conversieprogramma) |
Ondersteunde vectoreigenschappentypen |
|
Ondersteunde indextypen |
|
Ondersteunde afstandsfuncties |
|
Ondersteunde filtercriteria |
|
Ondersteunt meerdere vectoren in een record | Ja |
Wordt Filterable ondersteund? | Ja |
WordtFullTextSearchable ondersteund? | Ja |
Wordt StoragePropertyName ondersteund? | Nee, gebruik in plaats daarvan JsonSerializerOptions en JsonPropertyNameAttribute .
Zie hier voor meer informatie. |
Aan de slag
Als u Elasticsearch lokaal wilt uitvoeren voor lokale ontwikkeling of testen, voert u het start-local
-script uit met één opdracht:
curl -fsSL https://elastic.co/start-local | sh
Voeg het NuGet-pakket Elasticsearch Vector Store-connector toe aan uw project.
dotnet add package Elastic.SemanticKernel.Connectors.Elasticsearch --prerelease
U kunt het vectorarchief toevoegen aan de container voor afhankelijkheidsinjectie die beschikbaar is op de KernelBuilder
of aan de IServiceCollection
afhankelijkheidsinjectiecontainer met behulp van extensiemethoden die worden geleverd door Semantische 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")));
Extensiemethoden waarvoor geen parameters worden gebruikt, worden ook opgegeven. Hiervoor moet een exemplaar van de Elastic.Clients.Elasticsearch.ElasticsearchClient
-klasse afzonderlijk worden geregistreerd bij de container voor afhankelijkheidsinjectie.
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();
U kunt rechtstreeks een Elasticsearch Vector Store-exemplaar maken.
using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;
var vectorStore = new ElasticsearchVectorStore(
new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))));
Het is mogelijk om een directe verwijzing naar een benoemde verzameling te maken.
using Elastic.SemanticKernel.Connectors.Elasticsearch;
using Elastic.Clients.Elasticsearch;
var collection = new ElasticsearchVectorStoreRecordCollection<Hotel>(
new ElasticsearchClient(new ElasticsearchClientSettings(new Uri("http://localhost:9200"))),
"skhotels");
Datamapping
De Elasticsearch-connector gebruikt System.Text.Json.JsonSerializer
om toewijzingen uit te voeren.
Omdat Elasticsearch documenten met een afzonderlijke sleutel/id en waarde opslaat, serialiseert de mapper alle eigenschappen, met uitzondering van de sleutel naar een JSON-object en gebruikt deze als de waarde.
Het gebruik van de JsonPropertyNameAttribute
wordt ondersteund als een andere opslagnaam voor de naam van de gegevensmodeleigenschap is vereist. Het is ook mogelijk om een aangepast JsonSerializerOptions
exemplaar te gebruiken met een aangepast naamgevingsbeleid voor eigenschappen. Als u dit wilt inschakelen, moet een aangepaste bronserialisatie worden geconfigureerd.
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");
Als alternatief kan de DefaultFieldNameInferrer
lambda-functie worden geconfigureerd om hetzelfde resultaat te bereiken of om de naamgeving van eigenschappen verder aan te passen op basis van dynamische voorwaarden.
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");
Aangezien een naamgevingsbeleid van snake case upper is gekozen, is hier een voorbeeld van hoe dit gegevenstype wordt ingesteld in Elasticsearch.
Let ook op het gebruik van JsonPropertyNameAttribute
in de eigenschap Description
om de naamgeving van de opslag verder aan te passen.
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
]
}
}
Niet ondersteund
Niet ondersteund.
Niet ondersteund
Niet ondersteund.