본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 8장: 도메인 특화 데이터셋 구축
2026년 4월 4일·AI / ML·

8장: 도메인 특화 데이터셋 구축

의료, 법률, 금융, 코드 도메인별 합성 데이터 접근법, 전문가 시드 데이터 설계, InstructLab 택소노미 방식, 도메인 검증 전략을 다룹니다.

22분640자9개 섹션
synthetic-dataaidata-engineeringllmmlops
공유
synthetic-data8 / 10
12345678910
이전7장: 프라이버시 보존 합성 데이터다음9장: 합성 데이터 평가와 벤치마킹

이 장에서 배우는 것

  • 도메인 특화 합성 데이터가 필요한 이유와 고유한 도전
  • 의료, 법률, 금융, 코드 도메인별 접근법
  • 전문가 시드 데이터 설계 전략
  • InstructLab 방식의 택소노미(Taxonomy) 기반 데이터 생성
  • 도메인별 검증 전략과 실전 사례

도메인 특화가 필요한 이유

범용 합성 데이터로는 전문 도메인의 요구를 충족할 수 없습니다. 그 이유는 세 가지입니다.

  1. 전문 용어와 맥락: 의학 용어, 법률 용어, 금융 공시 양식 등은 범용 모델이 정확하게 생성하기 어렵습니다.
  2. 도메인 제약 조건: 의료 데이터의 생물학적 일관성, 금융 데이터의 회계 규칙 등 도메인 고유의 제약이 존재합니다.
  3. 높은 정확도 요구: 전문 도메인에서는 작은 오류도 치명적입니다. "거의 맞는" 의료 정보는 위험할 수 있습니다.

의료 도메인

의료 합성 데이터는 가장 수요가 높으면서도 가장 까다로운 분야입니다. 환자 프라이버시와 임상적 정확성을 동시에 만족해야 합니다.

의료 데이터의 특수성

  • HIPAA 준수: 18가지 식별자(이름, 날짜, 전화번호, 의료기록번호 등) 제거 필수
  • 임상적 일관성: 진단명과 처방, 검사 결과 간 논리적 일관성 유지
  • 코드 체계: ICD-10, SNOMED CT, LOINC 등 표준 의료 코드 체계 준수
  • 시간적 순서: 환자의 진료 기록은 시간 순서에 따른 논리적 흐름이 있어야 함

의료 합성 데이터 파이프라인

medical_synthetic.py
python
MEDICAL_SEED_TEMPLATE = {
    "patient_demographics": {
        "age_range": "20-80",
        "conditions": ["고혈압", "당뇨병", "만성신장질환"],
    },
    "clinical_context": {
        "department": "내과",
        "visit_type": "외래",
        "chief_complaint": "두통과 어지러움",
    },
    "required_elements": [
        "주관적 소견(Subjective)",
        "객관적 소견(Objective)",
        "평가(Assessment)",
        "계획(Plan)",
    ],
}
 
