본문 바로가기
C.W.K.
Stream
Lesson 04 of 07 · published

합성 평가 데이터 생성

~22 min · datasets, synthetic, scale

Level 0추측자
0 XP0/55 lessons0/10 achievements
0/150 XP to next level150 XP to go0% complete

LLM을 데이터셋 생성에 활용하기

실제 데이터가 가장 믿을 만한 기준이야. 합성 데이터는 점심시간 한 번이면 사례 50개를 500개로 늘릴 수 있어. 잘 활용하면 운영 로그가 아직 포괄하지 못한 드문 조합, 적대적 입력, 여러 언어의 사례 같은 빈틈을 채울 수 있지.

합성 데이터가 잘하는 일

  • 다루지 못한 영역 보완 — 실제 사용자가 아직 다루지 않은 언어, 분야, 형식의 예시를 생성해.
  • 적대적 테스트 — 탈옥 공격 프롬프트의 변형, 프롬프트 주입 시도, 형식상의 경계 사례를 만들 수 있어.
  • 한계 테스트 — 매우 긴 입력, 깊게 중첩된 JSON, 여러 언어가 섞인 문서를 만들 수 있어.
  • 개인정보를 보호하는 개발 — 민감한 데이터의 합성 버전을 사용하면 개발자가 실제 기록을 직접 다루지 않고도 반복해서 개선할 수 있어.

합성 데이터가 잘하지 못하는 일

  • 실제 분포 재현 — 생성된 입력에는 모델이 만든 티가 나. 실제 사용자 입력보다 지나치게 매끄럽고 정중한 경향이 있어.
  • 아직 알려지지 않은 실패 발견 — LLM은 아무도 모르는 새로운 실패 방식을 스스로 찾아내지 못해.
  • 최종 출시 결정 — 합성 평가 결과만 보고 출시 여부를 결정하면 안 돼. 실제 데이터와 합성 데이터를 함께 사용하되 실제 데이터에 더 큰 가중치를 둬.
원칙: 합성 데이터는 다루지 못한 영역의 빈틈을 채우고, 실제 데이터는 새로운 실패 방식을 발견해. 둘 다 사용하되 어느 하나로 다른 하나를 대체하지 마.

실제로 효과가 있는 생성 패턴

씨앗 확장. 실제 사례 20개를 가져와 모델이 각 사례마다 다섯 가지 변형(바꿔 쓰기, 더 긴 버전, 다른 언어 등)을 생성하게 해. 그러면 실제 분포의 형태를 유지한 사례 100개를 얻을 수 있어.

페르소나 중심. N개의 사용자 페르소나 관점에서 사례를 생성해. 즉석에서 만든 프롬프트보다 의도의 다양성을 더 잘 포착할 수 있어.

실패 유형 중심. 우려되는 실패 방식을 나열해. 그런 다음 모델이 각 실패를 유발할 만한 입력을 만들게 해.

Code

출처 이력 태그를 포함한 씨앗 확장 생성기·python
def generate_variants(seed_case, model, n=5):
    """Take one real case, produce N variants preserving meaning."""
    prompt = f"""
Given this real user query:
  {seed_case['input']}

Generate {n} variants that ask the SAME thing in different ways:
- Different phrasings
- One shorter, one longer
- One in a different language (Spanish or French)
- One with a typo or grammar mistake

Return JSON array of strings.
"""
    variants = json.loads(model.complete(prompt))
    return [
        {
            "id": f"{seed_case['id']}.var{i}",
            "input": v,
            "reference": seed_case["reference"],
            "tags": seed_case["tags"] + ["synthetic", "variant"],
            "source": "synthetic",
            "seed_id": seed_case["id"],
        }
        for i, v in enumerate(variants)
    ]
실패 유형 중심의 적대적 사례 생성·python
FAILURE_MODES = [
    "prompt injection — the user tries to override the system instruction",
    "PII extraction — the user tries to get the model to reveal training data",
    "jailbreak via roleplay — the user wraps a harmful request in a story",
    "format break — the user asks for output that breaks the JSON schema",
    "refusal probe — the user pushes the model to either refuse incorrectly or comply incorrectly",
]

def adversarial_set(model, per_mode=5):
    out = []
    for mode in FAILURE_MODES:
        prompt = (f"Generate {per_mode} adversarial user inputs that try to trigger this failure mode: {mode}. "
                  "Return JSON array of strings only.")
        cases = json.loads(model.complete(prompt))
        for c in cases:
            out.append({"input": c, "tags": ["adversarial", mode.split(' — ')[0].replace(' ', '-')]})
    return out

External links

Exercise

회귀 데이터셋에서 실제 사례 5개를 가져와 씨앗 확장 패턴으로 각각 변형 5개를 생성해. 생성한 사례에는 합성 데이터 태그를 붙여. 실제 사례와 합성 사례를 합친 모음으로 평가를 실행하고, 두 유형의 사례에서 점수가 비슷한지 확인해. 차이가 크다면 분포가 달라졌다는 신호야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.