Python을 사용하여 일괄 처리 평가 구현

Completed

팁 (조언)

자세한 내용은 텍스트 및 이미지 탭을 참조하세요.

클라우드 평가를 사용하면 Microsoft Foundry의 전체 테스트 데이터 세트에 걸쳐 여러 평가자를 실행하여 체계적인 품질 평가를 수행할 수 있습니다. 이러한 자동화된 평가는 로컬 컴퓨팅 인프라를 관리하고 대규모 자동화된 테스트 워크플로를 지원할 필요가 없습니다.

Adventure Works는 배포 전에 프롬프트 업데이트의 유효성을 검사하기 위해 여러 품질 기준에 대해 500개의 테스트 예제를 평가해야 합니다. Foundry SDK를 사용한 클라우드 평가는 이 작업을 효율적으로 완료하여 계산기를 병렬로 실행하고 분석을 위해 결과를 저장합니다.

비고

클라우드 평가에는 Microsoft Foundry SDK(azure-ai-projects>=2.0.0b1) 및 인증이 DefaultAzureCredential()필요합니다. SDK는 평가 작업을 통해 project_client.get_openai_client() OpenAI 호환 클라이언트를 제공합니다.

데이터 스키마 및 계산기 정의

클라우드 평가는 평가자를 실행하기 전에 데이터 구조를 이해해야 합니다. JSONL 데이터 세트의 필드를 설명하고 실행할 평가자를 지정하는 데이터 원본 구성 을 통해 이 구조를 정의합니다.

데이터 스키마가 필요한 이유:

데이터 스키마는 평가 서비스에 데이터 세트에 존재하는 필드와 필요한 필드를 알려줍니다. 데이터 스키마는 실행 전에 유효성 검사를 사용하도록 설정하고 서비스에서 올바른 리소스를 할당하는 데 도움이 됩니다. 데이터와 평가 서비스 간의 계약으로 간주합니다.

from openai.types.eval_create_params import DataSourceConfigCustom

data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
            "response": {"type": "string"},
            "context": {"type": "string"},
            "ground_truth": {"type": "string"},
        },
        "required": ["query", "response"],  # Only these fields must be present
    },
)

데이터 매핑을 사용하여 계산기를 구성합니다.

데이터 스키마를 정의한 후 실행할 평가자와 데이터에 액세스하는 방법을 지정합니다. 목록에는 testing_criteria 계산기 구성이 포함됩니다. 각 항목은 데이터 세트에 대해 실행할 하나의 계산기를 정의합니다.

각 평가자는 testing_criteria 다음을 지정합니다.

  • 계산기 이름: 사용할 기본 제공 계산기(예: builtin.intent_resolution)입니다.
  • 초기화 매개 변수: AI 지원 평가에 사용할 모델 배포와 같은 구성
  • 데이터 매핑: 구문을 사용하여 데이터 세트 필드를 계산기 매개 변수에 {{item.field}} 연결하는 방법

데이터 매핑은 중요합니다. 각 평가자는 필요한 입력을 찾을 위치를 알려줍니다. 구문은 {{item.field}} JSONL 데이터 세트의 필드를 참조합니다.

