벡터 공간
벡터 공간 (Vector spaces)
벡터 검색에서 공간(space)은 두 벡터 사이의 거리(또는 유사도)를 어떻게 계산할지 정의해요. 공간의 선택은 검색 연산 중에 최근접 이웃이 어떻게 결정되는지에 영향을 줘요.
출처: 문서
본문
거리 계산 (Distance calculation)
공간은 k-최근접 이웃을 결정하기 위해 두 점 사이의 거리를 측정하는 데 사용되는 함수를 정의해요. k-NN 검색에서 더 낮은 점수는 더 가깝고 더 나은 결과를 의미해요. 이는 점수가 높을수록 더 나은 결과인 OpenSearch의 일반적인 스코어링 방식과 반대예요. OpenSearch는 다음 공간들을 지원해요.
모든 메서드/엔진 조합이 각 space를 지원하는 것은 아니에요. 지원 space 목록은 메서드 문서의 특정 엔진 섹션을 참고하세요.
| Space 타입 | 검색 타입 | 거리 함수 (d) | OpenSearch 점수 |
|---|---|---|---|
l1 |
근사, 정확 | d(x, y) = Σ | x_i − y_i |
l2 |
근사, 정확 | d(x, y) = Σ (x_i − y_i)² | score = 1 / (1 + d) |
linf |
근사, 정확 | d(x, y) = max( | x_i − y_i |
cosinesimil |
근사, 정확 | d(x, y) = 1 − cos θ = 1 − (x·y / ( | |
innerproduct (Lucene은 OpenSearch 2.13 이상에서 지원) |
근사 | NMSLIB와 Faiss: d(x, y) = −x·y = −Σ x_i y_i / Lucene: d(x, y) = x·y = Σ x_i y_i | NMSLIB와 Faiss: d ≥ 0이면 score = 1 / (1 + d), d < 0이면 score = −d + 1 / Lucene: d > 0이면 score = d + 1, d ≤ 0이면 score = 1 / (1 + (−1·d)) |
innerproduct (Lucene은 OpenSearch 2.13 이상에서 지원) |
정확 | d(x, y) = −x·y = −Σ x_i y_i | d ≥ 0이면 score = 1 / (1 + d), d < 0이면 score = −d + 1 |
hamming (OpenSearch 2.16 이상에서 binary 벡터 지원) |
근사, 정확 | d(x, y) = countSetBits(x ⊕ y) | score = 1 / (1 + d) |
hammingbit (binary 및 long 벡터 지원) |
정확 | d(x, y) = countSetBits(x ⊕ y) | score = 1 / (1 + d) |
코사인 유사도 공식에는 1 − 접두사가 포함되지 않아요. 하지만 유사도 검색 라이브러리는 낮은 점수를 더 가까운 결과와 동일시하기 때문에 cosine 유사도 space에 대해 1 − cosineSimilarity를 반환해요. 그래서 거리 함수에 1 −가 포함되는 거예요.
코사인 유사도를 사용할 때는 영 벡터([0, 0, ...])를 입력으로 전달하는 것이 유효하지 않아요. 그런 벡터의 크기가 0이어서 해당 공식에서 0으로 나누기 예외가 발생하기 때문이에요. 영 벡터가 포함된 요청은 거부되고 해당 예외가 발생해요.
hamming space 타입은 OpenSearch 2.16 이상 버전에서 binary 벡터에 지원돼요. 자세한 내용은 Binary k-NN vectors 문서를 참고하세요.
Faiss 엔진에서 cosinesimil을 사용하면 Faiss가 내부적으로 정규화된 벡터에 내적을 사용하기 때문에 색인 중에 벡터가 자동으로 단위 길이로 정규화돼요. 벡터가 이미 정규화되어 있다면, 정규화에 대한 명시적인 제어로 동등한 결과를 얻기 위해 cosinesimil 대신 innerproduct를 사용하는 것을 고려해 보세요.
Space 타입 지정
Space 타입은 인덱스를 만들 때 지정해요.
필드 매핑의 최상위 레벨에서 space 타입을 지정할 수 있어요.
PUT /test-index
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"my_vector1": {
"type": "knn_vector",
"dimension": 3,
"space_type": "l2"
}
}
}
}
또는 메서드를 정의한다면 method 객체 안에서 space 타입을 지정할 수 있어요.
PUT test-index
{
"settings": {
"index": {
"knn": true,
"knn.algo_param.ef_search": 100
}
},
"mappings": {
"properties": {
"my_vector1": {
"type": "knn_vector",
"dimension": 1024,
"method": {
"name": "hnsw",
"space_type": "l2",
"engine": "nmslib",
"parameters": {
"ef_construction": 128,
"m": 24
}
}
}
}
}
}