MEDICAL_GEN_PROMPT = """당신은 내과 전문의입니다.
다음 임상 시나리오에 대한 SOAP 노트를 작성하세요.
 
환자 정보:
- 연령대: {age_range}
- 기저 질환: {conditions}
- 진료과: {department}
- 방문 유형: {visit_type}
- 주소(Chief Complaint): {chief_complaint}
 
규칙:
1. SOAP 형식(주관적/객관적/평가/계획)을 따릅니다.
2. 진단명은 ICD-10 코드를 병기합니다.
3. 처방은 기저 질환과의 약물 상호작용을 고려합니다.
4. 검사 결과 수치는 의학적으로 타당한 범위여야 합니다.
5. 실제 환자 정보가 포함되지 않도록 합니다.
 
JSON 형식으로 출력하세요."""
 
 
def validate_medical_consistency(record: dict) -> dict:
    """의료 데이터의 임상적 일관성을 검증합니다."""
    issues = []
 
    # 진단-처방 일관성 검사
    diagnosis = record.get("assessment", {}).get("diagnosis", "")
    medications = record.get("plan", {}).get("medications", [])
 
    # 약물 상호작용 검사 (간단한 규칙 기반)
    contraindications = {
        "만성신장질환": ["NSAIDs", "메트포르민"],
        "간경변": ["아세트아미노펜 고용량"],
    }
 
    conditions = record.get("conditions", [])
    for condition in conditions:
        if condition in contraindications:
            for med in medications:
                if med in contraindications[condition]:
                    issues.append(
                        f"금기: {condition} 환자에게 {med} 처방"
                    )
 
    # 검사 수치 범위 검증
    lab_ranges = {
        "크레아티닌": (0.5, 15.0),
        "HbA1c": (4.0, 15.0),
        "혈압_수축기": (60, 250),
    }
 
    labs = record.get("objective", {}).get("lab_results", {})
    for lab_name, value in labs.items():
        if lab_name in lab_ranges:
            min_val, max_val = lab_ranges[lab_name]
            if not min_val <= value <= max_val:
                issues.append(
                    f"비정상 범위: {lab_name} = {value}"
                )
 
    return {
        "is_valid": len(issues) == 0,
        "issues": issues,
        "record": record,
    }
Warning

의료 합성 데이터를 임상 의사 결정 지원에 직접 사용하는 것은 위험합니다. 합성 의료 데이터의 주요 용도는 NLP 모델 학습, 소프트웨어 테스트, 교육 목적이며, 임상 연구에 사용할 때는 반드시 전문의의 검증이 필요합니다.


법률 도메인

법률 합성 데이터는 법률 문서의 특수한 구조, 판례 인용 체계, 법률 용어의 정밀한 사용이 요구됩니다.

법률 데이터 생성 전략

legal_synthetic.py
python
LEGAL_DOMAINS = {
    "민사": {
        "subtypes": ["계약 분쟁", "손해배상", "부동산", "가사"],
        "document_types": ["소장", "답변서", "준비서면", "판결문"],
    },
    "형사": {
        "subtypes": ["사기", "횡령", "상해", "명예훼손"],
        "document_types": ["공소장", "변론요지서", "판결문"],
    },
    "행정": {
        "subtypes": ["인허가", "과세", "환경", "노동"],
        "document_types": ["처분서", "이의신청서", "재결서"],
    },
}
 
LEGAL_GEN_PROMPT = """당신은 {specialty} 전문 변호사입니다.
다음 시나리오에 대한 {document_type}를 작성하세요.
 
시나리오:
{scenario}
 
규칙:
1. 한국 법률 체계와 용어를 사용합니다.
2. 관련 법조문을 정확하게 인용합니다(예: 민법 제750조).
3. 법률 문서의 표준 형식을 따릅니다.
4. 모든 인명, 지명, 기관명은 가상입니다.
5. 판례 인용은 실제 판례와 혼동되지 않도록 가상으로 작성합니다.
6. 법적 논리가 일관되어야 합니다."""

법률 데이터 검증

legal_validation.py
python
import re
 
 
def validate_legal_document(document: str) -> dict:
    """법률 문서의 형식과 내용을 검증합니다."""
    issues = []
 
    # 법조문 인용 형식 검증
    statute_pattern = r"(민법|형법|상법|민사소송법|형사소송법)\s+제\d+조"
    statutes = re.findall(statute_pattern, document)
    if not statutes:
        issues.append("법조문 인용이 없습니다.")
 
    # 가상 인물명 확인 (실제 유명인 이름 배제)
    # LLM 기반 검증 또는 이름 사전 대조
 
    # 문서 구조 검증
    required_sections = {
        "소장": ["청구취지", "청구원인", "입증방법"],
        "판결문": ["주문", "이유", "결론"],
    }
 
    # 논리적 일관성 검사
    # 원고/피고 주장의 자기 모순 탐지
 
    return {
        "is_valid": len(issues) == 0,
        "issues": issues,
        "statutes_cited": statutes,
    }

금융 도메인

금융 합성 데이터는 수치적 정확성, 규제 준수, 시장 행동의 현실성이 핵심입니다.

