본문 바로가기
WIKI 기술 지식 베이스

Judgments

원문 보기 위키 갱신

출처: 문서

본문

판단

판단은 특정 질의와 관련하여 특정 문서에 할당된 관련성 평가예요. 여러 판단이 함께 그룹화되어 판단 목록을 구성해요. 일반적으로 판단은 암시적 판단과 명시적 판단의 두 가지 유형으로 분류돼요:

  • 암시적 판단은 사용자 행동에서 파생된 평가예요(예: 사용자가 검색 후 무엇을 보고 선택했는지?).
  • 명시적 판단은 전통적으로 사람이 생성했지만, 점점 더 많은 대규모 언어 모델(LLM)이 이 작업에 사용되고 있어요.

Search Relevance Workbench(SRW)는 모든 유형의 판단을 지원해요:

  • LLM을 자동 평가자로 사용(LLM-as-a-Judge라고 알려진 접근 방식)하여 프롬프트를 사용해 검색 결과를 평가함으로써 판단을 생성해요.
  • 사용자 행동 인사이트(UBI) 스키마 사양을 준수하는 데이터를 기반으로 암시적 판단을 생성해요.
  • SRW 외부 프로세스를 사용하여 수집된 판단을 가져와요.

LLM-as-a-Judge 사용하기

인간 주석자가 없거나 인간이 제공할 수 있는 것보다 더 많은 판단이 필요할 때 SRW에서 LLM을 사용하여 명시적 판단을 생성해요.

단계별 지침은 Using LLM-as-a-Judge for search relevance를 참조하세요.

사전 요구 사항

LLM-as-a-Judge를 사용하려면 다음 구성 요소를 설정하세요:

  • 판단 생성에 사용할 LLM에 대한 커넥터. 자세한 내용은 Connectors를 참조하세요.
  • 질의 집합: size 매개변수와 함께 질의 집합은 판단 생성 범위를 정의해요. 각 질의에 대해 지정된 인덱스에서 상위 k개의 문서가 검색되며, k는 size 매개변수로 정의돼요.
  • 검색 구성: 검색 구성은 질의-문서 쌍에 사용할 문서를 검색하는 방법을 정의해요.

AI 지원 판단 프로세스는 다음 단계로 구성돼요:

  • 각 질의에 대해 정의된 검색 구성(인덱스 정보 포함)을 사용하여 상위 k개의 문서가 검색돼요. 질의와 결과 목록의 각 문서가 질의-문서 쌍을 만들어요.
  • 그런 다음 미리 정의된 프롬프트로 LLM을 호출하여 각 질의-문서 쌍에 대한 판단을 생성해요.
  • 생성된 모든 판단은 판단 목록에 저장돼요.

판단 목록을 생성하려면 LLM의 모델 ID, 사용 가능한 질의 집합, 생성된 검색 구성을 제공하세요.

다음 예제는 0.0에서 1.0까지의 척도를 가진 일반 프롬프트 템플릿을 사용해요. LLM으로 전송되는 데이터 양(따라서 비용)을 줄이려면 contextFields 매개변수를 사용하여 각 결과에서 포함할 필드를 지정하세요.

PUT _plugins/_search_relevance/judgments
{
    "name":"AI-assisted judgment list",
    "description": "Uses gpt-4o-mini to evaluate product search results",
    "type":"LLM_JUDGMENT",
    "modelId":"N8AE1osB0jLkkocYjz7D",
    "querySetId":"5f0115ad-94b9-403a-912f-3e762870ccf6",
    "searchConfigurationList":["2f90d4fd-bd5e-450f-95bb-eabe4a740bd1"],
    "size":5,
    "contextFields": ["title", "description", "category"],
    "llmJudgmentRatingType": "SCORE0_1",
    "promptTemplate": "Rate the relevance of these search results {% raw %}{{hits}}{% endraw %} for the query '{% raw %}{{queryText}}{% endraw %}' on a scale of 0-1, where 0 is completely irrelevant and 1 is perfectly relevant. Consider the product title, description, and category."
}

{% include copy-curl.html %}

요청 본문 필드

