메타데이터 필터링

메타데이터 필터링 (Metadata filtering)

메타데이터 필터링을 사용하면 벡터에 붙은 특정 속성으로 검색 결과를 필터링할 수 있어요. 검색 작업에 메타데이터 필터를 사용하면 유사도 조건과 특정 메타데이터 조건을 모두 만족하는 벡터를 찾을 수 있어요.

S3 Vectors는 필터링 가능한 메타데이터(filterable metadata)와 필터링 불가능한 메타데이터(non-filterable metadata) 두 가지 타입을 지원해요. 핵심 차이는 필터링 가능한 메타데이터는 검색 필터에 사용할 수 있지만 크기 제한이 더 엄격하고, 필터링 불가능한 메타데이터는 필터에 쓸 수 없지만 크기 한도 내에서 더 많은 데이터를 저장할 수 있다는 점이에요. 벡터당 크기 제한, 벡터당 최대 메타데이터 키 수 등 메타데이터 제한에 대한 자세한 내용은 제한 사항을 참고하세요.

S3 Vectors는 벡터 검색과 필터 평가를 함께 수행해요. S3 Vectors는 인덱스 안의 후보 벡터들을 검색해 상위 K개의 유사 벡터를 찾는 동시에, 각 후보 벡터가 메타데이터 필터 조건과 일치하는지도 함께 검증해요. 예를 들어 유사한 영화 임베딩을 검색하면서 genre='mystery'로 필터링한다면, S3 Vectors는 genre 메타데이터가 'mystery'와 일치하는 유사 영화 임베딩만 반환해요. 벡터 검색 후에 메타데이터 필터를 적용하는 방식과 달리, 이 필터링 방식은 일치하는 결과를 찾을 가능성이 더 높아요. 참고로 필터가 있는 검색은 벡터 인덱스에 일치하는 결과가 매우 적을 때 상위 K개보다 적은 결과를 반환할 수 있어요.

주제 (Topics)

출처: 문서

본문

필터링 가능한 메타데이터 (Filterable metadata)

필터링 가능한 메타데이터를 사용하면 특정 메타데이터 값으로 검색 결과를 필터링할 수 있어요. 기본적으로 유사도 검색에서는 모든 메타데이터 필드가 필터링 가능하며, 벡터 인덱스를 만들 때 명시적으로 필터링 불가능으로 지정한 필드만 제외돼요. S3 Vectors는 문자열, 숫자, 불리언, 리스트 타입의 메타데이터를 벡터당 크기 제한과 함께 지원해요. 이 메타데이터 타입은 카테고리, 타임스탬프, 상태 값처럼 필터링하고 싶은 속성에 적합해요.

메타데이터 크기가 지원 한도를 초과하면 PutVectors API 작업은 400 Bad Request 오류를 반환해요. 벡터당 필터링 가능한 메타데이터 크기 제한에 대한 자세한 내용은 제한 사항을 참고하세요.

필터링 가능한 메타데이터에 사용할 수 있는 연산자는 다음과 같아요.

연산자 (Operator) 유효한 입력 타입 (Valid Input Types) 설명 (Description)
$eq 문자열, 숫자, 불리언 단일 값에 대한 정확히 일치 비교. 배열 메타데이터 값과 비교할 때는 입력 값이 배열의 어떤 요소와도 일치하면 true를 반환해요. 예를 들어 {"category": {"$eq": "documentary"}}는 메타데이터가 "category": ["documentary", "romance"]인 벡터와 일치해요.
$ne 문자열, 숫자, 불리언 같지 않음 비교
$gt 숫자 초과(보다 큼) 비교
$gte 숫자 이상(크거나 같음) 비교
$lt 숫자 미만(보다 작음) 비교
$lte 숫자 이하(작거나 같음) 비교
$in 비어 있지 않은 기본형 배열 배열 안의 어떤 값과도 일치
$nin 비어 있지 않은 기본형 배열 배열 안의 어떤 값과도 일치하지 않음
$exists 불리언 필드 존재 여부 확인
$and 비어 있지 않은 필터 배열 여러 조건의 논리 AND
$or 비어 있지 않은 필터 배열 여러 조건의 논리 OR

