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 |
|
Unterstützte Datentypen für Datentypen |
|
Unterstützte Vektoreigenschaftentypen | ReadOnlyMemory<float> |
Unterstützte Indextypen | N/V |
Unterstützte Entfernungsfunktionen |
|
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_skhotels
der 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.