Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Anbieter von Vektorspeichern unterstützen mehrere Möglichkeiten zur Erstellung von Embeddings. Sie können diese selbst generieren und als Teil eines Datensatzes übergeben, wenn Sie ein VectorStoreCollection<TKey,TRecord> verwenden. Oder sie können intern im VectorStoreCollection<TKey,TRecord> generiert werden.
Erstellen Sie Einbettungen selbst
Der direkteste Ansatz besteht darin, Einbettungen zu generieren, bevor UpsertAsync oder SearchAsync aufgerufen wird, und sie dann zusammen mit Ihren Datensätzen oder Suchanfragen zu übergeben.
Erstellen eines Einbettungsgenerators
Informationen zum Erstellen Microsoft.Extensions.AI von Einbettungsgeneratoren finden Sie unter Embeddings in .NET.
Generieren von Einbettungen auf upsert mit IEmbeddingGenerator
async Task GenerateEmbeddingsAndUpsertAsync(
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator,
VectorStoreCollection<ulong, Hotel> collection)
{
// Upsert a record.
string descriptionText = "A place where everyone can be happy.";
ulong hotelId = 1;
// Generate the embedding.
ReadOnlyMemory<float> embedding =
(await embeddingGenerator.GenerateAsync(descriptionText)).Vector;
// Create a record and upsert with the already generated embedding.
await collection.UpsertAsync(new Hotel
{
HotelId = hotelId,
HotelName = "Hotel Happy",
Description = descriptionText,
DescriptionEmbedding = embedding,
Tags = ["luxury", "pool"]
});
}
Erstellen von Einbettungen für die Suche mit IEmbeddingGenerator
async Task GenerateEmbeddingsAndSearchAsync(
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator,
VectorStoreCollection<ulong, Hotel> collection)
{
// Upsert a record.
string descriptionText = "Find me a hotel with happiness in mind.";
// Generate the embedding.
ReadOnlyMemory<float> searchEmbedding =
(await embeddingGenerator.GenerateAsync(descriptionText)).Vector;
// Search using the already generated embedding.
IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult = collection.SearchAsync(searchEmbedding, top: 1);
List<VectorSearchResult<Hotel>> resultItems = await searchResult.ToListAsync();
// Print the first search result.
Console.WriteLine("Score for first result: " + resultItems.FirstOrDefault()?.Score);
Console.WriteLine("Hotel description for first result: " + resultItems.FirstOrDefault()?.Record.Description);
}
Zulassen, dass der Vektorspeicher Einbettungen generiert
Sie können einen Einbettungsgenerator in Ihren Vektorspeicher konfigurieren, wodurch Einbettungen während upsert- und Suchvorgängen automatisch generiert werden können. Bei diesem Ansatz wird die Notwendigkeit der manuellen Vorverarbeitung beseitigt.
Um das automatische Generieren von Vektoren beim Upsert zu aktivieren, wird die Vektoreigenschaft in Ihrem Datenmodell als Quelltyp definiert, string, ist jedoch weiterhin mit einem VectorStoreVectorAttribute.
[VectorStoreVector(1536)]
public required string Embedding { get; set; }
Vor dem Upsert sollte die Embedding Eigenschaft die Zeichenfolge enthalten, aus der ein Vektor generiert werden soll. Der Typ des in der Datenbank gespeicherten Vektors (z. B. float32 oder float16) wird vom konfigurierten Einbettungsgenerator ermittelt.
Von Bedeutung
Diese Vektoreigenschaften unterstützen nicht das Abrufen des generierten Vektors oder des ursprünglichen Texts, aus dem der Vektor generiert wurde. Sie speichern auch nicht den ursprünglichen Text. Wenn der ursprüngliche Text gespeichert werden muss, fügen Sie eine separate Dateneigenschaft hinzu, um ihn zu speichern.
Einbettungsgeneratoren, die die Microsoft.Extensions.AI Abstraktionen implementieren, werden unterstützt und können auf verschiedenen Ebenen konfiguriert werden:
Im Vektorspeicher:
Sie können einen Standardeinbettungsgenerator für den gesamten Vektorspeicher festlegen. Dieser Generator wird für alle Auflistungen und Eigenschaften verwendet, außer wenn er überschrieben wird.
VectorStore vectorStore = new QdrantVectorStore( new QdrantClient("localhost"), ownsClient: true, new QdrantVectorStoreOptions { EmbeddingGenerator = embeddingGenerator });Über eine Sammlung:
Sie können einen Einbettungsgenerator für eine bestimmte Sammlung konfigurieren, um den Generator auf Speicherebene zu überschreiben.
var collectionOptions = new QdrantCollectionOptions { EmbeddingGenerator = embeddingGenerator }; var collection = new QdrantCollection<ulong, MyRecord>( new QdrantClient("localhost"), "myCollection", ownsClient: true, collectionOptions);In einer Datensatzdefinition:
Beim programmgesteuerten Definieren von VectorStoreCollectionDefinitionEigenschaften können Sie einen Einbettungsgenerator für alle Eigenschaften angeben.
var definition = new VectorStoreCollectionDefinition { EmbeddingGenerator = embeddingGenerator, Properties = [ new VectorStoreKeyProperty("Key", typeof(ulong)), new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536) ] }; collectionOptions = new QdrantCollectionOptions { Definition = definition }; collection = new QdrantCollection<ulong, MyRecord>( new QdrantClient("localhost"), "myCollection", ownsClient: true, collectionOptions);In einer Vektoreigenschaftsdefinition:
Beim programmgesteuerten Definieren von Eigenschaften können Sie einen Einbettungsgenerator direkt in die Eigenschaft festlegen.
VectorStoreVectorProperty vectorProperty = new( "DescriptionEmbedding", typeof(string), dimensions: 1536) { EmbeddingGenerator = embeddingGenerator };
Anwendungsbeispiel
Im folgenden Beispiel wird gezeigt, wie der Einbettungsgenerator verwendet wird, um Vektoren während Upsert- und Suchoperationen automatisch zu generieren. Dieser Ansatz vereinfacht Workflows, da keine manuellen Einbettungen vorkompiliert werden müssen.
// The data model.
internal class FinanceInfo
{
[VectorStoreKey]
public string Key { get; set; } = string.Empty;
[VectorStoreData]
public string Text { get; set; } = string.Empty;
// Note that the vector property is typed as a string, and
// its value is derived from the Text property. The string
// value will however be converted to a vector on upsert and
// stored in the database as a vector.
[VectorStoreVector(1536)]
public string Embedding => Text;
}
public static async Task RunAsync()
{
// Create an OpenAI embedding generator.
var embeddingGenerator = new OpenAIClient("your key")
.GetEmbeddingClient("your chosen model")
.AsIEmbeddingGenerator();
// Use the embedding generator with the vector store.
VectorStore vectorStore = new InMemoryVectorStore(new()
{ EmbeddingGenerator = embeddingGenerator }
);
InMemoryCollection<string, FinanceInfo> collection =
(InMemoryCollection<string, FinanceInfo>)vectorStore.GetCollection<string, FinanceInfo>("finances");
await collection.EnsureCollectionExistsAsync();
// Create some test data.
string[] budgetInfo =
[
"The budget for 2020 is EUR 100 000",
"The budget for 2021 is EUR 120 000",
"The budget for 2022 is EUR 150 000",
"The budget for 2023 is EUR 200 000",
"The budget for 2024 is EUR 364 000"
];
// Embeddings are generated automatically on upsert.
IEnumerable<FinanceInfo> records = budgetInfo.Select(
(input, index) => new FinanceInfo { Key = index.ToString(), Text = input }
);
await collection.UpsertAsync(records);
// Embeddings for the search is automatically generated on search.
IAsyncEnumerable<VectorSearchResult<FinanceInfo>> searchResult =
collection.SearchAsync("What is my budget for 2024?", top: 1);
// Output the matching result.
await foreach (VectorSearchResult<FinanceInfo> result in searchResult)
{
Console.WriteLine($"Key: {result.Record.Key}, Text: {result.Record.Text}");
}
}
Einbettungsdimensionen
Vektordatenbanken erfordern in der Regel, dass Sie die Anzahl der Dimensionen angeben, die jeder Vektor beim Erstellen der Auflistung hat. Verschiedene Einbettungsmodelle unterstützen in der Regel das Generieren von Vektoren mit verschiedenen Dimensiongrößen. Beispielsweise generiert OpenAI text-embedding-ada-002 Vektoren mit 1536 Dimensionen. Bei einigen Modellen können Sie auch die Gewünschte Anzahl von Dimensionen im Ausgabevektor auswählen. Google erzeugt zum Beispiel standardmäßig Vektoren mit 768 Dimensionen und ermöglicht es Ihnen, eine beliebige Anzahl von Dimensionen zwischen 1 und 768 auszuwählen.
Es ist wichtig sicherzustellen, dass die vom Einbettungsmodell generierten Vektoren dieselbe Anzahl von Dimensionen wie der übereinstimmende Vektor in der Datenbank aufweisen.
Wenn Sie eine Auflistung mithilfe der Vektorspeicherabstraktionen erstellen, müssen Sie die Anzahl der Dimensionen angeben, die für jede Vektoreigenschaft entweder über Anmerkungen oder über die Datensatzdefinition erforderlich sind. Der folgende Code zeigt Beispiele zum Festlegen der Anzahl der Dimensionen auf 1536 mithilfe beider Mechanismen.
[VectorStoreVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreVectorProperty(
"DescriptionEmbedding",
typeof(float),
dimensions: 1536);