벡터 일치 필터링

벡터 검색에서 불리언 규칙을 사용하여 벡터 일치 검색을 색인 하위 집합으로 제한할 수 있습니다. 불리언 조건자는 벡터 검색에서 무시할 색인의 벡터를 지정합니다. 이 페이지에서는 필터링이 어떻게 작동하는지, 예시를 보, 벡터 유사성을 기준으로 데이터를 효율적으로 쿼리하는 방법에 대해 알아봅니다.

벡터 검색을 사용하면 범주형 및 숫자 제한으로 결과를 제한할 수 있습니다. 다음 예시와 같이 여러 가지 이유로 제한을 추가하거나 색인 결과를 '필터링'할 수 있습니다.

  • 결과 관련성 향상: 벡터 검색은 의미론적으로 유사한 항목을 찾는 강력한 도구입니다. 필터링을 사용하여 올바른 언어, 카테고리, 가격, 기간이 아닌 항목 등 관련 없는 결과를 검색 결과에서 삭제할 수 있습니다.

  • 결과 수 감소: 벡터 검색은 특히 대규모 데이터 세트의 경우 많은 결과를 반환할 수 있습니다. 필터링을 사용하여 결과 수를 보다 관리하기 쉬운 수로 줄이는 동시에 가장 관련성이 높은 결과를 반환할 수 있습니다.

  • 세분화된 결과: 필터링을 사용하여 사용자의 개별 요구 및 선호도에 따라 검색 결과를 맞춤설정할 수 있습니다. 예를 들어 사용자가 과거의 평점이 높거나 특정 가격대에 속하는 항목만 포함하도록 결과를 필터링할 수 있습니다.

벡터 속성

벡터 데이터베이스에 대한 벡터 유사성 검색에서 각 벡터는 0개 이상의 속성으로 설명됩니다. 이러한 속성을 토큰 제한의 경우 토큰, 숫자 제한의 경우 이라고 합니다. 네임스페이스라고도 하는 여러 가지 속성 카테고리 각각에서 이러한 제한을 적용할 수 있습니다.

다음 예시 애플리케이션에서 벡터는 color, price, shape 태그가 지정됩니다.

  • color, price, shape네임스페이스입니다.
  • redbluecolor 네임스페이스의 토큰입니다.
  • squarecircleshape 네임스페이스의 토큰입니다.
  • 10050price 네임스페이스의 입니다.

벡터 속성 지정

  • '빨간색 원'을 지정하려면 {color: red}, {shape: circle}
  • '빨간색 및 파란색 정사각형'을 지정하려면 {color: red, blue}, {shape: square}
  • 색상 없이 객체를 지정하려면 restricts 필드에서 'color' 네임스페이스를 생략합니다.
  • 객체의 숫자 제한을 지정하려면 네임스페이스와 해당 유형의 적절한 필드에 있는 값을 기록해둡니다. 정수 값은 value_int에 지정되고, 부동 소수점 값은 value_float에 지정되고, double 값은 value_double에 지정되어야 합니다. 지정된 네임스페이스에 숫자 유형 하나만 사용해야 합니다.

이 데이터를 지정하는 데 사용되는 스키마에 대한 자세한 내용은 입력 데이터에 네임스페이스 및 토큰 지정을 참조하세요.

쿼리

  • 쿼리는 네임스페이스 전반에 걸쳐 AND 논리 연산자를 표현하고 각 네임스페이스 내에서 OR 논리 연산자를 표현합니다. {color: red, blue}, {shape: square, circle}을 지정하는 쿼리는 (red || blue) && (square || circle)를 충족하는 모든 데이터베이스 포인트와 일치합니다.
  • {color: red}를 지정하는 쿼리는 shape의 제한사항이 없는 모든 유형의 모든 red 객체와 일치합니다.
  • 쿼리의 숫자 제한에는 namespace, value_int, value_float, value_double의 숫자 값 중 하나와 op 연산자가 필요합니다.
  • 연산자 opLESS, LESS_EQUAL, EQUAL, GREATER_EQUAL, GREATER 중 하나입니다. 예를 들어 LESS_EQUAL 연산자가 사용되는 경우 값이 쿼리에 사용된 값보다 작거나 같으면 데이터 포인트가 사용될 수 있습니다.

