추천 필터링

정형 데이터를 사용하는 추천 앱이 있는 경우 문서 필드를 사용하여 추천 결과를 필터링할 수 있습니다. 이 페이지에서는 문서 필드를 사용하여 추천을 특정 문서 집합으로 필터링하는 방법을 설명합니다. 이 페이지의 예시는 미디어 추천에 관한 것이지만 여기에 표시된 원칙은 일반 추천에도 동일하게 적용됩니다. 미디어 추천에 관한 자세한 내용은 미디어용 Vertex AI Search 소개를 참고하세요.

추천 및 데이터 스토어 업데이트 필터링

데이터 스토어를 업데이트한 후에는 모델이 재학습하는 동안 최대 8시간을 기다려야 합니다. 이는 모델이 필터링 가능하도록 구성된 필드 뿐만 아니라 문서 메타데이터의 현재 값을 알아야 하기 때문입니다. 문서 변경사항과 스키마 변경사항이 전파될 때까지 기다려야 합니다. 추천의 경우 검색과 달리 필터링이 실시간으로 이루어지지 않습니다.

필터 및 다각화 설정(미디어 추천만 해당)

필터 외에도 앱의 다각화 설정은 미디어 추천 응답에서 반환되는 결과에도 영향을 미칩니다. 필터와 다각화의 효과가 결합됩니다. 먼저 다각화하고 그다음에 필터링합니다.

규칙 기반의 높은 다양성과 카테고리 기반 속성 필터링을 결합하면 빈 출력이 자주 발생합니다. 다양성이 높으면 앱이 카테고리당 하나의 결과만 반환하도록 제한되기 때문입니다.

예를 들어 토이 스토리를 기반으로 영화를 추천하려고 합니다. 규칙 기반 다양성 수준을 높게 설정했습니다. 다양성 수준이 높기 때문에 여러 영화가 추천될 수 있지만 어린이 영화 카테고리의 경우 하나의 영화(예: 월·E)만 반환됩니다. 아동용 영화 필터를 적용하면 월 E만 추천으로 반환됩니다.

다양성에 관한 일반적인 내용은 미디어 추천 다각화를 참고하세요.

시작하기 전에

추천 앱과 데이터 스토어를 만들었는지 확인합니다. 자세한 내용은 미디어 앱 만들기 또는 일반 추천 데이터 스토어 만들기를 참고하세요.

예시 문서

다음 미디어 예시 문서를 검토하세요. 이 페이지를 읽으면서 이러한 예시 문서를 다시 참조할 수 있습니다.

{"id":"1","schemaId":"default_schema","structData":{"title":"Toy Story (1995)","categories":["Adventure","Animation","Children","Comedy","Fantasy"],"uri":"http://mytestdomain.movie/content/1","available_time":"2023-01-01T00:00:00Z","media_type":"movie"}}
{"id":"88125","schemaId":"default_schema","structData":{"title":"Harry Potter and the Deathly Hallows: Part 2 (2011)","categories":["Action","Adventure","Drama","Fantasy","Mystery","IMAX"],"uri":"http://mytestdomain.movie/content/88125","available_time":"2023-01-01T00:00:00Z","media_type":"movie"}}
{"id":"2857","schemaId":"default_schema","structData":{"title":"Yellow Submarine (1968)","categories":["Adventure","Animation","Comedy","Fantasy","Musical"],"uri":"http://mytestdomain.movie/content/2857","available_time":"2023-01-01T00:00:00Z","media_type":"movie"}}
{"id":"60069","schemaId":"default_schema","structData":{"title":"WALL·E (2008)","categories":["Adventure","Animation","Children","Romance","Sci-Fi"],"uri":"http://mytestdomain.movie/content/60069","available_time":"2023-01-01T00:00:00Z","media_type":"movie"}}

필터 표현식

필터 표현식을 사용하여 추천 필터를 정의합니다.

필터 표현식 구문

다음 확장 Backus–Naur 형식은 추천 필터를 정의하는 데 사용할 수 있는 필터 표현식 구문을 요약합니다.

  # A single expression or multiple expressions that are joined by "AND" or "OR".
  filter = expression, { " AND " | "OR", expression };
  # An expression can be prefixed with "-" or "NOT" to express a negation.
  expression = [ "-" | "NOT " ],
    # A parenthesized expression
    | "(", expression, ")"
    # A simple expression applying to a textual field.
    # Function "ANY" returns true if the field contains any of the literals.
    textual_field, ":", "ANY", "(", literal, { ",", literal }, ")"
    # OR filter by "available"
    available, ":", "true",
  # A literal is any double-quoted string. You must escape backslash (\) and
  # quote (") characters.
  literal = double-quoted string;
  textual_field = see the tables below;

