다음을 통해 공유


벡터 데이터베이스

벡터 데이터베이스는 데이터 요소의 숫자 배열인 벡터 형식으로 데이터를 저장하고 관리합니다.

벡터를 사용하면 벡터 유사성 검색, 양자화 및 클러스터링과 같은 고급 기술을 사용하여 벡터를 비교하고 분석할 수 있으므로 복잡한 쿼리 및 분석을 수행할 수 있습니다. 기존 데이터베이스는 데이터 분석에서 점점 더 일반화되고 있는 고차원 데이터를 처리하는 데 적합하지 않습니다. 그러나 벡터 데이터베이스는 텍스트, 이미지 및 오디오와 같은 고차원 데이터를 벡터로 표현하여 처리하도록 디자인되었습니다. 벡터 데이터베이스는 기계 학습, 자연어 처리 및 이미지 인식과 같은 작업에 유용합니다. 여기서 목표는 대형 데이터 세트의 패턴 또는 유사성을 식별하는 것입니다.

이 문서에서는 벡터 데이터베이스에 대한 몇 가지 배경 정보를 제공하고 Microsoft Fabric의 실시간 인텔리전스에서 Eventhouse를 벡터 데이터베이스로 사용하는 방법을 개념에 기반하여 설명합니다. 실제 예제는 자습서: Eventhouse를 벡터 데이터베이스로 사용을 참조하세요.

주요 개념

벡터 데이터베이스에서 사용되는 주요 개념은 다음과 같습니다.

벡터 유사성

벡터 유사성은 두 개 이상의 벡터가 얼마나 다른지(또는 유사한지) 측정한 값입니다. 벡터 유사성 검색은 데이터 세트에서 유사한 벡터를 찾는 데 사용되는 기술입니다. 벡터는 유클리드 거리 또는 코사인 유사성과 같은 거리 메트릭을 사용하여 비교됩니다. 두 벡터가 가까울수록 더 유사합니다.

포함(Embeddings)

임베딩은 벡터 데이터베이스에서 사용하기 위해 벡터 형식으로 데이터를 나타내는 일반적인 방법입니다. 임베딩은 의미 체계의 의미를 캡처하도록 설계된 단어, 텍스트 문서 또는 이미지와 같은 일부 데이터의 수학적 표현입니다. 임베딩은 데이터를 분석하고 주요 기능을 나타내는 숫자 값 세트를 생성하는 알고리즘을 사용하여 생성됩니다. 예를 들어 단어의 임베딩은 의미, 컨텍스트 및 다른 단어와의 관계를 나타낼 수 있습니다. 임베딩을 만드는 프로세스는 간단합니다. 표준 Python 패키지(예: spaCy, sent2vec, Gensim)를 사용하여 만들 수 있지만, LLM(대형 언어 모델)은 의미 체계 텍스트 검색을 위해 최고 품질의 임베딩을 생성합니다. 예를 들어 Azure OpenAI의 임베딩 모델에 텍스트를 보낼 수 있으며, 여기에서 분석을 위해 저장할 수 있는 벡터 표현을 생성합니다. 자세한 내용은 Azure OpenAI Service의 임베딩 이해를 참조하세요.

일반 워크플로

벡터로 저장된 텍스트를 포함, 저장 및 쿼리하는 방법의 도식.

벡터 데이터베이스를 사용하는 일반적인 워크플로는 다음과 같습니다.

  1. 데이터 임베딩: 임베딩 모델을 사용하여 데이터를 벡터 형식으로 변환합니다. 예를 들어 OpenAI 모델을 사용하여 텍스트 데이터를 임베딩할 수 있습니다.
  2. 벡터 저장: 임베딩된 벡터를 벡터 데이터베이스에 저장합니다. 임베딩된 데이터를 Eventhouse로 보내 벡터를 저장하고 관리할 수 있습니다.
  3. 쿼리 임베딩: 저장된 데이터를 임베딩하는 데 사용되는 것과 동일한 임베딩 모델을 사용하여 쿼리 데이터를 벡터 형식으로 변환합니다.
  4. 벡터 쿼리: 벡터 유사성 검색을 사용하여 데이터베이스에서 쿼리와 유사한 항목을 찾습니다.

Eventhouse를 벡터 데이터베이스로 사용

벡터 유사성 검색의 핵심은 벡터 데이터를 저장, 인덱싱 및 쿼리하는 기능입니다. Eventhouses는 특히 실시간 분석 및 탐색이 필요한 시나리오에서 대량의 데이터를 처리하고 분석하기 위한 솔루션을 제공하므로 벡터를 저장하고 검색하는 데 매우 적합합니다.

Eventhouse 벡터 데이터베이스를 사용하도록 설정하는 구성 요소는 다음과 같습니다.

  • 배열 및 속성 모음과 같은 비정형 데이터를 저장할 수 있는 동적 데이터 형식. 따라서 데이터 형식은 벡터 값을 저장하는 데 권장됩니다. 원본 개체와 관련된 메타데이터를 테이블에 별도의 열로 저장하여 벡터 값을 더 보강할 수 있습니다.
  • 기본 64비트 대신 Bfloat16을 사용하는 16비트 정밀도로 부동 소수점 숫자의 벡터를 저장하도록 디자인된 인코딩 형식 Vector16. 이 인코딩은 스토리지 요구 사항을 4배로 줄이고 크기 순으로 series_dot_product()series_cosine_similarity()와 같은 벡터 처리 함수를 가속화하기 때문에 ML 벡터 임베딩을 저장하는 데 권장됩니다.
  • Eventhouse에 저장된 벡터 위에서 벡터 유사성 검색을 수행할 수 있는 series_cosine_similarity 함수.

규모에 최적화

벡터 유사성 검색 최적화에 대한 자세한 내용은 블로그를 참조하세요.

성능 및 결과 검색 시간을 최대화하려면 다음 단계를 수행합니다.

  1. 임베딩 열의 인코딩을 기본 64비트 대신 벡터 계수의 16비트 인코딩인 Vector16으로 설정합니다.
  2. 다음 단계에 따라 수행되는 프로세서당 하나 이상의 분할을 포함하는 모든 클러스터 노드에서 임베딩 벡터 테이블을 저장합니다.
    1. 분할 정책ShardEngineMaxRowCount를 변경하여 분할당 임베딩 벡터 수를 제한합니다. 분할 정책은 검색에서 사용 가능한 모든 프로세서를 사용할 수 있도록 노드당 여러 범위의 모든 노드에서 데이터 균형을 조정합니다.
    2. 병합 정책RowCountUpperBoundForMerge를 변경합니다. 병합 정책은 수집 후 병합 범위를 억제하는 데 필요합니다.

최적화 단계 예제

다음 예제에서는 1M 벡터를 저장하기 위해 정적 벡터 테이블이 정의됩니다. 임베딩 정책은 Vector16으로 정의되며 분할 및 병합 정책은 벡터 유사성 검색을 위해 테이블을 최적화하도록 설정됩니다. 이를 위해 클러스터에 각각 16개의 프로세서가 있는 20개의 노드가 있다고 가정합니다. 테이블의 분할은 최대 1,000,000/(20*16)=3,125행을 포함해야 합니다.

  1. 다음 KQL 명령은 빈 테이블을 만들고 필요한 정책 및 인코딩을 설정하기 위해 하나씩 실행됩니다.

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. 이전 단계에서 만들고 정의한 테이블로 데이터를 수집합니다.

다음 단계