Home > EulerWeave > Tutorials > 튜토리얼 8: 메트릭 블록 사용하기

튜토리얼 8: 메트릭 블록 사용하기

eulerweave의 metrics 슬롯을 사용하면 파이프라인 실행 중 데이터셋 품질 통계를 자동으로 수집할 수 있습니다. 메트릭 블록은 레코드를 변경하지 않으며(pass-through), 결과를 아티팩트 디렉터리에 JSON 파일로 저장합니다.

사전 요구 사항: 튜토리얼 1: 빠른 시작을 완료했어야 합니다.


사용 가능한 메트릭 블록

블록 타입 설명
metrics_text_basic 텍스트 길이 분포, 빈 텍스트 비율, 문자셋 통계
metrics_quality_heuristic URL/반복/알파벳숫자/한글 비율 분석
metrics_dedup_report 중복 감지율, 제거율, 상위 클러스터 리포트
metrics_task_format_validate SFT/DPO 메시지 형식 유효성 검사
metrics_text_distribution 텍스트 분포 상세 분석
metrics_language_heuristic 언어별 비율 분석
metrics_text_repetition n-gram 반복률 (char 3-gram, word 5-gram, line dup)
metrics_text_gibberish 기호/숫자/공백 이상, unicode 엔트로피, gibberish 감지
metrics_text_boilerplate 웹 보일러플레이트 패턴 감지 (쿠키, 네비, CTA)
metrics_perplexity HuggingFace Transformers 기반 perplexity/loss 점수 (Qwen3-0.6B, gpt2 등)
metrics_token_stats 토큰 수 통계 (평균, 중앙값, p95, TTR 어휘 다양성)
metrics_pii_detect PII 패턴 탐지 (이메일, 전화번호, SSN, 신용카드, IP)
metrics_record_schema_validate 레코드 스키마 일관성 검증 (빈 텍스트, null 필드 감지)

1단계: 매니페스트에 메트릭 추가

메트릭 블록은 metrics 슬롯에 속하며, enrich 이후 build_task 이전에 배치합니다:

version: 1
track: sft
inputs:
  - type: jsonl
    uri: data/train.jsonl

pipeline:
  - id: norm1
    type: normalize_text
    slot: normalize
    input_type: TextDocument
    output_type: TextDocument

  - id: filter1
    type: heuristic_filter
    slot: filter
    input_type: TextDocument
    output_type: TextDocument

  - id: m1
    type: metrics_text_basic
    slot: metrics
    input_type: TextDocument
    output_type: TextDocument

  - id: m2
    type: metrics_quality_heuristic
    slot: metrics
    input_type: TextDocument
    output_type: TextDocument

  - id: sft1
    type: build_sft_messages
    slot: build_task
    input_type: TextDocument
    output_type: SFTMessages

  - id: exp1
    type: export_jsonl
    slot: export
    input_type: SFTMessages
    output_type: ExportedDataset

exports:
  - type: jsonl
    path: out/result.jsonl

핵심 사항:


2단계: 실행 및 결과 확인

eulerweave run manifest.yaml --input data/train.jsonl

실행 완료 후, 아티팩트 디렉터리에 메트릭 결과가 저장됩니다:

artifacts/{run_id}/
  metrics/
    metrics_text_basic.json
    metrics_quality_heuristic.json
  report.json

3단계: 메트릭 결과 해석

metrics_text_basic.json

{
  "metric_name": "metrics_text_basic",
  "version": "1.0",
  "computed_at": "2026-02-26T12:00:00Z",
  "summary": {
    "record_count": 1000,
    "empty_text_count": 5,
    "avg_length": 245.3,
    "p50_length": 200,
    "p95_length": 580,
    "max_length": 1500,
    "ascii_ratio": 0.92
  },
  "warnings": [],
  "params": {}
}

해석 가이드:

metrics_quality_heuristic.json

{
  "metric_name": "metrics_quality_heuristic",
  "summary": {
    "avg_url_ratio": 0.02,
    "avg_repeat_ratio": 0.05,
    "avg_alnum_ratio": 0.85,
    "avg_hangul_ratio": 0.0
  }
}

해석 가이드:

metrics_text_repetition.json

{
  "metric_name": "metrics_text_repetition",
  "summary": {
    "record_count": 1000,
    "analyzed_count": 1000,
    "avg_char_3gram_dup_ratio": 0.12,
    "avg_word_5gram_dup_ratio": 0.05,
    "avg_line_dup_ratio": 0.03
  }
}

해석 가이드:

metrics_text_gibberish.json

{
  "metric_name": "metrics_text_gibberish",
  "summary": {
    "record_count": 1000,
    "analyzed_count": 1000,
    "avg_symbol_ratio": 0.05,
    "avg_digit_ratio": 0.03,
    "avg_whitespace_anomaly": 0.01,
    "unicode_category_entropy": 2.8,
    "gibberish_suspect_count": 12
  }
}

해석 가이드:

metrics_text_boilerplate.json

{
  "metric_name": "metrics_text_boilerplate",
  "summary": {
    "record_count": 1000,
    "analyzed_count": 1000,
    "avg_boilerplate_line_ratio": 0.08,
    "nav_pattern_count": 15,
    "cookie_pattern_count": 8,
    "cta_pattern_count": 12
  }
}