다음 표는 LLM 기반 판단 생성을 위한 매개변수를 나열해요.

매개변수 데이터 유형 설명
name String 판단 목록의 이름이에요.
description String 선택사항. 판단 목록에 대한 설명이에요.
type String LLM_JUDGMENT로 설정하세요.
modelId String 판단 생성에 사용할 배포된 기계 학습(ML) 모델의 ID예요. 외부 LLM 서비스에 연결된 원격 모델이어야 해요.
querySetId String 평가할 질의가 포함된 질의 집합의 ID예요.
searchConfigurationList Array of strings 평가할 문서를 검색하는 데 사용할 검색 구성 ID 목록이에요.
size Integer 각 질의에 대해 검색하고 평가할 상위 문서 수예요. 기본값은 10이에요.
tokenLimit Integer 단일 요청에서 LLM으로 전송할 최대 토큰 수예요. 총 콘텐츠가 이 제한을 초과할 때 문서를 배치하는 데 사용돼요. 기본값은 4,000이에요.
contextFields Array of strings 선택사항. LLM으로 콘텐츠를 보낼 때 포함할 문서 필드를 지정해요. 지정하지 않으면 전체 문서 소스가 전송돼요. 이 매개변수를 사용하여 비용을 줄이고 LLM이 관련 필드에 집중하도록 해요.
ignoreFailure Boolean LLM이 일부 문서에 대한 판단을 생성하지 못할 경우 다른 문서 처리를 계속할지 여부예요. 기본값은 false예요.
llmJudgmentRatingType String 사용할 평가 척도 유형이에요. 유효한 값은 SCORE0_1(숫자 척도 0-1)과 RELEVANT_IRRELEVANT(이진 관련/관련 없음)예요. NDCG와 같은 등급 관련 메트릭에는 SCORE0_1을 사용해요. 정밀도 및 재현율과 같은 이진 메트릭에는 RELEVANT_IRRELEVANT를 사용해요.
promptTemplate String 선택사항. LLM에 대한 사용자 정의 프롬프트 템플릿이에요. {% raw %}{{queryText}}{% endraw %} 및 {% raw %}{{hits}}{% endraw %} 플레이스홀더를 지원해요. 제공되지 않으면 기본 템플릿이 사용돼요.
existingJudgments Array of strings 선택사항. 평가가 재사용되는 최대 5개의 기존 판단 ID 목록이에요. 각 질의-문서 쌍에 대해 SRW는 이 판단들을 순서대로 확인하여 처음 일치하는 항목의 평가를 사용해요. 이러한 판단 중 어느 것에도 기존 평가가 없는 쌍만 LLM으로 전송되어 평가돼요.
overwriteCache Boolean 선택사항. 더 이상 사용되지 않아요. 허용되지만 무시돼요. 전역 판단 캐시가 제거되었어요.

실패한 판단 요청 재시도

판단을 생성하면 각 질의-문서 쌍에 대해 하나의 LLM 요청이 전송돼요. 대규모에서는 간헐적인 실패가 예상돼요. 예를 들어, 제공자가 요청을 제한하거나 요청 시간이 초과될 수 있어요. 이러한 요청을 자동으로 재시도하려면 판단에 사용하는 커넥터의 client_config 설정(max_retry_times, retry_backoff_policy 및 관련 옵션)을 사용하여 재시도를 구성하세요. 자세한 내용은 Connector blueprints를 참조하세요.

실패한 문서 재시도

이 섹션은 LLM_JUDGMENT 목록에만 적용돼요.

일부 문서가 평가를 받지 못했더라도 판단 목록이 COMPLETED 상태로 완료될 수 있어요. 예를 들어 LLM 제공자가 해당 요청을 제한하거나 시간 초과했기 때문이에요. 평가되지 않은 문서는 각 질의의 failures 배열에 나타나고, 실행의 전체 개수는 판단 목록의 metadata 필드에 나타나요(판단 목록 보기 참조). 전체 판단 목록을 다시 생성하는 대신 판단 목록의 ID로 _retry 엔드포인트에 POST 요청을 보내 실패한 문서만 재시도할 수 있어요.