금융 데이터의 고유 과제

과제설명대응 전략
시계열 특성주가, 환율 등은 시간 의존성이 강함시계열 생성 모델 (TimeGAN 등)
회계 항등식자산 = 부채 + 자본 등 반드시 성립제약 조건 기반 후처리
이상 거래 패턴사기 탐지 학습에 필요한 비정상 패턴의도적 이상 패턴 주입
규제 보고 형식금융감독원 보고 양식 준수템플릿 기반 생성
financial_synthetic.py
python
import numpy as np
 
 
def generate_synthetic_transactions(
    num_transactions: int,
    fraud_ratio: float = 0.02,
) -> list[dict]:
    """합성 금융 거래 데이터를 생성합니다."""
    transactions = []
 
    for i in range(num_transactions):
        is_fraud = np.random.random() < fraud_ratio
 
        if is_fraud:
            # 이상 거래 패턴
            transaction = generate_fraudulent_pattern()
        else:
            # 정상 거래 패턴
            transaction = generate_normal_pattern()
 
        transaction["id"] = i
        transactions.append(transaction)
 
    return transactions
 
 
def generate_normal_pattern() -> dict:
    """정상 거래 패턴을 생성합니다."""
    amount = np.random.lognormal(mean=10, sigma=1.5)
    hour = np.random.choice(range(24), p=normal_hour_distribution())
 
    return {
        "amount": round(amount, 0),
        "hour": hour,
        "is_fraud": False,
        "merchant_category": np.random.choice(
            ["식료품", "의류", "전자기기", "외식", "교통"]
        ),
    }
 
 
def generate_fraudulent_pattern() -> dict:
    """이상 거래 패턴을 생성합니다."""
    # 고액 거래, 새벽 시간대, 해외 결제 등
    amount = np.random.lognormal(mean=13, sigma=2.0)
    hour = np.random.choice(range(24), p=fraud_hour_distribution())
 
    return {
        "amount": round(amount, 0),
        "hour": hour,
        "is_fraud": True,
        "merchant_category": np.random.choice(
            ["전자기기", "귀금속", "선불카드", "해외결제"]
        ),
    }
 
 
def normal_hour_distribution() -> list[float]:
    """정상 거래 시간대 분포"""
    dist = [0.01] * 24
    for h in range(9, 21):  # 오전 9시 ~ 오후 9시
        dist[h] = 0.06
    total = sum(dist)
    return [d / total for d in dist]
 
 
def fraud_hour_distribution() -> list[float]:
    """이상 거래 시간대 분포"""
    dist = [0.03] * 24
    for h in [0, 1, 2, 3, 4, 5]:  # 새벽 시간대
        dist[h] = 0.08
    total = sum(dist)
    return [d / total for d in dist]
 
 
def validate_accounting_identity(
    balance_sheet: dict,
) -> bool:
    """회계 항등식을 검증합니다."""
    assets = balance_sheet.get("total_assets", 0)
    liabilities = balance_sheet.get("total_liabilities", 0)
    equity = balance_sheet.get("total_equity", 0)
 
    # 자산 = 부채 + 자본 (허용 오차 1원)
    return abs(assets - (liabilities + equity)) <= 1

코드 도메인

코드 합성 데이터는 3장에서 기본을 다루었지만, 도메인 특화 관점에서 더 깊이 있는 전략이 필요합니다.

코드 도메인별 세분화

code_domain_taxonomy.py
python
CODE_TAXONOMY = {
    "알고리즘": {
        "subtopics": [
            "정렬", "탐색", "그래프", "동적 프로그래밍",
            "문자열", "수학", "자료구조"
        ],
        "difficulty": ["easy", "medium", "hard"],
        "languages": ["python", "javascript", "java", "go"],
    },
    "시스템 설계": {
        "subtopics": [
            "API 설계", "데이터베이스 설계", "캐싱",
            "메시지 큐", "로드 밸런싱"
        ],
        "format": "서술형 + 다이어그램 설명",
    },
    "코드 리뷰": {
        "subtopics": [
            "버그 탐지", "성능 개선", "보안 취약점",
            "가독성 개선", "설계 패턴 적용"
        ],
        "format": "코드 + 리뷰 코멘트",
    },
    "디버깅": {
        "subtopics": [
            "런타임 에러", "논리 에러", "성능 병목",
            "메모리 누수", "동시성 버그"
        ],
        "format": "버그 코드 + 수정 코드 + 설명",
    },
}
Tip

