MinHash 함수Compatible with Milvus 3.0.x
MinHash 함수는 원시 텍스트를 이진 벡터로 변환하여 문서 간의 Jaccard 유사성을 대략적으로 계산합니다. 텍스트 슁글과 다중 해시 함수를 적용하여 고정 길이의 서명 벡터를 생성함으로써 대규모로 빠르게 중복에 가까운 문서를 감지하고 중복 제거를 수행할 수 있습니다.
내장된 기능인 MinHash는 Milvus 내에서 실행되며 외부 모델 추론이나 전처리가 필요하지 않습니다. 원시 텍스트를 삽입하기만 하면 Milvus가 MinHash 서명 벡터를 자동으로 생성합니다.
제한 사항
출력 필드는
dim % 32 == 0을 만족하는 치수를 가진BINARY_VECTOR여야 합니다. 각 MinHash 서명은 32비트 해시 값이기 때문입니다.이진 벡터 필드의
dim은32 * num_hashes과 같아야 합니다. 불일치하면 오류가 발생합니다.MinHash 함수 출력으로
MINHASH_LSH인덱스를 사용하는 경우mh_element_bit_width을32으로 설정해야 합니다.
MinHash 작동 방식
MinHash는 집합 간의 Jaccard 유사성을 추정하는 로컬리티에 민감한 해싱 기법입니다. 사용자가 원시 텍스트를 입력으로 제공하면 Milvus는 이진 벡터를 출력으로 생성하여 모든 중간 단계를 내부적으로 처리하는 이 파이프라인을 따라 MinHash 함수가 작동합니다.
전체 워크플로는 문서 수집과 쿼리 처리 모두에 사용되는 공유 텍스트 처리 파이프라인과 저장 및 검색을 위한 단계별 작업으로 구성됩니다.
전체 보기
공유 텍스트 처리 파이프라인
문서 수집과 쿼리 처리 모두 동일한 4단계 변환을 통해 원시 텍스트를 전달합니다:
텍스트 분석: 텍스트는 분석기에 의해 처리되거나(
token_level가"word"일 때) 직접 사용됩니다(token_level가"char"일 때). 단어 수준 토큰화는 입력 필드에 구성된 분석기를 적용하여 텍스트를 용어로 분할합니다(예:"milvus is vector db"은["milvus", "is", "vector", "db"]이 됩니다).대상포진: 토큰은 n-그램(대상 포진) 크기의 겹치는 n-그램(대상 포진)으로 분할됩니다(
shingle_size). 예를 들어, 단어 수준이 3그램인 경우["information", "retrieval", "is", "a", "field"]토큰은["information retrieval is", "retrieval is a", "is a field"]과 같은 대상포진이 됩니다.MinHash 서명 생성: 여러 해시 함수(H1, H2, ..., Hn, 여기서 n =
num_hashes)가 싱글 세트에 적용됩니다. 각 해시 함수에 대해 모든 지붕 널에 대한 최소 해시 값이 선택됩니다. 이러한 최소값의 모음은 원본 문서의 Jaccard 유사성을 근사화하는 고정 길이 표현인 MinHash 서명을 형성합니다.이진 벡터 인코딩: 각 서명 값은 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 딕셔너리는 다음 매개변수를 허용합니다. 모든 매개변수 이름은 대소문자를 구분하지 않습니다.
파라미터 |
유형 |
기본값 |
설명 |
|---|---|---|---|
|
int |
다음에서 파생됩니다. |
서명 생성을 위한 해시 함수의 개수입니다. 출력 바이너리 벡터 차원은 |
|
int |
|
대상 포진에 대한 N-그램 크기입니다. 단어 수준: 1-3이 일반적입니다. 문자 수준: 2-6이 일반적입니다. |
|
str |
|
사용할 해시 함수입니다. 옵션:
|
|
str |
|
토큰화 수준. 옵션:
|
|
int |
|
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 매개변수 조정에 대해 알아보세요.