EmbeddingList 검색 전략 선택

EmbeddingList 검색 전략은 Milvus가 EmbeddingList 검색을 위한 근사 후보 인덱스를 어떻게 구축할지 결정합니다. 기본 전략은 ' tokenann'입니다. 임베딩 리스트가 크거나, TokenANN의 계산 비용이 너무 높거나, 학습된/압축된 행 수준 표현이 더 적합할 경우 ' muvera ' 또는 ' lemur '로 전환할 수 있습니다. emb_list_rerank 가 활성화된 경우, 최종 결과는 여전히 MaxSim 재순위를 통해 산출됩니다.

검색 전략이 존재하는 이유

EmbeddingList는 텍스트 문서의 토큰 임베딩, 시각적 문서의 패치 임베딩, 또는 비디오의 클립 임베딩과 같이 여러 벡터를 포함하는 행을 위해 설계되었습니다. MaxSim은 하나의 쿼리 벡터와 하나의 행 벡터를 비교하는 대신, 쿼리 임베딩 목록과 문서 임베딩 목록을 비교하여 가장 잘 일치하는 항목을 집계합니다.

이를 통해 더 뛰어난 표현력을 얻을 수 있지만, 대규모 환경에서는 정확한 MaxSim 계산에 많은 비용이 듭니다. 무차별 대입 방식의 MaxSim 검색은 쿼리 벡터를 모든 후보 행의 모든 벡터와 비교해야 합니다. 이는 일반적으로 실제 운영 환경의 검색에는 너무 느립니다.

### 문제점 - 각 행에는 많은 벡터가 포함될 수 있습니다. - 모든 행에 대해 정확한 MaxSim을 수행하는 것은 계산 비용이 큽니다. - 인덱스 크기와 검색 지연 시간이 급격히 증가할 수 있습니다.### 전략 - 1단계 검색에 근사치를 사용합니다. - 요청된 topK보다 더 많은 후보를 검색합니다. - 정확한 MaxSim을 사용하여 후보의 순위를 재조정합니다.

이러한 의미에서 ‘ emb_list_strategy ’은 주로 인덱스 구축 및 후보 검색 전략입니다. 이 전략은 인덱스를 구축할 때 구성되며, 1단계 ANN 후보 집합이 어떻게 생성되는지를 결정합니다. 이후 ‘ retrieval_ann_ratio ’ 및 ‘ emb_list_rerank ’과 같은 검색 시점 매개변수가 검색되는 후보의 수와 MaxSim 재순위가 적용될지 여부를 제어합니다.


사용 가능한 전략

전략후보 검색 단위해결 대상최적 적합주요 상충 관계
tokenann각 행 내의 개별 벡터원본 벡터를 유지하며 압축 손실을 방지합니다.품질 우선 검색, 짧거나 중간 길이의 임베딩 목록, 판별력이 높은 임베딩.인덱스 크기가 크고 후보 검색 비용이 높음.
muvera행당 하나의 인코딩된 벡터훈련 과정 없이 임베딩 목록을 고정 차원의 FDE 표현으로 압축합니다.문서 길이가 길거나, 판별력이 높은 임베딩인 경우, TokenANN이 너무 무거운 경우.무작위 투영으로 인해 근사 손실이 발생하며, FDE 차원이 지연 시간에 영향을 미칩니다.
lemur행당 하나의 학습된 벡터임베딩 목록을 고정 차원의 행 벡터로 압축하는 코퍼스별 압축 방식을 학습합니다.분별력이 낮은 임베딩, 다중 모달 또는 시각적 문서 검색, 대규모 임베딩 목록.훈련이 필요하며, 코퍼스 분포와 문서 길이 편향에 민감할 수 있습니다.

TokenANN

tokenann 임베딩 목록의 모든 벡터를 색인화합니다. 검색 시 각 쿼리 벡터는 ANN 검색을 수행하고, 일치하는 벡터는 해당 행으로 다시 집계되며, 결과로 나온 행 후보들은 MaxSim을 통해 재순위가 매겨집니다.

품질이 최우선인 경우 TokenANN을 사용하십시오. 1단계 인덱스에서 모든 벡터를 사용할 수 있도록 유지하기 때문에, 이는 원래의 MaxSim 계산에 가장 근접한 근사치입니다.

  • 적합한 경우: 짧은 텍스트 청크, 벡터 수가 적거나 중간 정도인 행, 토큰 수준에서 의미적 구분이 뚜렷한 경우, 품질에 민감한 기준선.

  • 적합하지 않은 경우: 매우 긴 문서, 수천 개의 패치 벡터가 포함된 시각적 페이지, 엄격한 메모리 또는 지연 시간 제약이 있는 경우.

  • 요소 수준 동작: TokenANN은 개별 벡터에서 후보를 검색한 후 이를 다시 행 단위로 집계할 수 있습니다. MaxSim 점수 산정 후의 최종 EmbeddingList 검색 결과는 여전히 행 수준입니다.