필터 표현식 제한사항

추천의 필터 표현식에는 다음과 같은 제한사항이 적용됩니다.

  • 괄호로 묶은 ANDOR 연산자를 삽입하는 깊이가 제한됩니다. 필터의 논리 표현식은 논리곱 정규형(CNF)이어야 합니다. 지원되는 가장 복잡한 논리 표현식은 (... OR ... OR ...) AND (... OR ...) AND (... OR ...)과 같이 OR 연산자만 포함하는 AND로 연결된 절 목록일 수 있습니다.
  • 표현식은 NOT 키워드 또는 -로 무효화할 수 있습니다. 이는 단일 인수가 있는 ANY() 표현식에서만 작동합니다.
  • available 제한은 최상위 수준에 적용해야 합니다. OR 절이나 부정(NOT)의 일부로 사용할 수 없습니다. available: true만 사용할 수 있습니다.
  • 최상위 AND 절의 최대 조건 수는 20개입니다.
  • OR 절에는 ANY() 표현식에 포함된 인수가 최대 100개까지 포함될 수 있습니다. OR 절에 여러 개의 ANY() 표현식이 있는 경우 해당 인수는 모두 이 한도에 반영됩니다. 예를 들어 categories: ANY("drama", "comedy") OR categories: ANY("adventure")에는 세 개의 인수가 있습니다.

필터 표현식 예시

다음 표에는 유효한 필터 표현식 예시와 잘못된 필터 표현식 예시가 나와 있습니다. 잘못된 예시가 잘못된 이유도 제공합니다.

표현식 유효 참고
language_code: ANY("en", "fr")
NOT language_code: ANY("en")
NOT language_code: ANY("en", "fr") 아니요 두 개 이상의 인수로 ANY()를 무효화합니다.
language_code: ANY("en", "fr") OR categories: ANY("drama")
(language_code: ANY("en") OR language_code: ANY("fr")) AND categories: ANY("drama")
(language_code: ANY("en") AND language_code: ANY("fr")) OR categories: ANY("drama") 아니요 논리곱 정규형이 아닙니다.
(language_code: ANY("en")) AND (available: true)
(language_code: ANY("en")) OR (available: true) 아니요 OR 표현식의 available를 다른 조건과 결합합니다.

다음 필터 표현식은 드라마 또는 액션 카테고리에 있고, 영어가 아닌 언어로 되어 있으며, 사용 가능한 문서를 필터링합니다.

categories: ANY("drama", "action") AND NOT language_code: ANY("en") AND available: true

필터링 한도

각 필터링 가능한 문서 필드는 각 모델의 일부 메모리를 사용합니다. 다음 한도는 서빙 성능에 부정적인 영향을 미치는 것을 막는 데 도움이 됩니다.

  • 스키마에서 최대 10개의 커스텀 필드를 필터링 가능으로 설정할 수 있습니다.

    앱 학습 중에 커스텀 필드가 10개를 초과하는 경우 10개만 사용됩니다.

  • 스키마에 필터링 가능한 필드 값이 최대 100,000,000개까지 존재할 수 있습니다.

    스키마의 문서 수를 필터링 가능한 필드 수로 곱하여 스키마의 필터링 가능한 필드 값의 총 개수를 추정할 수 있습니다. 이 한도를 초과하면 다음과 같은 결과가 발생합니다.

    • 추가 필드를 필터링 가능으로 설정할 수 없습니다.
    • 앱 학습에 실패합니다.

추천 필터링

