Labelbox

Labelbox

Labelbox는 생성형 AI(Generative AI)를 위한 데이터 팩토리로, 최고 품질의 학습 데이터(training data)를 만드는 데 특화된 데이터 라벨링(data labeling) 플랫폼이에요. 주문형 전문 라벨링 서비스(on-demand expert labeling services)와 자체 데이터 라벨링 플랫폼을 하나로 합쳐서, 데이터 라벨링부터 모델 학습·후처리(post-training)까지 AI 모델 전반의 라이프사이클을 관리할 수 있게 도와줘요.

Labelbox는 이미지·텍스트·오디오·비디오 등 다양한 데이터 타입에 대한 어노테이션(annotation), Foundry를 통한 model-assisted labeling(모델 보조 라벨링), Catalog 데이터 큐레이션, 그리고 RLHF·SFT 같은 후처리 작업까지 폭넓게 지원해요. 전문가 커뮤니티인 Alignerr를 기반으로 30개 이상의 언어로 라벨링 서비스를 제공하고, Python SDK를 통해 프로그래매틱하게 프로젝트와 웹훅(webhook)을 관리할 수도 있어요.

출처: 문서

본문

주요 기능

Labelbox는 크게 데이터 라벨링 서비스(Data labeling solutions), Annotate(어노테이트), Foundry(모델 보조 라벨링), Catalog(데이터 큐레이션) 영역으로 나뉘어요.

데이터 라벨링 서비스

Labelbox는 실시간 피드백, 내장 자동화, 품질 관리(QC)를 갖춘 종합 라벨링 서비스를 제공해요. 고도로 교육받은 전문가 커뮤니티인 Alignerr가 핵심 후처리 및 GenAI 작업을 담당해요.

  • RLHF (Reinforcement Learning with Human Feedback, 인간 피드백 기반 강화학습)
  • SFT (Supervised fine-tuning, 지도 미세조정)
  • Multimodal LLM evaluation (멀티모달 LLM 평가)
  • Preference ranking (선호도 랭킹)
  • LLM chat arena (LLM 채팅 경기장)
  • Red teaming (레드팀)
  • Text-to-image, video, audio 작업
  • Coding 및 AI agent 작업

Annotate (어노테이션)

Labelbox Annotate는 내부 팀, 자체 벤더(vendor), 또는 Labelbox 라벨링 서비스와 함께 협업해 데이터를 어노테이션하는 기능이에요. 멀티모달 채팅, LLM 평가, 프롬프트/응답 생성, 컴퓨터 비전, 자연어 처리(NLP) 등 10개 이상의 내장 에디터(built-in editor)를 지원해요.

Foundry (model-assisted labeling)

Model-assisted labeling은 AI를 사용해 데이터에 라벨을 자동 생성하는 기능이에요. 라벨링을 더 빠르고 정확하게 만들어 주며, 작동 방식은 다음과 같아요.

  1. 모델 제공: Labelbox의 사전 학습된 모델(pre-trained model) 목록에서 선택하거나 직접 만든 모델을 가져와요.
  2. 모델이 라벨 예측: 모델이 데이터를 분석하고 학습한 내용을 바탕으로 라벨을 제안해요.
  3. 검토 및 승인: 제안된 라벨을 검토하고 필요한 수정을 해요.

대규모 데이터셋에서 라벨링 워크플로를 크게 가속할 수 있는 방법이에요. 프로젝트에 Foundry와 호환되는 온톨로지(ontology)와 데이터 배치(batch)가 준비되면, Start labeling 옆에 있는 Model assisted labeling 버튼이 활성화돼요. 모델을 선택한 뒤 온톨로지와 모델이 예측할 수 있는 라벨을 매핑(mapping)하고, 신뢰도 임계값(confidence threshold, 0~1 사이 값)을 설정하면 돼요. 임계값이 높을수록 제안이 적어지지만 정확도는 올라가요.

Catalog (데이터 큐레이션)