MUVERA

muvera 무작위 투영을 사용하여 각 임베딩 리스트를 고정 차원의 벡터로 인코딩합니다. 이를 통해 1단계 검색이 표준 행 수준 벡터 검색으로 전환됩니다. 이후 후보들은 MaxSim을 통해 재순위가 매겨집니다.

TokenANN이 너무 무겁지만 별도의 훈련 단계는 원치 않을 때 MUVERA를 사용하십시오. 이는 품질과 비용 사이의 실용적인 절충안입니다.

  • 적합한 경우: 긴 텍스트 문서, 판별력이 높은 임베딩 공간, TokenANN보다 작은 인덱스 크기가 필요한 워크로드.

  • 적합하지 않은 경우: 판별력이 낮은 임베딩 공간이나, FDE 표현의 차원이 너무 높아 지연 시간 예산에 부적합한 경우.

  • 중요한 매개변수:muvera_num_projections, muvera_num_repeats, muvera_seed.

LEMUR

lemur 는 각 임베딩 목록을 고정 차원의 표현으로 압축하도록 모델을 학습시킵니다. 1단계 ANN 검색은 학습된 행 수준 벡터에 대해 수행되며, 후보들은 MaxSim을 사용하여 재순위가 매겨집니다.

학습된 압축이 훈련 비용을 상쇄할 만큼 가치가 있을 때 LEMUR를 사용하십시오. 이 방법은 판별력이 낮은 임베딩 공간과 다중 모달 검색에 효과적일 수 있지만, 문서 길이 분포에 민감할 수 있으므로 대상 코퍼스를 기준으로 검증해야 합니다.

  • 적합한 용도: 시각-문서 검색, 다중 모달 패치 임베딩, 판별력이 낮은 임베딩 공간, TokenANN을 적용하기 어려운 대규모 임베딩 목록.

  • 적합하지 않은 경우: 빈번하게 변경되는 코퍼스, 문서 길이가 극도로 편중된 고분별도 임베딩, 훈련 비용이 용납될 수 없는 워크로드.

  • 중요한 매개변수:lemur_hidden_dim, lemur_num_train_samples, lemur_num_epochs, lemur_batch_size, lemur_learning_rate, lemur_seed, lemur_num_layers.


기본 동작 및 구성

Knowhere의 기본 EmbeddingList 전략은 tokenann 입니다. emb_list_strategy 를 지정하지 않으면 Knowhere는 TokenANN을 사용합니다. 검색 시 기본값으로는 retrieval_ann_ratio=3.0emb_list_rerank=true 가 포함됩니다.

전략별 구성 항목

다음 표에는 전략별 구성 항목이 나열되어 있습니다. Milvus에서는 일반적으로 인덱스를 생성할 때 params 맵을 통해 빌드 시점의 항목이 전달됩니다. 서버 측 기본값이 필요한 경우, Milvus 구성 파일의 knowhere 섹션에서 정의해야 합니다.

