Freigeben über


Verwenden des SQLite Vector Store-Connectors (Vorschau)

Warnung

Die Funktionalität des semantischen Kernelvektorspeichers befindet sich in der Vorschau, und Verbesserungen, die fehlerhafte Änderungen erfordern, können unter begrenzten Umständen noch vor der Veröffentlichung auftreten.

Übersicht

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

Featurebereich Unterstützung
Auflistungszuordnungen SQLite-Tabelle
Unterstützte Schlüsseleigenschaftentypen
  • ulong
  • Zeichenfolge
Unterstützte Datentypen für Datentypen
  • int
  • long
  • ulong
  • short
  • ushort
  • Zeichenfolge
  • bool
  • float
  • double
  • Decimal
  • byte[]
Unterstützte Vektoreigenschaftentypen ReadOnlyMemory<float>
Unterstützte Indextypen N/V
Unterstützte Entfernungsfunktionen
  • CosineDistance
  • ManhattanDistance
  • EuklideanDistance
Unterstützt mehrere Vektoren in einem Datensatz Ja
IstFilterbar unterstützt? No
WirdFullTextSearchable unterstützt? No
StoragePropertyName wird unterstützt? Ja

Begrenzungen

SQLite unterstützt keine sofort einsatzbereite Vektorsuche. Die SQLite-Erweiterung sollte zuerst geladen werden, um die Vektorsuchfunktion zu aktivieren. Die aktuelle Implementierung des SQLite-Connectors ist mit der Sqlite-vec-Vektorsucherweiterung kompatibel.

Um die Erweiterung zu installieren, verwenden Sie eine der Versionen mit der spezifischen Erweiterungsversion Ihrer Wahl. Es ist möglich, eine vorab kompilierte Version mit dem install.sh Skript abzurufen. Dieses Skript erzeugt vec0.dll, die sich im selben Ordner wie die ausgeführte Anwendung befinden muss. Dadurch kann die Anwendung die SqliteConnection.LoadExtension("vec0") Methode aufrufen und die Vektorsucherweiterung laden.

Erste Schritte

Fügen Sie dem Projekt das NuGet-Paket des SQLite Vector Store-Connectors hinzu.

dotnet add package Microsoft.SemanticKernel.Connectors.Sqlite --prerelease

Sie können den Vektorspeicher dem Container zum Einfügen von Abhängigkeiten mithilfe von Erweiterungsmethoden hinzufügen, die IServiceCollection vom semantischen Kernel bereitgestellt werden.

In diesem Fall wird eine Instanz der Microsoft.Data.Sqlite.SqliteConnection Klasse initialisiert, die Verbindung wird geöffnet, und die Vektorsucherweiterung wird geladen. Der Standardname der Vektorsucherweiterung lautet vec0, kann jedoch mithilfe der SqliteVectorStoreOptions.VectorSearchExtensionName Eigenschaft überschrieben werden.

using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqliteVectorStore("Data Source=:memory:");

Erweiterungsmethoden, die keine Parameter verwenden, werden ebenfalls bereitgestellt. Dazu muss eine Instanz der Microsoft.Data.Sqlite.SqliteConnection Klasse separat beim Abhängigkeitseinfügungscontainer registriert werden.

In diesem Fall wird die Verbindung nur geöffnet, wenn sie noch nicht geöffnet wurde, und die Erweiterungsmethode geht davon aus, dass die Vektorsucherweiterung bereits für die registrierte Microsoft.Data.Sqlite.SqliteConnection Instanz geladen wurde.

using Microsoft.Data.Sqlite;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<SqliteConnection>(sp => 
{
    var connection = new SqliteConnection("Data Source=:memory:");

    connection.LoadExtension("vector-search-extension-name");

    return connection;
});

builder.Services.AddSqliteVectorStore();

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

using Microsoft.Data.Sqlite;
using Microsoft.SemanticKernel.Connectors.Sqlite;

var connection = new SqliteConnection("Data Source=:memory:");

connection.LoadExtension("vector-search-extension-name");

var vectorStore = new SqliteVectorStore(connection);

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

using Microsoft.Data.Sqlite;
using Microsoft.SemanticKernel.Connectors.Sqlite;

var connection = new SqliteConnection("Data Source=:memory:");

connection.LoadExtension("vector-search-extension-name");

var collection = new SqliteVectorStoreRecordCollection<Hotel>(connection, "skhotels");

Datenzuordnung

Der SQLite Vector Store-Connector stellt beim Zuordnen des Datenmodells zum Speicher eine Standardzuordnung bereit. Dieser Mapper führt eine direkte Konvertierung der Liste der Eigenschaften im Datenmodell in die Spalten in SQLite durch.

Es ist auch möglich, das Standardzuordnungsverhalten durch Bereitstellen eines benutzerdefinierten Mappers über die SqliteVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper Eigenschaft außer Kraft zu setzen.

Mit der Vektorsucherweiterung werden Vektoren in virtuellen Tabellen getrennt von Schlüssel- und Dateneigenschaften gespeichert. Standardmäßig verwendet die virtuelle Tabelle mit Vektoren denselben Namen wie die Tabelle mit Schlüssel- und Dateneigenschaften, aber mit einem vec_ Präfix. Wenn der Auflistungsname SqliteVectorStoreRecordCollection beispielsweise lautet skhotels, lautet vec_skhotelsder Name der virtuellen Tabelle mit Vektoren. Es ist möglich, den Namen der virtuellen Tabelle mithilfe der SqliteVectorStoreOptions.VectorVirtualTableName Eigenschaften SqliteVectorStoreRecordCollectionOptions<TRecord>.VectorVirtualTableName zu überschreiben.

Außerkraftsetzung des Eigenschaftsnamens

Sie können Eigenschaftsnamen außer Kraft setzen, die im Speicher verwendet werden sollen, die sich von den Eigenschaftennamen im Datenmodell unterscheiden. Die Außerkraftsetzung des Eigenschaftennamens erfolgt durch Festlegen der StoragePropertyName Option über die Eigenschaftenattribute des Datenmodells oder die Datensatzdefinition.

Nachfolgend finden Sie ein Beispiel für ein Datenmodell, das StoragePropertyName für seine Attribute festgelegt ist und wie das in der SQLite-Abfrage dargestellt wird.

using Microsoft.Extensions.VectorData;

public class Hotel
{
    [VectorStoreRecordKey]
    public ulong HotelId { get; set; }

    [VectorStoreRecordData(StoragePropertyName = "hotel_name")]
    public string? HotelName { get; set; }

    [VectorStoreRecordData(StoragePropertyName = "hotel_description")]
    public string? Description { get; set; }

    [VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineDistance)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
CREATE TABLE Hotels (
    HotelId INTEGER PRIMARY KEY,
    hotel_name TEXT,
    hotel_description TEXT
);

CREATE VIRTUAL TABLE vec_Hotels (
    HotelId INTEGER PRIMARY KEY,
    DescriptionEmbedding FLOAT[4] distance_metric=cosine
);

In Kürze verfügbar

Weitere Informationen werden in Kürze verfügbar sein.

In Kürze verfügbar

Weitere Informationen werden in Kürze verfügbar sein.