엔드포인트

POST _plugins/_search_relevance/judgments/{judgment_list_id}/_retry

경로 매개변수

다음 표는 사용 가능한 경로 매개변수를 나열해요.

매개변수 데이터 유형 설명
judgment_list_id String 재시도하려는 실패한 문서가 있는 판단 목록의 ID예요.

예제 요청

POST _plugins/_search_relevance/judgments/b54f791a-3b02-49cb-a06c-46ab650b2ade/_retry

{% include copy-curl.html %}

예제 응답

{
  "judgment_id": "b54f791a-3b02-49cb-a06c-46ab650b2ade",
  "status": "RETRYING",
  "message": "Retrying failed documents"
}

재시도는 비동기적으로 실행되며 이전에 실패한 문서에 대해서만 새 평가를 생성해요. 이미 성공한 평가는 변경되지 않아요. 응답은 즉시 RETRYING 상태로 반환돼요. 진행 상황을 추적하려면 판단 목록을 검색하고 status를 확인하세요(판단 목록 보기 참조). 개별 문서가 여전히 평가를 받지 못하면(예: LLM 제공자가 여전히 요청을 제한하는 경우) 판단 목록의 status가 COMPLETED로 돌아와요. failures 배열과 metadata 필드를 확인하여 어떤 문서가 여전히 평가되지 않았는지 확인하세요. 재시도 프로세스 자체가 실패하면(예: 내부 오류로 인해) 판단 목록의 status가 ERROR가 돼요.

상태 값

다음 표는 판단 목록의 가능한 status 값을 나열해요.

상태 설명
PROCESSING 판단 목록이 생성 중이에요.
COMPLETED 생성(또는 재시도)이 완료되었어요. 일부 문서가 여전히 평가되지 않았을 수 있어요. failures 배열과 metadata 필드를 확인하여 문서 평가를 확인하세요.
RETRYING 이전에 실패한 문서의 재시도가 진행 중이에요.
ERROR 재시도 프로세스 자체가 내부적으로 실패했어요. 이는 개별 문서가 평가를 받지 못하는 것과는 별개이며, 개별 문서 실패는 여전히 COMPLETED 상태가 돼요.

사용자 정의 프롬프트 템플릿

프롬프트 템플릿을 사용자 정의하여 관련성의 특정 측면에 집중할 수 있어요:

PUT /_plugins/_search_relevance/judgments
{
  "name": "Custom Prompt Judgment",
  "type": "LLM_JUDGMENT",
  "modelId": "MODEL_ID_HERE",
  "querySetId": "QUERY_SET_ID_HERE",
  "searchConfigurationList": ["SEARCH_CONFIGURATION_ID_HERE"],
  "promptTemplate": "As an e-commerce search expert, evaluate how well these products {% raw %}{{hits}}{% endraw %} match the user's search for '{% raw %}{{queryText}}{% endraw %}'. Consider product relevance, brand reputation, and price competitiveness. Rate each result from 0-1.",
  "llmJudgmentRatingType": "SCORE0_1"
}

{% include copy-curl.html %}

이진 관련성 판단

더 간단한 관련성 평가를 위해 이진(관련/관련 없음) 판단을 사용할 수 있어요:

PUT /_plugins/_search_relevance/judgments
{
  "name": "Binary LLM Judgment",
  "type": "LLM_JUDGMENT",
  "modelId": "MODEL_ID_HERE",
  "querySetId": "QUERY_SET_ID_HERE",
  "searchConfigurationList": ["SEARCH_CONFIGURATION_ID_HERE"],
  "llmJudgmentRatingType": "RELEVANT_IRRELEVANT",
  "promptTemplate": "Determine if these search results {% raw %}{{hits}}{% endraw %} are relevant or irrelevant for the query '{% raw %}{{queryText}}{% endraw %}'. Consider exact matches and semantic relevance."
}

{% include copy-curl.html %}

다른 LLM 제공자 사용