전략구성 항목단계기본값변경 시점
tokenannemb_list_strategy="tokenann"인덱스 구축tokenann기본 요소 벡터 인덱싱 동작을 원하거나 DiskANN을 사용할 때 명시적으로 사용합니다.
muveraemb_list_strategy="muvera"인덱스 구축tokenann훈련 없이 행 단위로 인코딩된 검색을 수행하려는 경우 사용합니다.
muveramuvera_num_projections인덱스 구축4SimHash 투영 횟수를 제어합니다. 값이 높을수록 더 많은 버킷이 생성되어 인코딩 품질이 향상될 수 있지만, 인코딩된 차원은 증가합니다.
muveramuvera_num_repeats인덱스 구축7독립적인 FDE 인코딩이 몇 개나 연결될지 제어합니다. 값이 높을수록 견고성은 향상될 수 있지만, 인덱스/검색 비용이 증가합니다.
muveramuvera_seed인덱스 구축42특히 테스트 및 벤치마크 비교 시 재현 가능한 무작위 투영을 위해 설정합니다.
lemuremb_list_strategy="lemur"인덱스 구축tokenann학습된 행 수준 압축이 고정 무작위 투영보다 더 나은 성능을 보일 것으로 예상될 때 사용합니다.
lemurlemur_hidden_dim인덱스 구축256압축된 표현의 크기를 제어합니다. 용량을 늘리려면 값을 높이고, 메모리 사용량을 줄이고 검색 속도를 높이려면 값을 낮춥니다.
lemurlemur_num_train_samples인덱스 구축20000코퍼스가 다양하고 학습된 압축이 과소 적합(underfit)될 때는 이 값을 늘리고, 소규모 테스트나 더 빠른 생성 시에만 이 값을 줄이십시오.
lemurlemur_num_epochs인덱스 구축50훈련이 수렴되지 않은 경우 값을 늘리고, 구축 시간이 주요 제약 조건일 때는 값을 줄이십시오.
lemurlemur_batch_size인덱스 구축512훈련 처리량과 메모리 사용량을 고려하여 조정하십시오.
lemurlemur_learning_rate인덱스 구축0.001훈련이 불안정하거나 수렴 속도가 너무 느릴 때 조정하십시오.
lemurlemur_seed인덱스 구축42재현 가능한 훈련 실행을 위해 설정합니다.
lemurlemur_num_layers인덱스 구축2코퍼스에 더 표현력이 풍부한 특징 추출기가 필요하고 추가적인 훈련 비용을 감당할 수 있는 경우에만 이 값을 늘리십시오.
모든 전략retrieval_ann_ratio검색3.01단계 후보를 더 많이 검색하고 리콜을 향상시키려면 값을 늘리고, 지연 시간을 줄이려면 값을 줄이십시오.
모든 전략emb_list_rerank검색trueMaxSim 재순위를 위해 활성화된 상태로 유지하십시오. 1단계 ANN의 품질을 직접 측정하는 통제된 실험에서만 비활성화하십시오.

Milvus에서 전략 구성

Milvus에서 이 전략은 StructArray 벡터 하위 필드와 같은 EmbeddingList 필드에 인덱스를 생성할 때 인덱스 매개변수로 전달됩니다.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="clips[clip_embedding]",
    index_type="HNSW",
    metric_type="MAX_SIM_COSINE",
    params={
        "M": 16,
        "efConstruction": 96,
        "emb_list_strategy": "muvera",
        "muvera_num_projections": 4,
        "muvera_num_repeats": 7,
        "muvera_seed": 42,
    },
)

LEMUR의 경우, 동일한 ` params ` 맵에 LEMUR 훈련 매개변수를 지정하십시오.

params={
    "M": 16,
    "efConstruction": 96,
    "emb_list_strategy": "lemur",
    "lemur_hidden_dim": 256,
    "lemur_num_train_samples": 20000,
    "lemur_num_epochs": 50,
    "lemur_batch_size": 512,
    "lemur_learning_rate": 0.001,
    "lemur_seed": 42,
    "lemur_num_layers": 2,
}

Milvus에서 서버 측 기본값 구성

Milvus는 ` milvus.yaml`에서 인덱스 매개변수를 가져올 수도 있습니다. 관련 섹션은 knowhere 입니다. 매개변수는 ` knowhere.<INDEX_TYPE>.<stage>.<parameter>` 형식을 사용하여 인덱스 유형 및 단계별로 구성됩니다. 사용자가 지정한 인덱스 매개변수는 이러한 기본값보다 우선합니다.

knowhere:
  enable: true
  HNSW:
    build:
      emb_list_strategy: muvera
      muvera_num_projections: 4
      muvera_num_repeats: 7
      muvera_seed: 42
    search:
      retrieval_ann_ratio: 3.0
      emb_list_rerank: true

전략 선택 시 인덱스별 매개변수를 우선적으로 사용하십시오. Milvus 구성 파일의 기본값은 해당 유형 및 스테이지의 인덱스에 광범위하게 적용됩니다. 서로 다른 컬렉션이나 필드에 서로 다른 EmbeddingList 전략이 필요한 경우 create_index 의 매개변수를 사용하십시오.

검색 시 후보 검색 구성

이 전략은 인덱스가 어떻게 구축되는지를 결정합니다. 검색 시에는 retrieval_ann_ratio 를 사용하여 MaxSim 재순위 지정 전에 검색되는 1단계 후보의 수를 제어할 수 있습니다. 값이 높을수록 일반적으로 리콜은 향상되지만 지연 시간은 증가합니다.

results = client.search(
    collection_name=collection_name,
    data=[query_embedding_list],
    anns_field="clips[clip_embedding]",
    search_params={
        "metric_type": "MAX_SIM_COSINE",
        "params": {
            "ef": 64,
            "retrieval_ann_ratio": 3.0,
            "emb_list_rerank": True,
        },
    },
    limit=10,
)
매개변수단계기본값의미
emb_list_strategy인덱스 구축tokenannEmbeddingList 후보 항목이 인덱싱되고 검색되는 방식을 선택합니다.
retrieval_ann_ratio검색3.0첫 번째 ANN 라운드의 후보 확장 계수.
emb_list_rerank검색trueMaxSim을 사용하여 검색된 후보를 재순위화할지 여부.

