.NET AI 앱용 벡터 데이터베이스

벡터 데이터베이스는 벡터 포함을 저장하고 관리합니다. 임베딩은 의미를 보존하는 데이터의 숫자 표현입니다. 단어, 문서, 이미지, 오디오 및 기타 유형의 데이터를 모두 벡터화할 수 있습니다. 포함을 사용하여 AI 모델이 입력의 의미를 이해하고 텍스트 요약, 상황별 관련 데이터 찾기 또는 텍스트 설명에서 이미지 만들기와 같은 비교 및 변환을 수행할 수 있도록 도울 수 있습니다.

예를 들어 다음 경우에서 벡터 데이터베이스를 사용할 수 있습니다.

  • 콘텐츠, 테마, 감정, 스타일을 기반으로 비슷한 이미지, 문서, 노래 식별.
  • 특성, 기능, 사용자 그룹을 기반으로 유사한 제품 식별.
  • 사용자 선호도를 기반으로 콘텐츠, 제품 또는 서비스 권장.
  • 다양한 선택 풀에서 복잡한 요구 사항을 충족할 수 있는 잠재적인 최상의 옵션 식별.
  • 주 패턴 또는 일반 패턴과 다른 데이터 이상 또는 사기 활동 식별.

벡터 데이터베이스는 속성 필드에서 정확히 일치하는 항목보다는 데이터 특성에 기반하여 유사한 항목을 찾는 벡터 검색 기능을 제공합니다. 벡터 검색은 Azure OpenAI 포함 모델 같은 AI 포함 모델을 사용하여 만든 데이터의 벡터 표현을 분석하여 작동합니다. 검색 프로세스는 데이터 벡터와 쿼리 벡터 사이의 거리를 측정합니다. 쿼리 벡터에 가장 가까운 데이터 벡터는 의미 체계적으로 가장 유사한 벡터입니다.

대부분의 최신 데이터베이스 제품은 기존 쿼리와 함께 벡터 검색을 지원합니다. Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL 및 기타 여러 주요 제품의 경우입니다. 또는 광범위한 전용 특수 벡터 데이터베이스 제품이 존재합니다. 이러한 제품은 벡터 검색을 수행하도록 고도로 최적화되어 있으며 일반적으로 벡터 검색 워크로드를 처리하기 위해 기존 데이터베이스와 함께 단독으로 설치됩니다.

.NET 및 OpenAI를 사용하는 벡터 검색 워크플로

벡터 데이터베이스 및 해당 검색 기능은 Azure OpenAI를 사용하는 RAG 패턴 워크플로에서 특히 유용합니다. 이 패턴을 사용하면 데이터에 대한 의미상 풍부한 추가 지식으로 AI 모델을 보강할 수 있습니다. 벡터 데이터베이스를 사용하는 일반적인 AI 워크플로에는 다음 단계가 포함됩니다.

  1. OpenAI 임베딩 모델을 사용하여 데이터를 위한 임베딩을 생성합니다.
  2. 벡터 데이터베이스 또는 검색 서비스에 포함을 저장하고 인덱싱합니다.
  3. 애플리케이션의 사용자 프롬프트를 임베딩으로 변환합니다.
  4. 데이터에서 벡터 검색을 실행하여 사용자 프롬프트 임베딩을 데이터베이스의 임베딩과 비교합니다.
  5. gpt-4o와 같은 언어 모델을 사용하여 벡터 검색 결과에서 사용자가 이해하기 쉬운 완료 결과를 조합합니다.

이 흐름의 실습 예제를 알고 싶다면, 벡터 검색을 사용하여 Azure에서 RAG로 OpenAI를 구현하는 .NET 앱 자습서를 참조하십시오.

RAG 패턴의 기타 이점은 다음과 같습니다.

  • AI 모델에서 사용자 프롬프트에 대해 상황에 맞는 정확한 응답을 생성합니다.
  • LLM 토큰 제한을 극복합니다. 데이터베이스 벡터 검색을 통해 많은 작업이 수행됩니다.
  • 업데이트되는 데이터의 미세 조정 비용을 줄입니다.

Microsoft. Extensions.VectorData 라이브러리

.NET 벡터 검색을 사용하려면 추가 라이브러리 또는 API 없이 일반 데이터베이스 드라이버 또는 SDK를 사용할 수 있습니다. 예를 들어 SQL Server 표준 .NET 드라이버인 SqlClient를 사용하는 경우 T-SQL에서 벡터 검색을 수행할 수 있습니다. 그러나 이러한 방식으로 벡터 검색에 액세스하는 것은 매우 낮은 수준이며 직렬화/역직렬화를 처리하는 데 상당한 의식이 필요하며 결과 코드는 데이터베이스 간에 이식할 수 없습니다.

또는 📦 Microsoft. Extensions.VectorData.Abstractions 패키지는 .NET 벡터 저장소와 상호 작용하기 위한 통합된 추상화 계층을 제공합니다. 이러한 추상화는 단일 API에 대해 간단하고 개략적인 코드를 작성하고 애플리케이션에 대한 최소한의 변경 내용으로 기본 벡터 저장소를 교체할 수 있게 해줍니다.