해석 가이드:

metrics_perplexity.json

{
  "metric_name": "metrics_perplexity",
  "summary": {
    "record_count": 1000,
    "analyzed_count": 1000,
    "avg_perplexity": 45.2,
    "p50_perplexity": 38.1,
    "p95_perplexity": 120.5,
    "max_perplexity": 350.0,
    "avg_loss": 3.81,
    "model_used": "Qwen/Qwen3-0.6B"
  }
}

해석 가이드:

참고: Perplexity 블록은 HuggingFace Transformers (torch + transformers)가 필요합니다. CI에서는 FakeScorer가 자동으로 사용됩니다. 자세한 설정은 튜토리얼 10: Perplexity 메트릭을 참조하세요.

metrics_token_stats.json

{
  "metric_name": "metrics_token_stats",
  "summary": {
    "record_count": 1000,
    "analyzed_count": 1000,
    "total_tokens": 245000,
    "avg_tokens_per_record": 245.0,
    "median_tokens": 200,
    "p95_tokens": 580,
    "min_tokens": 3,
    "max_tokens": 1500,
    "type_token_ratio": 0.42,
    "tokenizer_used": "whitespace"
  }
}

해석 가이드:

참고: 기본 tokenizer는 whitespace입니다. params.tokenizer에 HuggingFace 모델 이름을 지정하면 서브워드 토크나이저를 사용할 수 있습니다.

metrics_pii_detect.json

{
  "metric_name": "metrics_pii_detect",
  "summary": {
    "record_count": 1000,
    "analyzed_count": 1000,
    "records_with_pii": 45,
    "total_pii_instances": 78,
    "email_count": 30,
    "phone_count": 20,
    "ssn_count": 5,
    "credit_card_count": 8,
    "ip_count": 15
  },
  "warnings": [{"code": "pii_detected", "message": "45 records contain PII patterns"}]
}

해석 가이드:

참고: PII 마스킹이 필요하면 튜토리얼 11: PII 안전을 참조하세요.

metrics_record_schema_validate.json

{
  "metric_name": "metrics_record_schema_validate",
  "summary": {
    "record_count": 1000,
    "valid_count": 985,
    "invalid_count": 15,
    "valid_ratio": 0.985,
    "invalid_sample_count": 15
  },
  "warnings": []
}

해석 가이드:

참고: 불량 레코드 디버깅은 튜토리얼 12: 불량 레코드 디버깅을 참조하세요.


4단계: 샘플링으로 대규모 데이터셋 최적화

대규모 데이터셋에서는 전체 레코드를 분석하면 시간이 오래 걸립니다. sample_ratesample_max_records로 샘플링합니다:

  - id: m1
    type: metrics_text_basic
    slot: metrics
    input_type: TextDocument
    output_type: TextDocument
    params:
      sample_rate: 0.1          # 10% 샘플링
      sample_max_records: 5000  # 최대 5000개
      seed: 42                  # 재현 가능한 샘플링
    cost_model:
      per_record_ms: 0.5

eulerweave plan이 이 파라미터를 인식하여 비용 추정에 반영합니다:

eulerweave plan manifest.yaml --records 100000
# [m1] metrics_text_basic
#   → Text length distribution, emptiness, charset stats
#   Time: ~2500ms           # 5000 * 0.5ms (샘플링 적용)

PDF 파이프라인에서 메트릭 활용

PDF → QnA 파이프라인에 메트릭을 추가하면 데이터 품질을 모니터링할 수 있습니다:

version: 1
track: sft

inputs:
  - type: pdf
    uri: data/paper.pdf
    options:
      strategy: auto

pipeline:
  - id: norm1
    type: normalize_text
    slot: normalize
    input_type: TextDocument
    output_type: TextDocument

  - id: filter1
    type: heuristic_filter
    slot: filter
    input_type: TextDocument
    output_type: TextDocument
    params:
      min_length: 100

  - id: dedup1
    type: dedup_exact
    slot: dedup
    input_type: TextDocument
    output_type: TextDocument

  - id: m1
    type: metrics_text_basic
    slot: metrics
    input_type: TextDocument
    output_type: TextDocument

  - id: m2
    type: metrics_quality_heuristic
    slot: metrics
    input_type: TextDocument
    output_type: TextDocument

  - id: qna1
    type: build_langextract_qna
    slot: build_task
    input_type: TextDocument
    output_type: SFTQnA
    params:
      model: "gpt-oss:20b"

  - id: exp1
    type: export_jsonl
    slot: export
    input_type: SFTQnA
    output_type: ExportedDataset

exports:
  - type: jsonl
    path: out/training_data.jsonl

profile:
  cpu_only: false
  allow_external_llm: true

report.json의 메트릭 요약

실행 보고서에도 각 메트릭의 요약이 포함됩니다:

{
  "run_id": "a1b2c3d4",
  "status": "completed",
  "records_input": 10000,
  "records_output": 9500,
  "metrics": {
    "metrics_text_basic": {
      "record_count": 10000,
      "avg_length": 245.3
    },
    "metrics_quality_heuristic": {
      "avg_url_ratio": 0.02,
      "avg_alnum_ratio": 0.85
    }
  }
}

다음 단계

← Prev Back to List Next →