LLM-as-a-Judge는 ML Commons 커넥터를 사용하여 연결할 수 있는 모든 LLM 제공자와 작동해요. OpenAI, Azure OpenAI, DeepSeek, Ollama, Google Gemini, Amazon Bedrock에 대한 블루프린트를 사용할 수 있어요. 자세한 내용은 OpenSearch-provided connector blueprints를 참조하세요.

Amazon Bedrock 예제

다음 예제는 Amazon Bedrock에서 Anthropic Claude 모델에 대한 커넥터를 생성해요:

POST /_plugins/_ml/connectors/_create
{
    "name": "Amazon Bedrock Anthropic Claude",
    "description": "Anthropic Claude via Bedrock for SRW LLM judgments",
    "version": 1,
    "protocol": "aws_sigv4",
    "credential": {
        "access_key": "<YOUR AWS ACCESS KEY>",
        "secret_key": "<YOUR AWS SECRET KEY>"
    },
    "parameters": {
        "region": "<YOUR AWS REGION>",  // example: us-east-1
        "service_name": "bedrock",
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 8000,
        "model": "<INFERENCE_PROFILE_ID>"  // example: us.anthropic.claude-haiku-4-5-20251001-v1:0
    },
    "client_config": {
        "max_retry_times": 3,
        "retry_backoff_policy": "exponential_full_jitter"
    },
    "actions": [
        {
            "action_type": "predict",
            "method": "POST",
            "headers": {
                "content-type": "application/json"
            },
            "url": "https://bedrock-runtime.${parameters.region}.amazonaws.com/model/${parameters.model}/invoke",
            "request_body": "{\"anthropic_version\":\"${parameters.anthropic_version}\",\"max_tokens\":${parameters.max_tokens},\"system\":\"${parameters.system_prompt}\",\"messages\":[{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"${parameters.user_prompt}\"}]}]}",
            "post_process_function": "def text = params.content[0].text; return '{\"name\":\"response\",\"dataAsMap\":{\"response\":\"' + escape(text) + '\"}}'"
        }
    ]
}

{% include copy-curl.html %}

암시적 판단

암시적 판단은 과거 사용자 상호작용에서 파생돼요. SRW는 Clicks Over Expected Clicks(COEC) 클릭 모델을 지원하며, 이 모델은 노출 및 클릭 신호를 사용하여 판단을 계산해요.

입력 데이터는 UBI 인덱스 스키마를 따라야 해요. COEC는 ubi_events 인덱스에서 action_name이 impression 또는 click인 모든 이벤트를 사용해요. 다른 이름의 인덱스에서 읽으려면 ubiEventsIndex 매개변수를 사용하세요.

COEC는 ubi_events의 모든 이벤트를 기반으로 각 순위에서 관찰된 총 노출 수로 총 클릭 수를 나누어 각 순위에 대한 예상 클릭률(CTR)을 계산해요. 이 비율은 해당 위치의 예상 CTR을 나타내요.

질의 후 히트 목록에 표시된 각 문서에 대해 해당 순위의 평균 CTR이 질의-문서 쌍의 예상 값으로 사용돼요. COEC는 질의-문서 쌍의 실제 CTR을 계산하고 이를 예상 순위 기반 CTR로 나누어요. 결과적으로 해당 순위의 평균보다 CTR이 높은 질의-문서 쌍은 1보다 큰 판단 값을 가져요. 반대로 CTR이 평균보다 낮으면 판단 값이 1보다 작아요.

추적 구현에 따라 단일 질의에 대한 여러 클릭이 ubi_events 인덱스에 기록될 수 있어요. 결과적으로 평균 CTR이 1(또는 100%)을 초과할 수 있어요. {: .note}

다른 위치에서 발생하는 질의-문서 관측의 경우 모든 노출과 클릭이 가장 낮은(최상의) 위치에서 발생한 것으로 가정돼요. 이 집계 방식은 최종 판단을 더 낮은 값으로 편향시키며, 이는 상위 순위 결과가 일반적으로 더 높은 CTR을 받는 일반적인 추세를 반영해요. {: .note}

예제 요청

다음 예제는 COEC 클릭 모델을 사용하여 암시적 판단 목록을 생성해요:

