• 밀버스 소개
  • 시작하기
  • 개념
  • 사용자 가이드
  • 데이터 가져오기
  • AI 도구
  • 관리 가이드
  • 도구
  • 통합
  • 튜토리얼
  • 자주 묻는 질문
  • API Reference

MinHash 함수Compatible with Milvus 3.0.x

MinHash 함수는 원시 텍스트를 이진 벡터로 변환하여 문서 간의 Jaccard 유사성을 대략적으로 계산합니다. 텍스트 슁글과 다중 해시 함수를 적용하여 고정 길이의 서명 벡터를 생성함으로써 대규모로 빠르게 중복에 가까운 문서를 감지하고 중복 제거를 수행할 수 있습니다.

내장된 기능인 MinHash는 Milvus 내에서 실행되며 외부 모델 추론이나 전처리가 필요하지 않습니다. 원시 텍스트를 삽입하기만 하면 Milvus가 MinHash 서명 벡터를 자동으로 생성합니다.

제한 사항

  • 출력 필드는 dim % 32 == 0 을 만족하는 치수를 가진 BINARY_VECTOR 여야 합니다. 각 MinHash 서명은 32비트 해시 값이기 때문입니다.

  • 이진 벡터 필드의 dim32 * num_hashes 과 같아야 합니다. 불일치하면 오류가 발생합니다.

  • MinHash 함수 출력으로 MINHASH_LSH 인덱스를 사용하는 경우 mh_element_bit_width32 으로 설정해야 합니다.

MinHash 작동 방식

작동 방식을 보려면 확장하세요.

MinHash는 집합 간의 Jaccard 유사성을 추정하는 로컬리티에 민감한 해싱 기법입니다. 사용자가 원시 텍스트를 입력으로 제공하면 Milvus는 이진 벡터를 출력으로 생성하여 모든 중간 단계를 내부적으로 처리하는 이 파이프라인을 따라 MinHash 함수가 작동합니다.

전체 워크플로는 문서 수집과 쿼리 처리 모두에 사용되는 공유 텍스트 처리 파이프라인과 저장 및 검색을 위한 단계별 작업으로 구성됩니다.

Iaqkbfeh8oqggsx6nsocfosondo 전체 보기

공유 텍스트 처리 파이프라인

문서 수집과 쿼리 처리 모두 동일한 4단계 변환을 통해 원시 텍스트를 전달합니다:

  1. 텍스트 분석: 텍스트는 분석기에 의해 처리되거나( token_level"word" 일 때) 직접 사용됩니다( token_level"char" 일 때). 단어 수준 토큰화는 입력 필드에 구성된 분석기를 적용하여 텍스트를 용어로 분할합니다(예: "milvus is vector db"["milvus", "is", "vector", "db"] 이 됩니다).

  2. 대상포진: 토큰은 n-그램(대상 포진) 크기의 겹치는 n-그램(대상 포진)으로 분할됩니다( shingle_size). 예를 들어, 단어 수준이 3그램인 경우 ["information", "retrieval", "is", "a", "field"] 토큰은 ["information retrieval is", "retrieval is a", "is a field"] 과 같은 대상포진이 됩니다.

  3. MinHash 서명 생성: 여러 해시 함수(H1, H2, ..., Hn, 여기서 n = num_hashes)가 싱글 세트에 적용됩니다. 각 해시 함수에 대해 모든 지붕 널에 대한 최소 해시 값이 선택됩니다. 이러한 최소값의 모음은 원본 문서의 Jaccard 유사성을 근사화하는 고정 길이 표현인 MinHash 서명을 형성합니다.

  4. 이진 벡터 인코딩: 각 서명 값은 32비트 해시이며, 전체 서명은 32 * num_hashes 크기의 BINARY_VECTOR 에 압축됩니다.

문서 수집

삽입하는 동안 공유 파이프라인에서 생성된 바이너리 벡터는 MINHASH_LSH 인덱스에 저장됩니다. 이 인덱스는 유사한 서명을 동일한 버킷으로 그룹화하여 쿼리 시 후보를 빠르게 검색할 수 있는 LSH(지역 민감 해싱) 테이블을 유지합니다.

쿼리 처리