다음 코드 예시에서는 샘플 애플리케이션에서 벡터 속성을 식별합니다.

{
  namespace: "price"
  value_int: 20
  op: LESS
}

{
  namespace: "length"
  value_float: 0.3
  op: GREATER_EQUAL
}

{
  namespace: "width"
  value_double: 0.5
  op: EQUAL
}

차단 목록

고급 시나리오를 사용 설정하기 위해 Google은 차다 목록 토큰이라는 부정 형식을 지원합니다. 쿼리가 토큰을 차단 목록에 추가하면 차단 목록에 추가된 토큰이 있는 모든 데이터 포인트와 일치하는 항목이 제외됩니다. 쿼리 네임스페이스에 차단 목록에 추가된 토큰만 있는 경우 명시적으로 차단 목록에 추가되지 않은 모든 포인트는 빈 네임스페이스가 모든 포인트와 정확히 일치하는 동일한 방식으로 일치합니다.

또한 데이터 포인트는 토큰을 차단 목록에 추가하여 해당 토큰을 지정하는 쿼리와 일치하는 항목을 제외할 수 있습니다.

예를 들어 지정된 토큰을 사용하여 다음 데이터 포인트를 정의합니다.

A: {}                  // empty set matches everything
B: {red}               // only a 'red' token
C: {blue}              // only a 'blue' token
D: {orange}            // only an 'orange' token
E: {red, blue}         // multiple tokens
F: {red, !blue}        // deny the 'blue' token
G: {red, blue, !blue}  // An unlikely edge-case
H: {!blue}             // deny-only (similar to empty-set)

시스템은 다음과 같이 작동합니다.

  • 빈 쿼리 네임스페이스는 모두 일치 와일드 카드입니다. 예를 들어 Q:{}는 DB:{color:red}와 일치합니다.
  • 빈 데이터 포인트 네임스페이스는 모두 일치 와일드 카드가 아닙니다. 예를 들어 Q:{color:red}는 DB:{}와 일치하지 않습니다.

    쿼리 및 데이터베이스 포인트

입력 데이터에 네임스페이스 및 토큰 또는 값 지정

전반적인 입력 데이터 구성 방법은 입력 데이터 형식 및 구조를 참조하세요.

다음 탭은 각 입력 벡터와 연관된 네임스페이스 및 토큰을 지정하는 방법을 보여줍니다.

JSON

  • 각 벡터의 레코드에 대해 restricts라는 필드를 추가하여 각각 네임스페이스에 해당하는 객체 배열을 포함합니다.

    • 각 객체에 namespace라는 필드가 포함되어야 합니다. 이 필드는 TokenNamespace.namespace 네임스페이스입니다.
    • allow 필드의 값(있는 경우)은 문자열 배열입니다. 이 문자열 배열은 TokenNamespace.string_tokens 목록입니다.
    • deny 필드의 값(있는 경우)은 문자열 배열입니다. 이 문자열 배열은 TokenNamespace.string_denylist_tokens 목록입니다.

다음은 JSON 형식의 레코드 예시 두 개입니다.

{"id": "42", "embedding": [0.5, 1.0], "restricts": [{"namespace": "class",
"allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace":
"class", "allow": ["dog", "pet"]},{"namespace": "category", "allow":
["canine"]}]}
  • 각 벡터의 레코드에 대해 숫자 제한라는 객체 배열을 포함하는 numeric_restricts라는 필드를 추가합니다.

    • 각 객체에 namespace라는 필드가 포함되어야 합니다. 이 필드는 NumericRestrictNamespace.namespace 네임스페이스입니다.
    • 각 객체에는 value_int, value_float, value_double 중 하나가 있어야 합니다.
    • 각 객체에 op라는 필드가 포함되어야 합니다. 이 필드는 쿼리 전용입니다.