호환성 참고 사항: MUVERA 및 LEMUR는 현재 Knowhere에서 fp32 데이터를 지원합니다. DiskANN은 TokenANN 전략에서만 EmbeddingList를 지원합니다. fp32가 아닌 벡터 유형이나 DiskANN을 사용하는 경우, 기본값을 변경하기 전에 전략 지원 여부를 확인하십시오.


전략 선택 방법

보편적으로 가장 좋은 전략은 없습니다. 임베딩 리스트 길이, 임베딩 공간의 판별력, 지연 시간 예산, 인덱스 크기, 그리고 훈련 단계를 수행할 여력이 있는지 여부를 고려하여 선택하십시오.

질문신호권장 시작점
고품질 베이스라인이 필요합니까?비용을 최적화하기 전에 최상의 실용적 근사치를 측정하고자 하는 경우입니다.tokenann
벡터 수가 적은 행인가요, 아니면 중간 정도인가요?각 행에 토큰, 패치 또는 클립 벡터의 수가 적은가요?tokenann
TokenANN이 너무 크거나 너무 느립니까?인덱스 크기나 1단계 검색 지연 시간이 병목 현상입니다.muvera
훈련 없이 압축을 원하십니까?더 단순한 연산 모델과 재현 가능한 인코딩이 필요합니다.muvera
임베딩 공간의 판별력이 낮은가요?토큰 수준 ANN 후보들은 노이즈가 많고, 랜덤 프로젝션은 신호를 충분히 보존하지 못합니다.lemur
워크로드가 시각적인가요, 아니면 다중 모달인가요?행에는 많은 패치 벡터가 포함되어 있으며, TokenANN은 계산 비용이 너무 높습니다.lemur 또는 muvera
문서 길이에 큰 편차가 있습니까?일부 행에는 다른 행보다 훨씬 더 많은 벡터가 포함되어 있습니다.muvera 부터 시작하고, lemur 를 신중하게 검증하십시오.

권장 평가 워크플로

  1. 데이터셋 크기가 허용하는 경우, 품질 기준선으로 tokenann 부터 시작하십시오.

  2. muvera 을 사용하여 동일한 쿼리를 실행하고 리콜, nDCG, 지연 시간 및 인덱스 크기를 비교하십시오.

  3. 임베딩 목록이 방대하거나, 임베딩 공간에 노이즈가 많거나, 워크로드가 시각적 또는 다중 모달인 경우 lemur 를 사용해 보십시오.

  4. 빌드 시간 매개변수를 너무 많이 변경하기 전에 retrieval_ann_ratio 를 조정해 보십시오. 리콜이 낮으면 값을 높이고, 지연 시간이 너무 길면 값을 낮추십시오.

  5. 항상 대표적인 쿼리와 문서 길이 분포를 기준으로 검증하십시오. 짧은 텍스트에서 효과가 있는 전략이 시각적 문서나 롱테일 코퍼스에서는 효과가 없을 수 있습니다.

### 품질 우선: ` tokenann`부터 시작하십시오. 이를 MaxSim 근사 품질의 기준선으로 사용하십시오.### 균형형: 훈련 파이프라인을 추가하지 않고 비용을 낮춰야 할 때는 muvera 을 시도해 보세요.### 압축: 학습된 행 단위 압축이 고정 무작위 투영보다 우수한 성능을 보일 것으로 예상될 때 lemur 를 사용해 보십시오.

본 초안에 사용된 참고 문헌

  • emb_list_strategy, retrieval_ann_ratioemb_list_rerank 에 대한 Milvus 테스트 결과.

  • knowhere 섹션에 있는 서버 측 인덱스 기본값에 대한 Milvus 구성 파일 처리 방법.

  • 기본값 및 지원되는 전략 이름에 대한 Knowhere 매개변수 정의.

  • fp32 전용 MUVERA/LEMUR 및 DiskANN TokenANN 전용 지원에 대한 Knowhere 호환성 확인.

  • MaxSim 후보 검색을 위한 TokenANN, MUVERA 및 LEMUR 비교에 대한 내부 평가 노트.

게시 참고 사항: 외부에 게시하기 전에, 대상 Milvus 릴리스에서 어떤 매개변수가 공식적으로 지원되는지, 그리고 해당 제품이 모든 저수준 Knowhere 매개변수를 공개할지 아니면 문서화된 일부 하위 집합만 공개할지 확인하십시오.