Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ostrzeżenie
Funkcjonalność Semantic Kernel Vector Store jest dostępna w wersji zapoznawczej, a ulepszenia, które mogą wymagać wprowadzenia zmian powodujących niezgodność, mogą nadal wystąpić w ograniczonych okolicznościach przed wydaniem.
Ostrzeżenie
Funkcjonalność Semantic Kernel Vector Store jest dostępna w wersji zapoznawczej, a ulepszenia, które mogą wymagać wprowadzenia zmian powodujących niezgodność, mogą nadal wystąpić w ograniczonych okolicznościach przed wydaniem.
Łączniki Semantic Kernel dla magazynów wektorowych obsługują wiele sposobów generowania osadzeń.
Embeddingi mogą być generowane przez dewelopera i przekazywane jako część rekordu w przypadku użycia VectorStoreCollection
lub mogą być generowane wewnętrznie w ramach VectorStoreCollection
.
Zezwalanie na generowanie osadzonych wektorów w magazynie wektorów
Można skonfigurować generator osadzeń w sklepie wektorów, umożliwiając automatyczne generowanie osadzeń podczas operacji upsert i wyszukiwania, co eliminuje potrzebę ręcznego przetwarzania wstępnego.
Aby włączyć automatyczne generowanie wektorów podczas operacji upsert, właściwość wektora w modelu danych jest określana jako typ źródła, np. ciąg, ale nadal oznaczona elementem VectorStoreVectorPropertyAttribute
.
[VectorStoreVector(1536)]
public string Embedding { get; set; }
Przed operacją upsert właściwość Embedding
powinna zawierać ciąg znaków, z którego zostanie wygenerowany wektor. Typ wektora przechowywanego w bazie danych (np. float32, float16 itp.) będzie pochodzić ze skonfigurowanego generatora osadzania.
Ważne
Te właściwości wektorów nie obsługują pobierania wygenerowanego wektora lub oryginalnego tekstu wygenerowanego na podstawie wektora. Nie przechowują również oryginalnego tekstu. Jeśli oryginalny tekst musi być przechowywany, należy dodać do niego oddzielną właściwość Dane.
Generatory osadzania implementujące Microsoft.Extensions.AI
abstrakcje są obsługiwane i można je skonfigurować na różnych poziomach.
W magazynie wektorów: można ustawić domyślny generator osadzania dla całego magazynu wektorów. Ten generator będzie używany dla wszystkich kolekcji i właściwości, chyba że zostanie zastąpiony.
using Microsoft.Extensions.AI; using Microsoft.SemanticKernel.Connectors.Qdrant; using OpenAI; using Qdrant.Client; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var vectorStore = new QdrantVectorStore( new QdrantClient("localhost"), ownsClient: true, new QdrantVectorStoreOptions { EmbeddingGenerator = embeddingGenerator });
W kolekcji: można skonfigurować generator wstawiania dla określonej kolekcji, zastępując generator na poziomie magazynu.
using Microsoft.Extensions.AI; using Microsoft.SemanticKernel.Connectors.Qdrant; using OpenAI; using Qdrant.Client; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var collectionOptions = new QdrantCollectionOptions { EmbeddingGenerator = embeddingGenerator }; var collection = new QdrantCollection<ulong, MyRecord>( new QdrantClient("localhost"), "myCollection", ownsClient: true, collectionOptions);
W definicji rekordu: podczas programowego definiowania właściwości przy użyciu programu
VectorStoreCollectionDefinition
można określić generator osadzania dla wszystkich właściwości.using Microsoft.Extensions.AI; using Microsoft.Extensions.VectorData; using Microsoft.SemanticKernel.Connectors.Qdrant; using OpenAI; using Qdrant.Client; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var definition = new VectorStoreCollectionDefinition { EmbeddingGenerator = embeddingGenerator, Properties = new List<VectorStoreProperty> { new VectorStoreKeyProperty("Key", typeof(ulong)), new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536) } }; var collectionOptions = new QdrantCollectionOptions { Definition = definition }; var collection = new QdrantCollection<ulong, MyRecord>( new QdrantClient("localhost"), "myCollection", ownsClient: true, collectionOptions);
W definicji właściwości wektorowej: podczas programowego definiowania właściwości można ustawić generator osadzania bezpośrednio na właściwości.
using Microsoft.Extensions.AI; using Microsoft.Extensions.VectorData; using OpenAI; var embeddingGenerator = new OpenAIClient("your key") .GetEmbeddingClient("your chosen model") .AsIEmbeddingGenerator(); var vectorProperty = new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536) { EmbeddingGenerator = embeddingGenerator };
Przykładowe użycie
W poniższym przykładzie pokazano, jak używać generatora osadzania do automatycznego tworzenia wektorów zarówno podczas operacji dodawania i aktualizacji, jak i wyszukiwania. Takie podejście upraszcza przepływy pracy, eliminując konieczność ręcznego wstępnego osadzania.
// 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 => this.Text;
}
// Create an OpenAI embedding generator.
var embeddingGenerator = new OpenAIClient("your key")
.GetEmbeddingClient("your chosen model")
.AsIEmbeddingGenerator();
// Use the embedding generator with the vector store.
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = 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.
var 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.
var searchResult = collection.SearchAsync(
"What is my budget for 2024?",
top: 1);
// Output the matching result.
await foreach (var result in searchResult)
{
Console.WriteLine($"Key: {result.Record.Key}, Text: {result.Record.Text}");
}
Tworzenie embeddingów samodzielnie
Konstruowanie generatora osadzania
Zobacz Tworzenie osadzeń, aby zapoznać się z przykładami tworzenia instancji jądra semantycznego ITextEmbeddingGenerationService
.
Aby uzyskać informacje na temat tworzenia Microsoft.Extensions.AI
usług generowania osadzania, zobacz Microsoft.Extensions.AI.Abstractions.
Generowanie osadzonych operacji upsert za pomocą jądra semantycznego ITextEmbeddingGenerationService
public async Task GenerateEmbeddingsAndUpsertAsync(
ITextEmbeddingGenerationService textEmbeddingGenerationService,
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 textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);
// 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 = new[] { "luxury", "pool" }
});
}
Generowanie osadzania w wyszukiwaniu za pomocą jądra semantycznego ITextEmbeddingGenerationService
public async Task GenerateEmbeddingsAndSearchAsync(
ITextEmbeddingGenerationService textEmbeddingGenerationService,
VectorStoreCollection<ulong, Hotel> collection)
{
// Upsert a record.
string descriptionText = "Find me a hotel with happiness in mind.";
// Generate the embedding.
ReadOnlyMemory<float> searchEmbedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);
// 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);
}
Napiwek
Aby uzyskać więcej informacji na temat generowania wektorów osadzeń, zobacz Generowanie osadzeń w jądrze semantycznym.
Wymiary osadzania
Bazy danych wektorów zwykle wymagają określenia liczby wymiarów, które ma każdy wektor podczas tworzenia kolekcji.
Różne modele osadzania zwykle obsługują generowanie wektorów o różnych rozmiarach wymiarów. Na przykład interfejs OpenAI text-embedding-ada-002
generuje wektory o wymiarach 1536. Niektóre modele umożliwiają deweloperowi wybranie liczby wymiarów, które chcą w wektorze wyjściowym. Na przykład firma Google text-embedding-004
domyślnie tworzy wektory o wymiarach 768, ale umożliwia deweloperowi wybranie dowolnej liczby wymiarów z zakresu od 1 do 768.
Należy upewnić się, że wektory generowane przez model osadzania mają taką samą liczbę wymiarów jak wektor pasujący w bazie danych.
W przypadku tworzenia kolekcji przy użyciu abstrakcji semantycznego magazynu wektorów rdzenia, należy określić liczbę wymiarów wymaganą dla każdej właściwości wektora, korzystając z adnotacji lub definicji rekordu. Poniżej przedstawiono przykłady dwóch różnych sposobów ustawienia wymiarów na 1536.
[VectorStoreVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreVectorProperty("DescriptionEmbedding", typeof(float), dimensions: 1536);
Napiwek
Aby uzyskać więcej informacji na temat dodawania adnotacji do modelu danych, zobacz Definiowanie modelu danych.
Napiwek
Aby uzyskać więcej informacji na temat tworzenia definicji rekordu, zapoznaj się z definiowaniem schematu przy użyciu definicji rekordu.
Wkrótce
Więcej informacji wkrótce.
Wkrótce
Więcej informacji wkrótce.