미디어 추천을 필터링하려면 다음 단계를 따르세요.

  1. 데이터 스토어 ID를 찾습니다. 데이터 스토어 ID가 이미 있는 경우 다음 단계로 건너뜁니다.

    1. Google Cloud 콘솔에서 Agent Builder 페이지로 이동하고 탐색 메뉴에서 데이터 스토어를 클릭합니다.

      데이터 스토어 페이지로 이동

    2. 데이터 스토어 이름을 클릭합니다.

    3. 데이터 스토어의 데이터 페이지에서 데이터 스토어 ID를 가져옵니다.

  2. 필터링할 문서 필드를 결정합니다. 예를 들어 시작하기 전에의 문서에서는 categories 필드를 필터로 사용할 수 있습니다.

  3. categories 필드를 필터링 가능하도록 하려면 다음 단계를 따르세요.

    1. Google Cloud 콘솔에서 Agent Builder 페이지로 이동합니다.

      Agent Builder를 사용하여 이 모든 것을 자체 데이터에 그라운딩하세요.

    2. 추천 앱을 클릭합니다.

    3. 스키마 탭을 클릭합니다. 이 탭에는 현재 필드 설정이 표시됩니다.

    4. 수정을 클릭합니다.

    5. 아직 선택되지 않았으면 카테고리 행에서 필터링 가능 체크박스를 선택한 다음 저장을 클릭합니다.

    6. 스키마 수정사항이 전파될 때까지 6시간 정도 기다립니다. 6시간이 지나면 다음 단계를 진행할 수 있습니다.

  4. categories 필드에서 추천을 가져오고 필터링하려면 명령줄에서 다음 코드를 실행합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d '{
         "userEvent": {
           "eventType": "EVENT_TYPE",
           "userPseudoId": "USER_PSEUDO_ID",
           "documents": {
             "id": "DOCUMENT_ID"
           }
         },
         "params": {
           "returnDocument": true,
           "attributeFilteringSyntax": true,
           "strictFiltering": true
         },
         "filter": "FILTER"
       }' \
    "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/SERVING_CONFIG_ID:recommend"
    
    • PROJECT_ID: 프로젝트의 ID입니다.
    • DATA_STORE_ID: 데이터 스토어의 ID입니다.
    • DOCUMENT_ID: 추천을 미리 보려는 문서의 ID입니다. 데이터를 처리할 때 이 문서에서 사용한 ID를 사용합니다.
    • EVENT_TYPE: 사용자 이벤트 유형입니다. eventType 값은 UserEvent를 참고하세요.
    • USER_PSEUDO_ID: 사용자의 가명 식별자입니다. 이 필드에는 단일 기기의 방문자를 고유하게 식별하는 HTTP 쿠키를 사용할 수 있습니다. 여러 사용자에 대해 이 필드를 동일한 식별자로 설정하지 마세요. 이렇게 하면 이벤트 기록이 결합되고 모델 품질이 저하됩니다. 이 필드에는 개인 식별 정보(PII)를 포함하지 마세요.
    • SERVING_CONFIG_ID: 서빙 구성의 ID입니다. 서빙 구성 ID는 엔진 ID와 동일하므로 여기서는 엔진 ID를 사용하세요.
    • FILTER: 필터 표현식 구문을 사용하여 지정된 필드 집합을 필터링할 수 있는 텍스트 필드입니다. 기본값은 빈 문자열로, 필터가 적용되지 않음을 의미합니다.

    예를 들어 특정 미디어 재생 사용자 이벤트에 대한 추천을 원하고 (1) 아동 카테고리에 있고 (2) 현재 사용 가능한 문서만 포함되도록 추천 결과를 필터링하려고 한다고 가정해 보겠습니다. 호출에 다음 문을 포함하면 됩니다.

    • "eventType": "media-play"
    • "filter": "categories: ANY(\"Children\") AND available: true"

    자세한 내용은 recommend 메서드를 참조하세요.

    클릭하여 응답 예시를 확인하세요.

    위와 같은 추천 요청을 실행하면 다음과 유사한 응답이 표시됩니다. 응답에는 categories 값이 Children이고 availability_start_time 값이 현재 날짜보다 나중에 오는 두 문서가 포함되어 있습니다.

    {
    "results": [
      {
        "id":"1",
        "schemaId":"default_schema",
        "structData":{"title":"Toy Story (1995)","categories":["Adventure","Animation","Children","Comedy","Fantasy"],"uri":"http://mytestdomain.movie/content/1",
        "availability_start_time":"2023-01-01T00:00:00Z",
        "media_type":"movie"
        }
      },
      {
        "id":"60069",
        "schemaId":"default_schema",
        "structData":{"title":"WALL·E (2008)","categories":["Adventure","Animation","Children","Romance","Sci-Fi"],"uri":"http://mytestdomain.movie/content/60069",
        "availability_start_time":"2023-01-01T00:00:00Z",
        "media_type":"movie"
        }
      }
    ],
    "attributionToken": "ChMzMDk3NTQ4MzQxOTcxOTE0ODM1GglhZi10ZXN0LTEiDmFmLXRlc3QtMTE0NTE0KAAwBg",
    "debugInfo": {
      "fallbackModelInvoked": false
    }
    }