코드 합성 데이터에서 가장 효과적인 품질 보증 방법은 "실행 기반 검증"입니다. 생성된 코드를 실제로 실행하고, 테스트 케이스를 통과하는지 확인하며, 정적 분석 도구(mypy, eslint 등)로 추가 검증합니다. 이 3단계 검증을 거치면 90% 이상의 코드 정확도를 달성할 수 있습니다.


InstructLab 택소노미 접근법

InstructLab은 Red Hat과 IBM이 개발한 오픈소스 프로젝트로, 택소노미(Taxonomy) 기반의 체계적인 합성 데이터 생성을 제공합니다.

택소노미 구조

InstructLab의 택소노미는 트리 형태로 지식과 기술을 계층적으로 분류합니다.

taxonomy/
  knowledge/
    medicine/
      cardiology/
        qna.yaml        # 심장내과 Q&A 시드
      neurology/
        qna.yaml        # 신경과 Q&A 시드
    law/
      civil/
        qna.yaml        # 민사법 Q&A 시드
  skills/
    coding/
      python/
        qna.yaml        # Python 코딩 시드
      debugging/
        qna.yaml        # 디버깅 시드
    writing/
      technical/
        qna.yaml        # 기술 문서 작성 시드

시드 파일 형식

qna.yaml
yaml
version: 3
domain: medicine
created_by: domain_expert
seed_examples:
  - context: |
      급성 심근경색은 관상동맥의 갑작스러운 폐색으로 인해
      심근에 비가역적 괴사가 발생하는 질환입니다.
    questions_and_answers:
      - question: |
          급성 심근경색의 초기 치료에서 가장 중요한 원칙은
          무엇입니까?
        answer: |
          급성 심근경색의 초기 치료에서 가장 중요한 원칙은
          "시간은 심근이다(Time is Muscle)"로 요약됩니다.
          발증 후 가능한 빨리 재관류 치료를 시행하는 것이
          핵심입니다.
      - question: |
          STEMI와 NSTEMI의 치료 전략은 어떻게 다릅니까?
        answer: |
          STEMI는 즉각적인 경피적 관상동맥 중재술(PCI) 또는
          혈전용해제 투여가 권고됩니다. NSTEMI는 위험도 평가
          후 조기(24-72시간 이내) 침습적 전략을 결정합니다.

InstructLab 워크플로우

Info

InstructLab의 핵심 강점은 도메인 전문가가 프로그래밍 없이도 합성 데이터 생성에 참여할 수 있다는 것입니다. YAML 형식의 시드 파일만 작성하면, 나머지 데이터 생성과 모델 학습은 자동화됩니다.


도메인 검증 전략

도메인 특화 합성 데이터는 범용 품질 검증 외에 도메인 고유의 검증이 추가로 필요합니다.

도메인별 검증 체크리스트

도메인핵심 검증 항목
의료진단-처방 일관성, 약물 상호작용, 검사 수치 범위, ICD-10 코드 유효성
법률법조문 인용 정확성, 논리적 일관성, 관할 법원 적정성, 공소시효
금융회계 항등식, 규제 보고 형식, 시장 행동 현실성, 이상 거래 패턴
코드구문 유효성, 실행 가능성, 테스트 통과, 정적 분석 통과

전문가 인더루프(Expert-in-the-Loop)

expert_review_pipeline.py
python
from dataclasses import dataclass
from enum import Enum
 
 
class ReviewDecision(Enum):
    APPROVE = "approve"
    REVISE = "revise"
    REJECT = "reject"
 
 
