검색 연산자 (near·하이브리드·BM25)

검색 연산자 (near·하이브리드·BM25)

질의에 "어떻게 검색할지" 전략을 정해 주는 것이 검색 연산자예요. 벡터 검색 연산자(nearVector·nearObject·nearText 등), 키워드 검색 연산자(bm25), 하이브리드 검색 연산자(hybrid)가 대표적이죠. 한 질의에는 연산자를 하나만 넣을 수 있어요.

출처: Weaviate 공식 문서 - Search operators

본문

연산자 종류

설정과 무관하게 모든 인스턴스에서 쓸 수 있는 내장 연산자와, 관련 모듈을 추가해야 쓰는 모듈별 연산자로 나뉘어요.

  • 내장: nearVector, nearObject, hybrid, bm25
  • 모듈별: nearText, 멀티모달 검색, ask

벡터 검색 연산자 (nearXXX)

near 연산자는 질의와 벡터 유사도를 기준으로 객체를 찾아요. 질의가 원시 벡터면 nearVector, 객체 UUID면 nearObject를 써요. 벡터라이저 모델이 켜져 있으면 텍스트(nearText)나 이미지(nearImage) 같은 입력도 질의로 쓸 수 있어요.

nearVector는 입력 벡터에 가장 가까운 객체를 찾아요.

{
  Get {
    Publication(
      nearVector: {
        vector: [0.1, -0.15, 0.3]
      }
    ) {
      name
      _additional {
        certainty
        distance
      }
    }
  }
}

vector는 컬렉션 벡터와 같은 길이의 float 배열이에요. distancecertainty는 서로 함께 쓸 수 없고, distance 값의 해석은 거리 메트릭에 따라 달라져요.

nearObject는 같은 컬렉션에 이미 있는 객체와 가장 가까운 객체를 찾아요. 질의로 쓴 객체가 첫 번째 결과로 항상 나오는 점을 기억해 두세요.

{
  Get {
    Publication(
      nearObject: {
        id: "32d5a368-ace8-3bb7-ade7-9f7ff03eddb6",
        distance: 0.6
      }
    ) {
      name
    }
  }
}

nearText는 자연어 질의와 벡터 유사도가 높은 객체를 찾아요. 컬렉션에 text2vec이나 multi2vec 계열 벡터라이저 모듈이 설정되어 있어야 해요. moveTo/moveAwayFrom으로 검색 방향을 특정 개념이나 객체 쪽으로 당기거나 밀 수 있어요.

{
  Get {
    Publication(
      nearText: {
        concepts: ["fashion"],
        distance: 0.6,
        moveAwayFrom: {
          concepts: ["finance"],
          force: 0.45
        },
        moveTo: {
          concepts: ["haute couture"],
          force: 0.85
        }
      }
    ) {
      name
    }
  }
}

여러 개념을 넣으면 각 문자열 벡터의 평균 벡터가 질의 벡터가 돼요. 예를 들어 concepts: ["beatles", "John Lennon"]처럼 쓰면 되고요, ["New York Times"]처럼 한 덩어리로 넣을지 단어 단위로 쪼갤지에 따라 벡터가 달라져요.

하이브리드 검색 (hybrid)

hybrid는 BM25와 벡터 검색을 합쳐 "두 마리 토끼"를 잡는 결과 집합을 만들어요. alpha로 두 검색의 가중치를 조절하죠.

{
  Get {
    Article(
      hybrid: {
        query: "Fisherman that catches salmon"
        alpha: 0.5
      }
    ) {
      title
      summary
      _additional { score, explainScore }
    }
  }
}
  • alpha 기본값은 0.75예요. 0이면 순수 키워드(BM25), 1이면 순수 벡터, 0.5면 둘을 동등하게 섞어요.
  • fusionTyperankedFusion(v1.23 이하 기본)과 relativeScoreFusion(v1.24부터 기본)이 있어요. 전자는 각 검색에서의 순위를 더하고, 후자는 BM25·벡터 점수를 0~1로 정규화해 더해요.
  • properties로 BM25 부분이 검색할 프로퍼티를 한정할 수 있고, vector를 직접 넣으면 하이브리드 검색의 벡터 부분 질의를 덮어써요.

hybrid는 조건부 where 필터와도 함께 쓸 수 있어요.

BM25 검색

bm25는 키워드(스파스 벡터) 검색을 하고 BM25F 랭킹 함수로 결과에 점수를 매겨요. BM25F는 BM25를 여러 필드(프로퍼티)로 확장한 버전이라 결과가 더 좋아요. 검색은 대소문자를 구분하지 않고 불용어는 제거되며, 형태소 분석(stemming)은 아직 지원하지 않아요.

{
  Get {
    Article(
      bm25: {
        query: "fox",
        properties: ["title"]
      }
    ) {
      title
      _additional {
        score
      }
    }
  }
}

프로퍼티는 properties: ["title^3", "summary"]처럼 캐럿 뒤 숫자로 가중치(부스트)를 줄 수 있어요. searchOperator(And·Or·AndCross)로 쿼리 토큰이 어떻게 매칭되어야 객체로 인정되는지 정할 수도 있고, 조건부 필터와도 함께 쓸 수 있어요.

더 알아보기