검색 중에 쿼리 텍스트는 동일한 공유 파이프라인을 거쳐 바이너리 벡터를 생성합니다. 이 벡터는 MINHASH_LSH 인덱스에서 LSH 조회를 수행하는 데 사용되어 유사할 가능성이 있는 후보 쌍을 빠르게 식별합니다. 그런 다음 예상되는 Jaccard 유사도에 따라 후보의 순위를 매기고 상위 K 결과를 반환합니다.

두 경로 모두 동일한 변환 로직을 공유하기 때문에 콘텐츠가 매우 겹치는 두 문서는 유사한 MinHash 서명을 생성합니다. 따라서 이 기능은 문서의 어순, 서식 또는 사소한 문구가 다른 경우에도 중복에 가까운 문서를 찾는 데 효과적입니다.

시작하기 전에

MinHash 함수를 사용하기 전에 다음을 포함하도록 컬렉션 스키마를 계획하세요:

  • 원시 콘텐츠를 위한 텍스트 필드

    컬렉션에는 원시 텍스트를 저장하기 위한 VARCHAR 필드가 포함되어야 합니다. 이 필드는 MinHash 함수에 대한 입력으로 사용됩니다.

  • 텍스트 필드를 위한 분석기 (단어 수준 토큰화를 사용하는 경우)

    token_level"word" (기본값)으로 설정된 경우 텍스트 필드에 분석기가 활성화되어 있어야 합니다. 분석기는 텍스트가 토큰화되기 전에 토큰화되는 방식을 정의합니다. 기본적으로 Milvus는 standard 분석기를 사용합니다. 다른 분석기를 구성하려면 사용 사례에 적합한 분석기 선택을 참조하세요.

  • MinHash 출력을 위한 바이너리 벡터 필드

    컬렉션에는 MinHash 함수에 의해 생성된 바이너리 벡터를 저장할 BINARY_VECTOR 필드가 포함되어야 합니다. 차원은 32 * num_hashes 와 같아야 합니다.

1단계: MinHash 함수를 사용하여 컬렉션 만들기

MinHash 함수를 사용하려면 컬렉션을 만들 때 정의합니다. 이 함수는 컬렉션 스키마의 일부가 되어 데이터 삽입 및 검색 중에 자동으로 적용됩니다.

스키마 필드 정의

컬렉션 스키마에는 최소 3개의 필드가 포함되어야 합니다:

  • 기본 필드: 컬렉션의 각 엔티티를 고유하게 식별합니다.

  • 텍스트 필드 (VARCHAR): 원시 텍스트 문서를 저장합니다. Milvus가 MinHash 서명 생성을 위해 텍스트를 처리할 수 있도록 enable_analyzer=True 을 설정합니다. 기본적으로 Milvus는 텍스트 분석에 standard 분석기를 사용합니다. 다른 분석기를 구성하려면 사용 사례에 적합한 분석기 선택을 참조하세요.

  • 바이너리 벡터 필드 (BINARY_VECTOR): MinHash 함수에 의해 자동으로 생성된 바이너리 벡터를 저장합니다. 차원은 32 * num_hashes 와 같아야 합니다.

from pymilvus import MilvusClient, DataType, Function, FunctionType

client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")

schema = client.create_schema()

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="document_content", datatype=DataType.VARCHAR, max_length=9000, enable_analyzer=True)
schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=8192)
// java
// nodejs
// go
# restful

MinHash 함수 정의

MinHash 함수는 분석된 텍스트를 문서 간의 Jaccard 유사성을 근사화하는 이진 벡터로 변환합니다.

함수를 정의하고 스키마에 추가하세요:

minhash_function = Function(
    name="minhash_function",
    input_field_names=["document_content"], # Name of the VARCHAR field containing raw text
    output_field_names=["binary_vector"], # Name of the BINARY_VECTOR field for generated signatures
    function_type=FunctionType.MINHASH,
    params={
        "num_hashes": 256, # Number of hash functions; produces dim = 32 * 256 = 8192
        "shingle_size": 3, # N-gram size for shingling
    }
)

schema.add_function(minhash_function)
// java
// nodejs
// go
# restful

구성 옵션