Catalog는 조직 전체의 비정형 데이터(unstructured data)를 큐레이션하고 탐색하기 위한 플랫폼이에요. 25개 이상의 클라우드 소스와 자체 데이터를 통합하고, 벡터(vector) 및 전통 검색, 데이터 탐색, 필터링을 지원해요.

핵심 용어

  • Ontology(온톨로지): 피처(feature)와 그 관계의 모음으로, 여러 프로젝트에 재사용할 수 있어요. 데이터 라벨링·모델 학습·평가의 기초가 되며, 라벨링할 때 Tools 패널에 나타나요.
  • Annotation(어노테이션): 에셋에 대한 사람 또는 컴퓨터가 만든 라벨이에요. 객체(objects, 예: bounding box, polygon)와 분류(classifications, 예: radio, checklist)로 나뉘어요.
  • Ground truth(정답): 직접 관찰과 측정으로 참(true)임이 알려진 정보예요. 사람이 만든 라벨은 모델 추론으로 만든 라벨과 달리 경험적 ground truth로 간주돼요.
  • Data row: 개별 데이터 에셋과 그에 연결된 속성(URL, 메타데이터, 미디어 속성, 어노테이션 등)을 나타내요.

Python SDK 예시: 웹훅(Webhook) 설정

Labelbox는 Python SDK를 제공해서 프로젝트 및 웹훅을 프로그래매틱하게 관리할 수 있어요. 다음은 v1 웹훅을 만드는 예시예요.

from labelbox import Client, Webhook

public_url = "https://example.com/webhook-endpoint" # Your server's public url - where the messages will be sent to
secret = b"CHANGE-ME" # Use to verify Labelbox is sending the message

client = Client(api_key="<YOUR_API_KEY>")
project = client.get_project("<project_id>")
print([topic.value for topic in Webhook.Topic]) # See all available topics
secret = b"example_secret" # This can be any secret that matches your webhook config (we will set later)

webhook = Webhook.create(client,
topics=["LABEL_CREATED"],
url="public_url",
secret=secret.decode(),
project=project)

생성된 웹훅을 조회, 수정, 삭제하는 방법도 간단해요.

# Fetch all webhooks
org = client.get_organization()
webhooks = org.webhooks() #paginated

# Fetch project webhooks
project = client.get_project("<project_id>")
webhooks = project.webhooks()  #paginated

webhook = next(webhooks)
status = webhook.status
server_url = webhook.url
topics = webhook.topics
project = webhook.project()

웹훅 이벤트를 받는 서버는 아래와 같은 Flask 앱으로 구성할 수 있어요. Labelbox는 X-Hub-Signature 헤더의 HMAC 서명으로 메시지가 실제 Labelbox에서 온 것인지 검증해요.

from flask import Flask, request
import json
import hmac
import hashlib
import threading
from werkzeug.serving import run_simple

# This can be any secret that matches your webhook config (we will set later)
secret = b"<replace with secret>"

# Example for server-side code to receive webhook events
app = Flask(__name__)


@app.route("/webhook-endpoint", methods=["POST"])
def print_webhook_info():
    payload = request.data
    computed_signature = hmac.new(
        secret, msg=payload, digestmod=hashlib.sha1
    ).hexdigest()
    if request.headers["X-Hub-Signature"] != "sha1=" + computed_signature:
        print(
            "Error: computed_signature does not match signature provided in the headers"
        )
        return "Error", 500

    print("=========== New Webhook Delivery ============")
    print("Delivery ID: %s" % request.headers["X-Labelbox-Id"])
    print("Event: %s" % request.headers["X-Labelbox-Event"])
    print(
        "Payload: %s"
        % json.dumps(json.loads(payload.decode("utf8")), indent=4)
    )
    return "Success"


thread = threading.Thread(
    target=lambda: run_simple("0.0.0.0", 3001, app)
)
thread.start()

더 알아보기 (Learn more)