다음은 JSON 형식의 레코드 예시 두 개입니다.

{"id": "42", "embedding": [0.5, 1.0], "numeric_restricts":
[{"namespace": "size", "value_int": 3},{"namespace": "ratio", "value_float": 0.1}]}
{"id": "43", "embedding": [0.6, 1.0], "numeric_restricts": [{"namespace":
"weight", "value_double": 0.3}]}

Avro

Avro 레코드에는 다음 스키마가 사용됩니다.

{
  "type": "record",
  "name": "FeatureVector",
  "fields": [
    {
      "name": "id",
      "type": "string"
    },
    {
      "name": "embedding",
      "type": {
        "type": "array",
        "items": "float"
      }
    },
    {
      "name": "restricts",
      "type": [
        "null",
        {
          "type": "array",
          "items": {
            "type": "record",
            "name": "Restrict",
            "fields": [
              {
                "name": "namespace",
                "type": "string"
              },
              {
                "name": "allow",
                "type": [
                  "null",
                  {
                    "type": "array",
                    "items": "string"
                  }
                ]
              },
              {
                "name": "deny",
                "type": [
                  "null",
                  {
                    "type": "array",
                    "items": "string"
                  }
                ]
              }
            ]
          }
        }
      ]
    },
    {
      "name": "numeric_restricts",
      "type": [
        "null",
        {
          "type": "array",
          "items": {
            "name": "NumericRestrict",
            "type": "record",
            "fields": [
              {
                "name": "namespace",
                "type": "string"
              },
              {
                "name": "value_int",
                "type": [ "null", "int" ],
                "default": null
              },
              {
                "name": "value_float",
                "type": [ "null", "float" ],
                "default": null
              },
              {
                "name": "value_double",
                "type": [ "null", "double" ],
                "default": null
              }
            ]
          }
        }
      ],
      "default": null
    },
    {
      "name": "crowding_tag",
      "type": [
        "null",
        "string"
      ]
    }
  ]
}

CSV

  • 토큰 제한

    • 각 벡터의 레코드에 대해 쉼표로 구분된 쌍을 name=value 형식으로 추가하여 토큰 네임스페이스 제한을 지정합니다. 네임스페이스에 여러 개의 값이 있는 경우 동일한 이름이 반복될 수 있습니다.

      예를 들어 color=red,color=blue는 이 TokenNamespace를 나타냅니다.

      {
        "namespace": "color"
        "string_tokens": ["red", "blue"]
      }
      
    • 각 벡터의 레코드에 대해 쉼표로 구분된 쌍을 name=!value 형식으로 추가하여 토큰 네임스페이스 제한에서 제외되는 값을 지정합니다.

      예를 들어 color=!red는 이 TokenNamespace를 나타냅니다.

      {
        "namespace": "color"
        "string_blacklist_tokens": ["red"]
      }
      
  • 숫자 제한

    • 각 벡터의 레코드에 대해 쉼표로 구분된 쌍을 #name=numericValue 형식으로 숫자 유형 서픽스와 함께 추가하여 숫자 네임스페이스 제한을 지정합니다.

      숫자 유형 서픽스는 int의 i, float의 f, double의 d입니다. 네임스페이스마다 값 하나가 연결되어야 하므로 동일한 이름을 반복하면 안 됩니다.

      예를 들어 #size=3i는 이 NumericRestrictNamespace를 나타냅니다.

      {
        "namespace": "size"
        "value_int": 3
      }
      

      #ratio=0.1f는 이 NumericRestrictNamespace를 나타냅니다.

      {
        "namespace": "ratio"
        "value_float": 0.1
      }
      

      #weight=0.3d는 이 NumericRestriction를 나타냅니다.

      {
        "namespace": "weight"
        "value_double": 0.3
      }
      

다음 단계