벡터 유사도 검색

이 주제는 Milvus에서 엔티티 검색을 수행하는 방법을 소개합니다.

Milvus의 벡터 유사도 검색은 쿼리 벡터와 컬렉션 내 벡터 간의 거리를 계산하고 가장 유사한 결과를 반환합니다. 스칼라 필드나 기본 키 필드를 필터링하기 위해 부울 표현식을 지정하여 혼합 검색을 수행할 수도 있습니다.

다음 예제는 2000개의 행으로 구성된 데이터셋에서 벡터 유사도 검색을 수행하는 방법을 보여줍니다. 이 데이터셋은 책 ID (기본 키), 단어 빈도 (스칼라 필드) 및 책 설명 (벡터 필드)으로 구성되어 있습니다. 이는 벡터화된 설명을 기반으로 특정 책을 검색하는 시나리오를 시뮬레이션한 것입니다. Milvus는 정의된 쿼리 벡터와 검색 매개변수를 기반으로 가장 유사한 결과를 반환할 것입니다.

컬렉션 로드

벡터 유사도 검색을 수행하기 전에 Milvus는 모든 검색 및 쿼리 작업을 메모리에서 실행합니다. 벡터 유사도 검색을 수행하기 전에 컬렉션을 메모리에 로드해야 합니다.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("failed to load collection:", err.Error())
}

검색 매개변수 준비

검색 시나리오에 적합한 매개변수를 준비합니다. 다음 예제는 유클리드 거리를 사용하여 거리를 계산하고 IVF_FLAT 인덱스로 구축된 10개의 가장 가까운 클러스터에서 벡터를 검색합니다.

sp, _ := entity.NewIndexIvfFlatSearchParam( // NewIndex*SearchParam func
    10,                                  // searchParam
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})
매개변수 설명 옵션
NewIndex*SearchParam func 다양한 인덱스 유형에 기반한 entity.SearchParam을 생성하는 함수 Float 벡터용: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Binary 벡터용: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT)
sp 이전 함수에서 반환된 인덱스별 검색 매개변수 자세한 내용은 벡터 인덱스 참조
opt ANN(근사 최근접 이웃) 검색의 옵션 - Limit: 반환할 엔터티 수 지정 - Offset: 검색 중 건너뛸 엔터티 수 지정. 이 매개변수와 Limit의 합은 16384보다 작아야 함. 예를 들어, 벡터의 9번째와 10번째 가장 가까운 이웃을 쿼리하려면 Limit2로, Offset8로 설정하면 됨. - ConsistencyLevel: 검색 중 적용할 일관성 수준 지정 - Ignore Growing: 유사도 검색 시 성장 중인 세그먼트를 무시할지를 나타냄. 기본값은 False로, 검색에 성장 중인 세그먼트가 포함됨을 의미함.

벡터 검색 수행

Milvus를 사용하여 벡터 검색을 수행합니다. 특정 파티션에서 검색하려면 파티션 이름 목록을 지정해주세요.

Milvus는 검색을 위한 일관성 레벨 설정을 지원합니다. 이 항목의 예제에서는 일관성 레벨을 강함으로 설정합니다. Bounded, Session, 또는 Eventually로 일관성 레벨을 설정할 수도 있습니다. Milvus의 네 가지 일관성 레벨에 대한 자세한 내용은 일관성을 참조하세요.

searchResult, err := milvusClient.Search(
    context.Background(),                    // ctx
    "book",                                  // CollectionName
    []string{},                              // partitionNames
    "",                                      // expr
    []string{"book_id"},                     // outputFields
    []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
    "book_intro",                            // vectorField
    entity.L2,                               // metricType
    10,                                      // topK
    sp,                                      // sp
    opt,
)
if err != nil {
    log.Fatal("컬렉션 검색 실패:", err.Error())
}
매개변수 설명 옵션
ctx API 호출 프로세스를 제어하는 데 사용되는 컨텍스트 없음
CollectionName 로드할 컬렉션의 이름 없음
partitionNames 로드할 파티션 이름 목록. 비어있으면 모든 파티션을 검색합니다 없음
expr 속성 필터링을 위한 부울 표현식 자세한 정보는 부울 표현식 규칙을 참조하세요
output_fields 반환할 필드의 이름 없음
vectors 검색할 벡터 없음
vectorField 검색할 필드의 이름 없음
metricType 검색에 사용되는 메트릭 유형 이 매개변수는 인덱스 빌드에 사용된 메트릭 유형과 동일해야 합니다
topK 반환할 결과의 수. 이 값과 optsoffset의 합은 16384보다 작아야 합니다. 없음
sp 인덱스에 특정한 entity.SearchParam 없음

가장 유사한 벡터의 기본 키 값을 및 거리를 확인하세요.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
    fmt.Println(sr.IDs)
    fmt.Println(sr.Scores)
}

검색이 완료되면 Milvus에 로드된 컬렉션을 해제하여 메모리 소비를 줄입니다.

err := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "book",                                          // CollectionName
)
if err != nil {
    log.Fatal("컬렉션 해제 실패:", err.Error())
}

제약사항

기능 최대 제한
컬렉션 이름의 길이 255 글자
컬렉션 내 파티션 수 4,096
컬렉션 내 필드 수 256
컬렉션 내 시리즈 수 256
벡터의 차원 32,768
상위 K 16,384
대상 입력 벡터 수 16,384

혼합 검색 수행

혼합 검색은 본질적으로 속성 필터링이 있는 벡터 검색입니다. 스칼라 필드 또는 기본 키 필드를 위한 부울 표현식을 지정함으로써 특정 조건에 기반한 검색을 제한할 수 있습니다.

다음 예제는 일반 벡터 검색을 기반으로 혼합 검색을 수행하는 방법을 보여줍니다. 책의 벡터화된 소개를 기반으로 특정 책을 검색하되, 특정 단어 수 범위 내의 책만 검색하려면 검색 매개변수에서 부울 표현식을 지정합니다. Milvus는 해당 표현식과 일치하는 엔티티 내에서만 유사한 벡터를 검색합니다.

sp, _ := entity.NewIndexFlatSearchParam(
  10,
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

searchResult, err := milvusClient.Search(
  context.Background(),
  "book",
  []string{},
  "word_count <= 11000",
  []string{"book_id"},
  []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
  "book_intro",
  entity.L2,
  2,
  sp,
  opt,
)

if err != nil {
  log.Fatal("컬렉션 검색 실패:", err.Error())
}

반환된 결과를 확인하세요.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
  fmt.Println(sr.IDs)
  fmt.Println(sr.Scores)
}