MinHash 함수의 params 딕셔너리는 다음 매개변수를 허용합니다. 모든 매개변수 이름은 대소문자를 구분하지 않습니다.

파라미터

유형

기본값

설명

num_hashes

int

다음에서 파생됩니다. dim / 32

서명 생성을 위한 해시 함수의 개수입니다. 출력 바이너리 벡터 차원은 32 * num_hashes 입니다. 값이 클수록 유사도 추정에서 분산이 줄어들지만 계산이 증가합니다. 권장: 256 (dim = 8192).

shingle_size

int

3

대상 포진에 대한 N-그램 크기입니다. 단어 수준: 1-3이 일반적입니다. 문자 수준: 2-6이 일반적입니다.

hash_function

str

"xxhash"

사용할 해시 함수입니다. 옵션:

  • "xxhash" (빠름)

  • "sha1" (느리고, 충돌 저항성이 높음).

token_level

str

"word"

토큰화 수준. 옵션:

  • "word": 필드의 분석기를 사용하여 토큰화한 다음 n-그램 슁글링을 적용합니다.

  • "char" / "character": 원시 문자에 직접 n-그램 슁글링을 적용합니다(분석기 없음).

    단어 수준은 더 강력한 의미론과 더 높은 효율성을 제공하지만 언어별 토큰화에 따라 달라집니다. 문자 수준은 언어에 구애받지 않지만 더 약한 의미론으로 더 높은 차원의 슁글을 생성합니다.

seed

int

1234

MinHash 함수 초기화를 위한 임의의 시드입니다.

인덱스 구성

MinHash 바이너리 벡터에 권장되는 인덱스 유형은 MINHASH_LSH 이며, 메트릭 유형은 MHJACCARD 입니다.

index_params = client.prepare_index_params()

index_params.add_index(
    field_name="binary_vector",
    index_type="MINHASH_LSH",
    metric_type="MHJACCARD",
    params={
        "mh_lsh_band": 128,
        "mh_element_bit_width": 32,
        "with_raw_data": True,
    },
)
// java
// nodejs
// go
# restful

컬렉션 만들기

위에 정의된 스키마 및 인덱스 파라미터를 사용하여 컬렉션을 생성합니다:

client.create_collection(
    collection_name="dedup_collection",
    schema=schema,
    index_params=index_params,
)
// java
// nodejs
// go
# restful

2단계: 문서 삽입

컬렉션을 설정한 후 텍스트 데이터를 삽입합니다. MinHash 함수가 각 문서에 대한 바이너리 벡터를 자동으로 생성하므로 원시 텍스트만 제공하면 됩니다.

client.insert(
    "dedup_collection",
    [
        {"document_content": "information retrieval is a field of study that helps users find relevant information in large datasets"},
        {"document_content": "information retrieval is a research field focused on helping users find relevant data in large collections"},
        {"document_content": "information retrieval is a field of research helping users search for relevant information in large datasets"},
    ],
)
// java
// nodejs
// go
# restful

3단계: MinHash로 검색

데이터를 삽입한 후에는 원시 텍스트 쿼리를 제공하여 중복에 가까운 문서를 검색합니다. Milvus는 자동으로 쿼리 텍스트를 MinHash 바이너리 벡터로 변환하고 추정된 Jaccard 유사도를 사용하여 가장 유사한 문서를 검색합니다.

search_params = {
    "metric_type": "MHJACCARD",
    "params": {},
}

results = client.search(
    collection_name="dedup_collection",
    data=["information retrieval is a research field focused on helping users find relevant data in large collections"],
    anns_field="binary_vector",
    limit=3,
    output_fields=["document_content"],
    search_params=search_params,
)

for hits in results:
    for hit in hits:
        print(f"ID: {hit['id']}, Distance: {hit['distance']}")
        print(f"Document: {hit['entity']['document_content']}")
// java
// nodejs
// go
# restful

다음 단계

  • 전체 텍스트 검색: 중복에 가까운 탐지 대신 어휘 관련성 순위를 매기는 데 BM25를 사용하세요.

  • 분석기 개요: 텍스트 토큰화를 위한 사용자 정의 분석기를 구성하세요.

  • MINHASH_LSH 색인: 리콜 및 성능을 위한 LSH 매개변수 조정에 대해 알아보세요.