다중 타겟 벡터 검색

다중 타겟 벡터 검색 (Multiple target vectors)

한 컬렉션에 여러 개의 named 벡터가 있으면, 검색할 때 여러 벡터 공간을 동시에 탐색할 수 있어요. 멀티 타겟 벡터 검색은 그렇게 여러 target 벡터 공간을 동시에 검색하고, 결과를 "조인 전략"(join strategy)으로 합쳐 단일 결과 집합을 만듭니다.

타겟 벡터와 쿼리 벡터를 지정하는 방법이 여러 가지입니다.

  • 타겟 벡터 이름만 지정
  • 쿼리 벡터 지정
  • 타겟 벡터 이름 + 조인 전략 지정
  • 원시 벡터 거리 가중치
  • 정규화된 벡터 거리 가중치

멀티 타겟 벡터 검색은 near_xxx 쿼리(v1.26부터)와 hybrid 쿼리(v1.27부터)에서 사용할 수 있어요.

출처: 공식문서

사용 가능한 조인 전략

  • minimum (기본) 모든 벡터 거리의 최솟값 사용.
  • sum 벡터 거리의 합 사용.
  • average 벡터 거리의 평균 사용.
  • manual weights 각 타겟 벡터에 가중치를 주고 가중된 거리의 합 사용.
  • relative score 각 타겟 벡터에 가중치를 주고 가중된 정규화 거리의 합 사용.

타겟 벡터 이름만 지정

최소한 named 벡터의 배열로 타겟 벡터 이름을 지정합니다. 기본 조인 전략이 사용됩니다.

from weaviate.classes.query import MetadataQuery

collection = client.collections.use("JeopardyTiny")
response = collection.query.near_text(
    query="a wild animal",
    limit=2,
    target_vector=["jeopardy_questions_vector", "jeopardy_answers_vector"],
    return_metadata=MetadataQuery(distance=True)
)

쿼리 벡터 지정

nearVector 검색에서 각 타겟 벡터에 대응하는 서로 다른 쿼리 벡터를 지정할 수 있어요.

response = collection.query.near_vector(
    near_vector={
        "jeopardy_questions_vector": v1,
        "jeopardy_answers_vector": v2,
    },
    limit=2,
    target_vector=["jeopardy_questions_vector", "jeopardy_answers_vector"],
    return_metadata=MetadataQuery(distance=True)
)

쿼리 벡터 배열 지정

같은 타겟 벡터를 여러 번, 다른 쿼리 벡터로 지정할 수도 있어요. 즉 같은 타겟 벡터에 대해 여러 쿼리 벡터를 사용하는 것이죠.

# 타겟 벡터 이름만 배열로
near_vector={
    "jeopardy_questions_vector": v1,
    "jeopardy_answers_vector": [v2, v3]
}

# 타겟 벡터 + 가중치
target_vector=TargetVectors.manual_weights({
    "jeopardy_questions_vector": 10,
    "jeopardy_answers_vector": [30, 30],  # 위 벡터 순서와 일치
}),

타겟 벡터 이름 + 조인 전략 지정

타겟 벡터를 named 벡터 배열과 함께, 결과 집합을 어떻게 조인할지 지정합니다. sum, average, minimum 조인 전략은 전략 이름과 타겟 벡터만 필요합니다.

from weaviate.classes.query import TargetVectors

target_vector=TargetVectors.average(["jeopardy_questions_vector", "jeopardy_answers_vector"]),
# .sum(), .minimum(), .manual_weights(), .relative_score() 도 사용 가능

원시 벡터 거리 가중치

각 타겟 벡터에 대한 가중된 원시(raw) 거리의 합으로 검색합니다.

각 쿼리 벡터와 타겟 벡터 사이의 거리에 지정 가중치를 곱하고, 객체별로 가중 거리를 합산해 결합 거리를 만듭니다. 검색 결과는 이 결합 거리로 정렬됩니다.

target_vector=TargetVectors.manual_weights({
    "jeopardy_questions_vector": 10,
    "jeopardy_answers_vector": 50
}),

정규화된 벡터 거리 가중치

각 타겟 벡터에 대한 가중된 정규화된 거리의 합으로 검색합니다.

각 거리는 해당 타겟 벡터의 다른 결과에 대해 정규화됩니다. 정규화된 거리에 지정 가중치를 곱하고, 객체별로 합산해 결합 거리를 만들어 정렬합니다.

점수 정규화 방식의 자세한 설명은 하이브리드 relative score fusion 블로그를 참고하세요.

target_vector=TargetVectors.relative_score({
    "jeopardy_questions_vector": 10,
    "jeopardy_answers_vector": 10
}),

더 알아보기 (Learn more)