PUT _plugins/_search_relevance/judgments
{
  "name": "Implicit Judgments",
  "clickModel": "coec",
  "type": "UBI_JUDGMENT",
  "maxRank": 20
}

{% include copy-curl.html %}

요청 본문 필드

다음 표는 암시적 판단 생성을 위한 매개변수를 나열해요.

매개변수 데이터 유형 설명
name String 판단 목록의 이름이에요.
clickModel String 암시적 판단을 계산하는 데 사용되는 모델이에요. coec(Clicks Over Expected Clicks)만 지원돼요.
type String UBI_JUDGMENT로 설정하세요.
maxRank Integer 판단 계산에 이벤트를 포함할 때 고려할 최대 순위예요.
startDate Date 선택사항. 암시적 판단 생성을 위해 행동 데이터 이벤트를 고려하는 시작 날짜예요. 형식은 yyyy-MM-dd예요.
endDate Date 선택사항. 암시적 판단 생성을 위해 행동 데이터 이벤트를 고려하는 종료 날짜예요. 형식은 yyyy-MM-dd예요.
ubiEventsIndex String 선택사항. 분석할 UBI 이벤트가 포함된 인덱스의 이름이에요. 기본값은 ubi_events예요. UBI 이벤트가 다른 이름의 인덱스에 저장된 경우 이 매개변수를 지정하세요.

판단 가져오기

판단 생성을 위한 외부 프로세스가 이미 있을 수 있어요. 판단 유형이나 생성 방식에 관계없이 SRW로 가져올 수 있어요.

예제 요청

다음 예제는 두 질의에 대한 판단 집합을 가져와요:

PUT _plugins/_search_relevance/judgments
{
  "name": "Imported Judgments",
  "description": "Judgments generated outside SRW",
  "type": "IMPORT_JUDGMENT",
  "judgmentRatings": [
    {
      "query": "red dress",
        "ratings": [
          {
                    "docId": "B077ZJXCTS",
                    "rating": "3.000"
          },
          {
                    "docId": "B071S6LTJJ",
                    "rating": "2.000"
          },
          {
                    "docId": "B01IDSPDJI",
                    "rating": "2.000"
          },
          {
                    "docId": "B07QRCGL3G",
                    "rating": "0.000"
          },
          {
                    "docId": "B074V6Q1DR",
                    "rating": "1.000"
          }
        ]
      },
      {
        "query": "blue jeans",
        "ratings": [
          {
                    "docId": "B07L9V4Y98",
                    "rating": "0.000"
          },
          {
                    "docId": "B01N0DSRJC",
                    "rating": "1.000"
          },
          {
                    "docId": "B001CRAWCQ",
                    "rating": "1.000"
          },
          {
                    "docId": "B075DGJZRM",
                    "rating": "2.000"
          },
          {
                    "docId": "B009ZD297U",
                    "rating": "2.000"
          }
        ]
      }
  ]
}

{% include copy-curl.html %}

요청 본문 필드

다음 표는 판단 가져오기를 위한 매개변수를 나열해요.

매개변수 데이터 유형 설명
name String 판단 목록의 이름이에요.
description String 선택사항. 판단 목록에 대한 설명이에요.
type String IMPORT_JUDGMENT로 설정하세요.
judgmentRatings Array 판단을 포함하는 JSON 객체 목록이에요. 판단은 질의별로 그룹화되며, 각 그룹은 문서 ID(docId)를 키로 하고 부동 소수점 평가를 값으로 하는 중첩 맵을 포함해요.

판단 목록 관리

다음 API를 사용하여 판단 목록을 조회하거나 삭제할 수 있어요.

판단 목록 조회

ID로 판단 목록을 조회해요.

엔드포인트

GET _plugins/_search_relevance/judgments/{judgment_list_id}

경로 매개변수

다음 표는 사용 가능한 경로 매개변수를 나열해요.

매개변수 데이터 타입 설명
judgment_list_id String 조회할 판단 목록의 ID예요.

요청 예시

GET _plugins/_search_relevance/judgments/b54f791a-3b02-49cb-a06c-46ab650b2ade

{% include copy-curl.html %}

응답 예시

