벡터 데이터베이스

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

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

이 문서에서는 벡터 데이터베이스에 대한 배경 정보를 제공하고 Microsoft Fabric Real-Time Intelligence에서 Eventhouse를 벡터 데이터베이스로 사용하는 방법을 개념적으로 설명합니다. 실제 예제는 자습서: LLM 임베딩을 사용하여 Eventhouse를 벡터 데이터베이스로 사용자습서: SLM 임베딩을 사용하여 Eventhouse를 벡터 데이터베이스로 사용을 참조하세요.

주요 개념

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

벡터 유사성

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

임베딩(Embeddings)

임베딩은 벡터 데이터베이스에서 사용하기 위해 벡터 형식으로 데이터를 나타내는 일반적인 방법입니다. 임베딩은 단어, 텍스트 문서, 이미지와 같은 데이터의 한 항목을 수학적으로 표현한 것으로, 그 의미를 담아내는 표현 방식입니다. 알고리즘을 사용하여 데이터를 분석하고 주요 특징을 나타내는 숫자 값 집합을 생성하여 임베딩을 만듭니다. 예를 들어 단어의 임베딩은 의미, 컨텍스트 및 다른 단어와의 관계를 나타낼 수 있습니다. 임베딩은 벡터 데이터베이스에서 사용하기 위해 벡터 형식으로 데이터를 나타내는 일반적인 방법입니다. 임베딩은 단어, 텍스트 문서 또는 이미지와 같은 데이터의 한 항목을 수학적으로 표현한 것으로, 그 의미론적 의미를 포착합니다. 알고리즘을 사용하여 데이터를 분석하고 주요 특징을 나타내는 숫자 값 집합을 생성하여 임베딩을 만듭니다. 예를 들어 단어의 임베딩은 의미, 컨텍스트 및 다른 단어와의 관계를 나타낼 수 있습니다. Eventhouse는 KQL에서 직접 임베딩을 생성하는 두 가지 방법을 지원합니다.

  • ai_embeddings 플러그 인: 외부 Azure OpenAI 엔드포인트를 호출하여 LLM(큰 언어 모델)을 사용하여 포함을 생성합니다. 이 메서드는 최고 품질의 포함을 생성하며 프로덕션 의미 체계 검색 워크로드에 가장 적합합니다.

  • slm_embeddings_fl(): Kusto Python 샌드박스 내에서 로컬로 SLLM(작은 언어 모델)을 실행하여 외부 엔드포인트 없이 포함을 생성합니다. 이 메서드는 Azure OpenAI 리소스가 필요하지 않으며 포함당 비용이 발생하지 않습니다.

Azure OpenAI의 임베딩에 대한 자세한 내용은 Azure OpenAI Service의 임베딩 이해를 참조하세요.

임베딩 방법 선택

다음 표를 사용하여 시나리오에 가장 적합한 방법을 선택합니다.

고려 사항 ai_embeddings 플러그인(LLM) slm_embeddings_fl()(SLM)
모델 품질 최고 품질; 는 다음과 같은 Azure OpenAI 모델을 사용합니다.text-embedding-3-large 우수한 품질; harrier-v1-270m, jina-v2-small, e5-small-v2와 같은 오픈소스 SLM 사용
외부 종속성 배포된 포함 모델이 있는 Azure OpenAI 리소스 필요 없음; 모델은 Python 샌드박스에서 로컬로 실행됩니다.
비용 Azure OpenAI 사용량에 따른 요청별 가격 책정 포함당 비용 없음
Throughput Azure OpenAI 속도 제한에 따라 일괄 처리 및 재시도 논리가 필요합니다. 클러스터 컴퓨팅 리소스에 의해서만 제한됩니다. 클러스터 크기로 자연스럽게 확장
설치 Azure OpenAI 배포, 콜아웃 정책 구성 및 ID 설정이 필요합니다. Python 플러그 인을 사용하도록 설정하고 SLM 아티팩트를 lakehouse에 업로드해야 합니다.
최대 컨텍스트 길이 배포된 모델에 따라 달라집니다(예: 8,192개의 text-embedding-3-large토큰). harrier-v1-270m 사용 시 최대 32,768토큰, jina-v2-small 사용 시 8,192토큰, and e5-small-v2 사용 시 512토큰
최적입니다 포함 품질이 최우선 순위인 프로덕션 의미 체계 검색 개인정보 보호에 민감한 워크플로우, 신속한 프로토타이핑, 대량 배치 임베딩 또는 Azure OpenAI에 액세스할 수 없는 시나리오

일반 워크플로

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

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

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

Eventhouse를 벡터 데이터베이스로

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

Eventhouse의 다음 구성 요소를 사용하여 벡터 데이터베이스로 사용할 수 있습니다.

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

규모에 최적화

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

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

  1. 임베딩 열의 인코딩을 기본 64비트 대신 벡터 계수의 16비트 인코딩인 Vector16으로 설정합니다.
  2. 프로세서당 최소 하나의 샤드가 있는 모든 클러스터 노드에 임베딩 벡터 테이블을 저장합니다. 이 목표를 수행하려면 다음 단계를 수행합니다.
    1. 분할 정책ShardEngineMaxRowCount를 변경하여 분할당 임베딩 벡터 수를 제한합니다. 이 설정은 더 빠른 검색을 위해 사용 가능한 모든 컴퓨팅 리소스에 데이터를 분산합니다.
    2. 병합 정책RowCountUpperBoundForMerge를 변경합니다. 병합 정책은 수집 후 병합 범위를 억제하는 데 필요합니다.

최적화 단계 예제

다음 예제에서는 1M 벡터를 저장하기 위한 정적 벡터 테이블을 정의합니다. 포함 정책을 Vector16으로 정의하고 분할 및 병합 정책을 설정하여 벡터 유사성 검색을 위해 테이블을 최적화합니다. 이 예제에서는 클러스터에 20개의 노드가 있고 각 노드에 16개의 프로세서가 있다고 가정합니다. 테이블의 샤드는 최대 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. 이전 단계에서 만들고 정의한 테이블로 데이터를 수집합니다.

다음 단계