@dataclass
class ExpertReview:
    reviewer_id: str
    domain: str
    decision: ReviewDecision
    accuracy_score: float  # 1-5
    completeness_score: float  # 1-5
    domain_accuracy_score: float  # 1-5
    comments: str
 
 
def expert_review_sampling(
    data: list[dict],
    sample_rate: float = 0.05,
    stratify_by: str = "subdomain",
) -> list[dict]:
    """전문가 리뷰를 위한 층화 샘플링을 수행합니다."""
    from collections import defaultdict
    import random
 
    # 하위 도메인별로 그룹화
    groups = defaultdict(list)
    for item in data:
        key = item.get(stratify_by, "unknown")
        groups[key].append(item)
 
    # 각 그룹에서 비례 샘플링
    samples = []
    for key, items in groups.items():
        n = max(1, int(len(items) * sample_rate))
        samples.extend(random.sample(items, min(n, len(items))))
 
    return samples

정리

이 장에서는 전문 도메인에서의 합성 데이터 구축 전략을 도메인별로 살펴보았습니다.

  • 의료: HIPAA 준수, 임상적 일관성 검증, 약물 상호작용 체크가 핵심이며, 전문의 리뷰가 필수입니다.
  • 법률: 법조문 인용 정확성, 논리적 일관성, 가상 인물/기관 사용이 중요합니다.
  • 금융: 회계 항등식 준수, 시계열 특성 보존, 이상 거래 패턴 생성이 고유한 과제입니다.
  • 코드: 실행 기반 검증(구문/정적/동적 분석 3단계)으로 높은 정확도를 달성할 수 있습니다.
  • InstructLab: 택소노미 기반으로 도메인 전문가가 직접 시드를 작성하는 협업 모델을 제공합니다.
  • 검증: 도메인별 고유 검증 항목을 정의하고, 전문가 인더루프를 필수적으로 포함해야 합니다.
Tip

다음 장에서는 합성 데이터의 최종 관문인 평가와 벤치마킹을 다룹니다. TSTR, 다양성 메트릭, 분포 비교, 합성 vs 실제 데이터 비교 실험까지, 합성 데이터가 "진짜 쓸 만한지"를 객관적으로 판단하는 방법을 살펴봅니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#synthetic-data#ai#data-engineering#llm#mlops

관련 글

AI / ML

9장: 합성 데이터 평가와 벤치마킹

TSTR 방법론, 다양성 메트릭, 분포 비교, 다운스트림 성능 측정, 합성 vs 실제 데이터 비교 실험, 벤치마크 설계 방법을 다룹니다.

2026년 4월 5일·21분
AI / ML

10장: 실전 프로젝트 -- 합성 데이터 파이프라인 구축

엔드투엔드 합성 데이터 파이프라인 아키텍처, 생성-검증-필터링-증강-평가 통합, CI/CD 연동, 자동화된 품질 게이트, 비용 최적화, 프로덕션 운영 전략을 다룹니다.

2026년 4월 5일·24분
AI / ML

7장: 프라이버시 보존 합성 데이터

차등 프라이버시, PII 마스킹, 멤버십 추론 공격 방어, 유사도 필터, 규제 대응 전략과 프라이버시-유용성 트레이드오프를 다룹니다.

2026년 4월 2일·20분
이전 글7장: 프라이버시 보존 합성 데이터
다음 글9장: 합성 데이터 평가와 벤치마킹

댓글

목차

약 22분 남음
  • 이 장에서 배우는 것
  • 도메인 특화가 필요한 이유
  • 의료 도메인
    • 의료 데이터의 특수성
    • 의료 합성 데이터 파이프라인
  • 법률 도메인
    • 법률 데이터 생성 전략
    • 법률 데이터 검증
  • 금융 도메인
    • 금융 데이터의 고유 과제
  • 코드 도메인
    • 코드 도메인별 세분화
  • InstructLab 택소노미 접근법
    • 택소노미 구조
    • 시드 파일 형식
    • InstructLab 워크플로우
  • 도메인 검증 전략
    • 도메인별 검증 체크리스트
    • 전문가 인더루프(Expert-in-the-Loop)
  • 정리