경고
시맨틱 커널 벡터 스토어 기능은 현재 미리보기 상태이며, 출시 전에 제한된 상황에서 호환성을 깨는 변경이 필요한 개선이 있을 수 있습니다.
경고
시맨틱 커널 벡터 스토어 기능은 현재 미리보기 상태이며, 출시 전에 제한된 상황에서 호환성을 깨는 변경이 필요한 개선이 있을 수 있습니다.
의미 커널 벡터 저장소 커넥터는 임베딩을 생성하는 여러 가지 방법을 지원합니다.
임베딩은 개발자가 생성하여 VectorStoreCollection
사용 시 레코드 일부로 전달할 수 있거나, VectorStoreCollection
내부적으로 생성될 수 있습니다.
벡터 저장소에서 임베딩을 생성할 수 있도록 설정
벡터 저장소에 포함 생성기를 구성하여 upsert 및 검색 작업 중에 포함을 자동으로 생성할 수 있으므로 수동 전처리가 필요하지 않습니다.
upsert에서 벡터를 자동으로 생성할 수 있도록 데이터 모델의 벡터 속성은 원본 형식(예: 문자열)으로 정의되며, 여전히 VectorStoreVectorPropertyAttribute
로 표시됩니다.
[VectorStoreVector(1536)]
public string Embedding { get; set; }
upsert 전에 속성에는 Embedding
벡터가 생성되어야 하는 문자열이 포함되어야 합니다. 데이터베이스에 저장된 벡터의 형식(예: float32, float16 등)은 구성된 포함 생성기에서 파생됩니다.
중요합니다
이러한 벡터 속성은 생성된 벡터 또는 벡터가 생성된 원본 텍스트 검색을 지원하지 않습니다. 원본 텍스트도 저장하지 않습니다. 원본 텍스트를 저장해야 하는 경우 저장하려면 별도의 데이터 속성을 추가해야 합니다.
추상화를 구현하는 생성기 Microsoft.Extensions.AI
가 지원되며 다양한 수준에서 구성할 수 있습니다.
벡터 저장소: 전체 벡터 저장소에 대한 기본 포함 생성기를 설정할 수 있습니다. 이 생성기는 재정의되지 않는 한 모든 컬렉션 및 속성에 사용됩니다.
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 });
컬렉션에서: 저장소 수준 생성기를 재정의하여 특정 컬렉션에 대한 포함 생성기를 구성할 수 있습니다.
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);
레코드 정의: 프로그래밍 방식으로
VectorStoreCollectionDefinition
속성을 정의할 때 모든 속성에 대한 포함 생성기를 지정할 수 있습니다.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);
벡터 속성 정의: 프로그래밍 방식으로 속성을 정의할 때 속성에 직접 포함 생성기를 설정할 수 있습니다.
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 };
사용 예시
다음 예제에서는 포함 생성기를 사용하여 upsert 및 검색 작업 중에 벡터를 자동으로 생성하는 방법을 보여 줍니다. 이 방법은 포함을 수동으로 미리 계산할 필요가 없도록 하여 워크플로를 간소화합니다.
// 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}");
}
임베딩을 직접 생성하기
임베딩 생성기 구축
의미 체계 커널 인스턴스를 생성하는 방법의 예시는 ITextEmbeddingGenerationService
을 참조하세요.
임베딩 생성 서비스를 구축하는 방법에 대한 자세한 내용은 Microsoft.Extensions.AI.Abstractions를 참조하세요.
Semantic Kernel을 사용하여 upsert 시 임베딩 생성 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" }
});
}
검색 시 의미 체계 커널을 사용하여 임베딩 생성 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);
}
임베딩 차원
일반적으로 벡터 데이터베이스는 컬렉션을 만들 때 각 벡터에 있는 차원 수를 지정해야 합니다.
다양한 포함 모델은 일반적으로 다양한 차원 크기의 벡터 생성을 지원합니다. 예를 들어 OpenAI text-embedding-ada-002
는 1536차원의 벡터를 생성합니다. 또한 일부 모델을 사용하면 개발자가 출력 벡터에서 원하는 차원 수를 선택할 수 있습니다. 예를 들어 Google text-embedding-004
은 기본적으로 768차원의 벡터를 생성하지만 개발자는 1에서 768 사이의 차원 수를 선택할 수 있습니다.
포함 모델에서 생성된 벡터가 데이터베이스의 일치하는 벡터와 동일한 수의 차원을 가지도록 하는 것이 중요합니다.
의미 체계 커널 벡터 저장소 추상화를 사용하여 컬렉션을 만드는 경우 주석 또는 레코드 정의를 통해 각 벡터 속성에 필요한 차원 수를 지정해야 합니다. 다음은 차원 수를 1536으로 설정하는 예제입니다.
[VectorStoreVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreVectorProperty("DescriptionEmbedding", typeof(float), dimensions: 1536);
팁
데이터 모델에 주석을 추가하는 방법에 대한 자세한 내용은 데이터 모델 정의를 참조하세요.
팁
레코드 정의를 만드는 방법에 대한 자세한 내용은 레코드 정의로 스키마 정의를 참조하세요.
곧 출시됩니다
추가 정보는 곧 제공될 예정입니다.
곧 출시됩니다
추가 정보는 곧 제공될 예정입니다.