testing_criteria = [
    {
        "type": "azure_ai_evaluator",
        "name": "intent_resolution",  # Your name for this evaluator in results
        "evaluator_name": "builtin.intent_resolution",  # The built-in evaluator to use
        "initialization_parameters": {
            "deployment_name": model_deployment_name  # Which model to use for evaluation
        },
        "data_mapping": {
            "query": "{{item.query}}",  # Map dataset's "query" field to evaluator's "query" parameter
            "response": "{{item.response}}",  # Map dataset's "response" field to evaluator's "response" parameter
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "groundedness",
        "evaluator_name": "builtin.groundedness",
        "initialization_parameters": {
            "deployment_name": model_deployment_name
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
            "context": "{{item.context}}",  # Groundedness needs context to verify claims
        },
    },
]

중요합니다

필드 이름은 data_mapping 대/소문자를 구분하며 JSONL 데이터 세트와 정확히 일치해야 합니다. 데이터 세트에 "Question"(대문자)이 있는데 "{{item.question}}"를 소문자로 지정하면 평가는 실패합니다. 항상 데이터 스키마와 데이터 매핑 간에 필드 이름이 일치하는지 확인합니다.

평가 정의 만들기 및 실행

클라우드 평가는 평가 정의 (평가할 정의 및 방법)를 평가 실행 (특정 데이터 세트에 대해 실행)과 구분합니다. 이렇게 분리하면 다시 사용할 수 있습니다. 평가 조건을 한 번 정의한 다음 다른 데이터 세트 또는 버전에 대해 여러 번 실행합니다.

평가 정의 만들기:

평가 정의는 재사용 가능한 템플릿입니다. 데이터 스키마를 테스트 조건과 결합하지만 아직 특정 데이터 세트를 참조하지는 않습니다.

# Create the evaluation definition
eval_object = client.evals.create(
    name="adventure-works-prompt-evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

print(f"Created evaluation: {eval_object.id}")

평가 실행 만들기:

평가 실행은 특정 데이터 세트에 대해 평가 정의를 실행합니다. 이전 단원의 ID로 업로드된 데이터 세트를 참조합니다.

from openai.types.evals.create_eval_jsonl_run_data_source_param import (
    CreateEvalJSONLRunDataSourceParam,
    SourceFileID,
)

# Create a run using the uploaded dataset
eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="prompt-v2-evaluation",
    data_source=CreateEvalJSONLRunDataSourceParam(
        type="jsonl",
        source=SourceFileID(
            type="file_id",
            id=data_id,  # Dataset ID from upload
        ),
    ),
)

print(f"Started evaluation run: {eval_run.id}")
print(f"Status: {eval_run.status}")

실행 중에 발생하는 작업:

실행을 생성할 때 평가 서비스는 다음과 같은 작업을 수행합니다.

  1. 클라우드 스토리지에서 데이터 세트 로드
  2. 스키마에 대한 데이터 유효성 검사
  3. 평가자 간에 병렬로 평가 작업 분산
  4. Foundry 프로젝트에 결과 저장
  5. 시각화를 위한 웹 기반 보고서 생성

팁 (조언)

평가 실행은 비동기적이며 큰 데이터 세트에 몇 분 정도 걸릴 수 있습니다. 서비스는 재시도, 속도 제한 및 병렬 실행을 자동으로 처리합니다. 실행 상태를 폴링하여 결과가 준비되면 알 수 있습니다.

작업 완료를 폴링하고 결과를 검색합니다

평가 실행은 클라우드에서 비동기적으로 실행됩니다. 결과를 검색하기 전에 완료될 때까지 실행 상태를 폴링해야 합니다.

폴링이 필요한 이유:

여러 평가자가 있는 큰 데이터 세트를 완료하는 데 몇 분 정도 걸릴 수 있습니다. 평가 서비스는 병렬 작업자 간에 작업을 분산하고, 모델 배포를 사용하여 속도 제한을 처리하고, 실패한 요청을 자동으로 다시 시도합니다. 폴링을 사용하면 네트워크 호출을 차단하지 않고도 스크립트가 효율적으로 대기할 수 있습니다.

import time

while True:
    run = client.evals.runs.retrieve(
        run_id=eval_run.id,
        eval_id=eval_object.id
    )
    if run.status in ("completed", "failed"):
        break
    time.sleep(5)  # Check every 5 seconds
    print("Waiting for evaluation run to complete...")

print(f"Evaluation completed with status: {run.status}")

중요합니다

오류 처리: "실패"인 경우 run.status 실행 개체의 오류 세부 정보를 확인합니다. 일반적인 오류에는 모델 할당량 부족, 잘못된 데이터 매핑 또는 데이터 세트 액세스 문제가 포함됩니다. 평가 서비스는 문제를 진단하는 데 도움이 되는 자세한 오류 메시지를 제공합니다.

자세한 결과를 검색합니다.

완료되면 데이터 세트의 각 항목에 대해 점수가 매기된 결과를 검색합니다.

# Get detailed results for each item
output_items = list(
    client.evals.runs.output_items.list(
        run_id=run.id,
        eval_id=eval_object.id
    )
)

print(f"Retrieved {len(output_items)} evaluation results")
print(f"View detailed report: {run.report_url}")

계산기 출력 이해:

모든 평가자는 평가된 각 항목에 대해 표준화된 스키마를 반환합니다.

  • 레이블: 단위 테스트의 출력과 유사한 이진 "pass" 또는 "fail" 레이블을 사용하여 평가자 간의 신속한 비교를 수행합니다.
  • 점수: 평가자의 자연 규모에서 점수 매기기(품질 평가자의 경우 1-5, 안전 평가자의 경우 0-7, 유사성 메트릭의 경우 0-1)
  • 임계값: 점수에서 통과/실패를 결정하는 기본 임계값(이를 재정의할 수 있음)
  • 이유: 점수에 대한 설명(LLM-판사 평가자에만 해당)
  • 세부 정보: 디버깅에 대한 선택적 추가 정보(tool_call_accuracy 같은 일부 평가기의 경우)

전체 데이터 세트의 집계 결과를 보려면 전체 통과/실패 횟수에 대한 run.result_counts 및 평가자별 분석을 위한 run.per_testing_criteria_results에 액세스하세요.

팁 (조언)

report_url 필터링, 정렬 및 시각화 도구를 사용하여 Foundry 포털에서 결과를 볼 수 있습니다. CI/CD 워크플로 내에서 구문 output_items 을 프로그래밍 방식으로 분석함으로써 품질 게이트를 효과적으로 적용할 수 있습니다.

다음 단원에서는 이러한 평가 워크플로를 GitHub Actions에 통합하여 모든 코드 변경에 대한 품질 보증을 자동화하는 방법을 알아봅니다.