유효한 필터링 가능한 메타데이터 예시 (Examples of valid filterable metadata)

단순 동등 (Simple equality)

{"genre": "documentary"}

이 필터는 genre 메타데이터 키가 "documentary"와 같은 벡터와 일치해요. 연산자를 지정하지 않으면 S3 Vectors는 자동으로 $eq 연산자를 사용해요.

명시적 동등 (Explicit equality)

// Example: Exact match
{"genre": {"$eq": "documentary"}}
// Example: Not equal to
{"genre": {"$ne": "drama"}}

숫자 비교 (Numeric comparison)

{"year": {"$gt": 2019}}
{"year": {"$gte": 2020}}
{"year": {"$lt": 2020}}
{"year": {"$lte": 2020}}

배열 연산 (Array operations)

{"genre": {"$in": ["comedy", "documentary"]}}
{"genre": {"$nin": ["comedy", "documentary"]}}

존재 확인 (Existence check)

{"genre": {"$exists": true}}

$exists 필터는 해당 메타데이터 키에 저장된 값과 관계없이 "genre" 메타데이터 키를 가진 벡터와 일치해요.

논리 연산 (Logical operations)

{"$and": [{"genre": {"$eq": "drama"}}, {"year": {"$gte": 2020}}]}
{"$or": [{"genre": {"$eq": "drama"}}, {"year": {"$gte": 2020}}]}

가격 범위 (같은 필드에 여러 조건) (Price range — Multiple conditions on the same field)

{"price": {"$gte": 10, "$lte": 50}}

메타데이터 필터링으로 벡터를 검색하는 방법에 대한 자세한 내용은 메타데이터 필터링을 참고하세요.

필터링 불가능한 메타데이터 (Non-filterable metadata)

필터링 불가능한 메타데이터는 검색 필터에는 사용할 수 없지만 필터링 가능한 메타데이터보다 더 많은 양의 맥락 데이터를 저장할 수 있어요. 검색 가능할 필요는 없지만 검색 결과와 함께 반환할 수 있는 큰 텍스트 청크, 상세 설명, 기타 맥락 정보를 저장하기에 적합해요. 예를 들어 전체 문서 텍스트, 이미지 설명, 상세 제품 사양을 필터링 불가능한 메타데이터로 저장할 수 있어요.

필터링 불가능한 메타데이터 키는 벡터 인덱스를 만들 때 명시적으로 구성해야 해요. 인덱스를 만들 때 메타데이터 키를 필터링 불가능으로 지정하면 나중에 필터링 가능으로 바꿀 수 없어요. 벡터 인덱스 하나에 여러 메타데이터 키를 필터링 불가능으로 구성할 수 있으며, 각 메타데이터 키 이름은 63자로 제한돼요. 벡터 인덱스당 허용되는 필터링 불가능한 메타데이터 키의 최대 개수에 대한 자세한 내용은 제한 사항을 참고하세요.

필터링 불가능한 메타데이터로는 필터링을 할 수 없지만, return-metadata 파라미터를 사용해 검색 결과와 함께 가져올 수 있어요. 필터링 불가능한 메타데이터는 다음과 같은 사용 사례에 쓸 수 있어요.

  • 별도의 데이터 소스를 파싱하지 않고 애플리케이션에 맥락을 제공할 때.
  • 필터링 가능한 메타데이터 크기 제한을 초과할 수 있는 더 큰 텍스트 청크를 저장할 때.
  • ListVectors API 작업으로 벡터를 내보낼 때 여기에 포함시킬 때.

필터링 불가능한 메타데이터 구성에 대한 자세한 내용은 벡터 버킷에 벡터 인덱스 만들기를 참고하세요.

더 알아보기 (Learn more)