라이브러리는 다음과 같은 주요 기능을 제공합니다.

  • 원활한 .NET 형식 매핑: .NET 형식을 개체/관계형 매퍼와 유사하게 데이터베이스에 직접 매핑합니다.
  • 유니드 데이터 모델: .NET 특성을 사용하여 데이터 모델을 정의하고 지원되는 모든 벡터 저장소에서 사용합니다.
  • CRUD 작업: 벡터 저장소에서 레코드 만들기, 읽기, 업데이트 및 삭제
  • 벡터 및 하이브리드 검색: 벡터 검색을 사용하여 의미 체계 유사성을 사용하여 레코드를 쿼리하거나 하이브리드 검색을 위해 벡터와 텍스트 검색을 결합합니다.
  • 임베딩 생성 관리: 임베딩 생성기를 한 번 구성하면 라이브러리에서 생성을 자동으로 처리되도록 합니다.
  • 컬렉션 관리: 벡터 저장소에서 컬렉션(테이블 또는 인덱스)을 만들고 나열하고 삭제합니다.

Microsoft. Extensions.VectorData는 벡터 데이터베이스와 상호 작용해야 하는 더 높은 수준의 추가 계층을 위한 구성 요소이기도 합니다. 예를 들어 Microsoft. Extensions.DataIngestion.

Microsoft.Extensions.VectorData 및 Entity Framework Core

이미 Entity Framework Core 사용하여 데이터베이스에 액세스하는 경우 데이터베이스 공급자가 이미 벡터 검색을 지원하고 LINQ 쿼리를 사용하여 이러한 검색을 표현할 수 있습니다. Microsoft. Extensions.VectorData는 이러한 애플리케이션에서 반드시 필요한 것은 아닙니다. 그러나 대부분의 전용 벡터 데이터베이스는 EF Core에서 지원되지 않으며 Microsoft. Extensions.VectorData는 이러한 작업을 위한 좋은 환경을 제공할 수 있습니다. 또한, Microsoft.Extensions.DataIngestion과 같은 추가 계층을 사용할 때 동일한 애플리케이션에서 EF와 Microsoft.Extensions.VectorData를 동시에 사용할 수 있습니다.

주요 추상화

다음은 컬렉션을 만들고, 레코드를 upsert하고, 벡터 검색을 수행하는 최소 엔드투엔드 예제입니다.

using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;

// Configure an embedding generator to transform text to embeddings
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = ...;

// Create a vector store and get a collection with the embedding generator
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<int, Movie>("movies");
await collection.EnsureCollectionExistsAsync();

// Upsert some records
await collection.UpsertAsync(new Movie { Key = 1, Title = "The Lion King", Description = "An animated film about a young lion prince" });
await collection.UpsertAsync(new Movie { Key = 2, Title = "Inception", Description = "A thief who steals corporate secrets through dream-sharing technology" });
await collection.UpsertAsync(new Movie { Key = 3, Title = "Finding Nemo", Description = "A fish searches the ocean for his lost son" });

// Search for movies similar to the query text
await foreach (var result in collection.SearchAsync("animals in the wild", top: 2))
{
    Console.WriteLine($"{result.Record.Title} (score: {result.Score})");
}

// Define the data model
class Movie
{
    [VectorStoreKey]
    public int Key { get; set; }

    [VectorStoreData]
    public string Title { get; set; }

    [VectorStoreVector(Dimensions: 1536)]
    public string Description { get; set; }
}

벡터 저장소 공급자

Microsoft.Extensions.VectorData.Abstractions 패키지는 추상화 및 별도의 프로비더 패키지 특정 벡터 데이터베이스에 대한 구현을 제공합니다. 벡터 데이터베이스와 일치하는 공급자(예: Microsoft)를 선택합니다. SemanticKernel.Connectors.AzureAISearch.

메모

패키지 이름에 "SemanticKernel"이 포함되었음에도 불구하고 이러한 공급자는 의미 체계 커널 관련이 없으며 에이전트 프레임워크를 포함하여 .NET 어디에서나 사용할 수 있습니다.

모든 공급자는 동일한 VectorStoreVectorStoreCollection<TKey,TRecord> 상 클래스를 구현하므로 애플리케이션 논리를 변경하지 않고도 클래스 간에 전환할 수 있습니다.

팁 (조언)

초기 개발 및 프로토타이핑 중에는 메모리 내 공급자(Microsoft.SemanticKernel.Connectors.InMemory)를 사용하세요. 외부 서비스나 구성이 전혀 필요하지 않으며, 나중에 이를 프로덕션 공급자로 교체할 수 있습니다. 이 공급자와 프로덕션 데이터베이스 간에 중요한 차이점이 있을 수 있으므로 InMemory 공급자를 테스트에 사용하지 마세요. testcontainers를 사용하여 프로덕션 데이터베이스 시스템에 대한 테스트를 실행하는 것이 좋습니다.