응답
{
  "took": 36,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "search-relevance-judgment",
        "_id": "b54f791a-3b02-49cb-a06c-46ab650b2ade",
        "_score": 1,
        "_source": {
          "id": "b54f791a-3b02-49cb-a06c-46ab650b2ade",
          "timestamp": "2025-06-11T06:07:23.766Z",
          "name": "LLM Judgments",
          "status": "COMPLETED",
          "type": "LLM_JUDGMENT",
          "metadata": {
            "totalQueries": 2,
            "successfulQueries": 1,
            "failedQueries": 1,
            "lastFailureReason": "Rate limit exceeded"
          },
          "judgmentRatings": [
            {
              "query": "red dress",
              "ratings": [
                {
                  "rating": "3.000",
                  "docId": "B077ZJXCTS"
                },
                {
                  "rating": "2.000",
                  "docId": "B071S6LTJJ"
                },
                {
                  "rating": "0.000",
                  "docId": "B07QRCGL3G"
                },
                {
                  "rating": "1.000",
                  "docId": "B074V6Q1DR"
                }
              ],
              "failures": [
                {
                  "docId": "B01IDSPDJI"
                }
              ]
            },
            {
              "query": "blue jeans",
              "ratings": [
                {
                  "rating": "0.000",
                  "docId": "B07L9V4Y98"
                },
                {
                  "rating": "1.000",
                  "docId": "B01N0DSRJC"
                },
                {
                  "rating": "1.000",
                  "docId": "B001CRAWCQ"
                },
                {
                  "rating": "2.000",
                  "docId": "B075DGJZRM"
                },
                {
                  "rating": "2.000",
                  "docId": "B009ZD297U"
                }
              ]
            }
          ]
        }
      }
    ]
  }
}

평가되지 않은 문서는 각 쿼리의 failures 배열에 나타나요. 실행의 전체 개수는 판단 목록의 metadata 필드에 나타나요. LLM_JUDGMENT 목록에서 실패한 문서만 재시도하려면 실패한 문서 재시도를 참조하세요.

판단 목록 삭제

ID로 판단 목록을 삭제해요.

엔드포인트

DELETE _plugins/_search_relevance/judgments/{judgment_list_id}

요청 예시

DELETE _plugins/_search_relevance/judgments/b54f791a-3b02-49cb-a06c-46ab650b2ade

{% include copy-curl.html %}

응답 예시

{
  "_index": "search-relevance-judgment",
  "_id": "b54f791a-3b02-49cb-a06c-46ab650b2ade",
  "_version": 3,
  "result": "deleted",
  "forced_refresh": true,
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 156,
  "_primary_term": 1
}

판단 목록 검색

쿼리 도메인 특화 언어(DSL)를 사용하여 판단 목록을 검색해요. 응답은 기본적으로 judgmentRatings.ratings를 제외해요. 포함하려면 쿼리에서 _source 필드를 지정하세요.

엔드포인트

GET _plugins/_search_relevance/judgments/_search
POST _plugins/_search_relevance/judgments/_search

요청 예시

다음 예시는 정확한 쿼리 red dress를 포함하는 판단 목록을 검색해요.

GET _plugins/_search_relevance/judgments/_search
{
  "query": {
    "nested": {
      "path": "judgmentRatings",
      "query": {
        "match_phrase": {
          "judgmentRatings.query": "red dress"
        }
      }
    }
  }
}

{% include copy-curl.html %}

응답 예시

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 4.5558767,
    "hits": [
      {
        "_index": "search-relevance-judgment",
        "_id": "505d00cf-2fce-422b-bb97-2e3a95ce9446",
        "_score": 4.5558767,
        "_source": {
          "metadata": {},
          "name": "Imported Judgments",
          "judgmentRatings": [
            {
              "query": "red dress"
            },
            {
              "query": "blue jeans"
            }
          ],
          "id": "505d00cf-2fce-422b-bb97-2e3a95ce9446",
          "type": "IMPORT_JUDGMENT",
          "timestamp": "2026-01-28T18:16:44.218Z",
          "status": "COMPLETED"
        }
      }
    ]
  }
}

관련 문서

더 알아보기 (Learn more)