InternLM2-Chat-1.8B를 활용한 데이터 라벨링 보조: 효율성과 일관성 동시 확보

데이터 라벨링의 한계와 새로운 접근법

인공지능 프로젝트, 특히 맞춤형 모델을 구축할 때 가장 큰 병목 현상은 데이터 라벨링입니다. 수만 건의 데이터를 일일이 분류하고 태깅하는 작업은 막대한 시간과 비용을 소모하며, 작업자의 주관에 따라 결과물이 달라지는 일관성 문제도 빈번하게 발생합니다. 이러한 품질 저하는 결국 모델 학습 결과에 부정적인 영향을 미칩니다.

최근에는 이러한 문제를 해결하기 위해 경량 오픈소스 대규모 언어 모델(LLM)인 InternLM2-Chat-1.8B를 라벨링 보조 도구로 활용하는 방식이 주목받고 있습니다. 모델이 먼저 1차적인 '예비 라벨링'을 수행하고, 작업자는 이를 검토 및 수정하는 방식입니다. 이 프로세스를 도입하면 작업의 성격이 '무에서 유를 창조'하는 단계에서 '오답을 교정'하는 단계로 전환되어 효율성이 극대화됩니다.

InternLM2-Chat-1.8B를 선택한 이유는 명확합니다. 1.8B라는 가벼운 파라미터 규모 덕분에 일반 소비자용 GPU에서도 빠르게 추론이 가능하며, 대화형(Chat) 튜닝이 잘 되어 있어 복잡한 지시사항도 곧잘 이해하기 때문입니다.

효율적인 예비 라벨링 워크플로우 설계

모델을 라벨링 프로세스에 통합하기 위해서는 '인간 중심의 검수(Human-in-the-loop)' 파이프라인을 구축해야 합니다.

  • 데이터 준비: 원시 데이터 중 일부를 샘플링하여 고품질의 가이드라인 샘플(Few-shot)을 작성합니다.
  • 자동 예비 라벨링: 준비된 프롬프트를 바탕으로 InternLM2-Chat-1.8B가 전체 데이터를 분류하거나 태깅합니다.
  • 전문가 검수 및 수정: 라벨링 도구를 활용해 모델의 결과물을 빠르게 검토합니다. 정확한 것은 승인하고, 틀린 부분은 수정합니다.
  • 피드백 루프: 수정된 고품질 데이터를 다시 모델 학습이나 프롬프트 개선에 활용하여 점진적으로 정확도를 높입니다.

성공적인 라벨링을 위한 프롬프트 전략

모델이 정확한 라벨을 생성하게 하려면 프롬프트 설계가 핵심입니다. 명확한 역할 부여, 구체적인 예시(Few-shot), 그리고 출력 형식의 제한이 필요합니다.

예를 들어, 감성 분석 업무를 수행할 때 다음과 같은 구조를 사용합니다.

당신은 숙련된 데이터 어노테이터입니다. 아래 제공된 예시의 형식을 참고하여 사용자 리뷰의 감성을 [긍정, 부정, 중립] 중 하나로 분류하세요. 다른 설명 없이 레이블만 출력하십시오.

### 예시
리뷰: "배송이 정말 빠르고 포장도 꼼꼼해서 만족합니다."
감성: 긍정

리뷰: "가격 대비 성능은 별로네요. 실망스럽습니다."
감성: 부정

### 분석 대상
리뷰: {input_text}
감성:

실전 구현: 파이썬 기반 자동화 스크립트

모델 API를 호출하여 대량의 텍스트 데이터를 처리하는 로직을 구현할 수 있습니다. 다음은 추론 결과를 정제하여 반환하는 코드 예시입니다.

import requests
import json

def get_label_from_model(text, endpoint_url="http://localhost:8000/v1/chat/completions"):
    """
    InternLM2-Chat-1.8B 모델을 호출하여 텍스트 라벨링 수행
    """
    instruction = (
        "사용자 텍스트를 분석하여 의도를 분류하세요. "
        "카테고리: [배송문의, 환불요청, 상품평, 기타]. "
        "오직 카테고리 명칭만 출력하세요."
    )
    
    prompt = f"{instruction}\n\n텍스트: {text}\n분류:"
    
    headers = {"Content-Type": "application/json"}
    payload = {
        "model": "internlm2-chat-1.8b",
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.0,  # 일관성을 위해 0으로 설정
        "max_tokens": 15
    }

    try:
        response = requests.post(endpoint_url, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        prediction = response.json()['choices'][0]['message']['content'].strip()
        
        # 유효한 라벨만 필터링
        valid_labels = ["배송문의", "환불요청", "상품평", "기타"]
        for label in valid_labels:
            if label in prediction:
                return label
        return "미분류"
    except Exception as e:
        print(f"Error: {e}")
        return "오류발생"

# 데이터 처리 예시
raw_data = ["이 제품 언제쯤 도착할까요?", "색상이 화면이랑 너무 달라요 환불해주세요."]
results = [{"text": t, "label": get_label_from_model(t)} for t in raw_data]
print(results)

도입 효과 및 분석 결과

실제 커머스 리뷰 데이터 5,000건을 대상으로 테스트한 결과, 순수 수동 라벨링 대비 약 30% 이상의 시간 단축 효과를 얻었습니다. 모델의 초기 정확도는 약 80% 내외였지만, 작업자가 처음부터 텍스트를 읽고 고민하는 시간을 줄여주었기 때문에 전체적인 리소스 소모가 급감했습니다.

또한, 모델은 사전에 정의된 프롬프트 규칙을 엄격히 따르기 때문에 작업자 개인의 컨디션이나 주관에 따른 편차를 줄여 데이터의 일관성을 상향 평준화하는 부수적인 효과도 거둘 수 있었습니다.

다양한 NLP 태스크로의 확장

이 방식은 단순 분류 외에도 다양한 분야에 적용 가능합니다.

  • 의도 인식(Intent Recognition): 고객 상담 로그에서 사용자의 목적(문의, 불만, 칭찬 등)을 추출합니다.
  • 엔티티 추출(Named Entity Recognition): 문장에서 인명, 지명, 제품명 등 주요 키워드를 대괄호로 표시하여 추출합니다.
  • 텍스트 요약 및 정제: 긴 본문을 라벨링하기 좋게 핵심 문장으로 먼저 요약합니다.

효율적인 라벨링을 위해서는 모델이 틀리기 쉬운 경계 사례(Edge Cases)를 선별하여 프롬프트의 예시(Few-shot)를 보강하는 과정이 필수적입니다. 이러한 반복적인 개선을 통해 경량 모델임에도 불구하고 준수한 성능의 라벨링 어시스턴트를 구축할 수 있습니다.

태그: InternLM2 LLM DataLabeling NLP python

7월 24일 21:26에 게시됨