C.W.K.
Stream
Lesson 05 of 05 · published

어노테이션 도구: Argilla, Label Studio, 스크립트

~20 min · annotation, argilla, label-studio, human-review

Level 0관찰자
0 XP0/43 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

문제를 푸는 가장 작은 도구 골라

합리적 세 가지 옵션, 무거운 거부터 가벼운 거 순.

Argilla (LLM 데이터에 추천)

LLM 데이터 전용으로 만들어졌어. Preference 랭킹(DPO/ORPO), 텍스트 분류, 스팬 태깅, 모델 제안 레이블 first-class 지원. Argilla v2는 설정 가능한 필드/질문 가진 dataset 중심, Hugging Face Space로 호스팅 또는 self-host.

Label Studio

범용 어노테이션 도구, 텍스트/이미지/오디오/비디오/시계열 커버. Argilla보다 무겁지만 한 팀이 여러 modality 어노테이션할 때 맞는 선택.

Python 스크립트 + CLI 프롬프트

몇 백 예제 미만 프로젝트면, 사람 한 명이 각 예제 승인/거부/재작성하게 하는 30줄짜리 CLI 도구가 풀 어노테이션 플랫폼보다 실용적. 옳은 도구는 네 리뷰어가 실제 쓸 도구.

Code

Argilla v2 dataset setup for LLM SFT review·python
import argilla as rg

client = rg.Argilla(api_url="http://localhost:6900", api_key="admin.apikey")

dataset = rg.Dataset(
    name="sft-review",
    workspace="default",
    settings=rg.Settings(
        fields=[
            rg.TextField(name="system"),
            rg.TextField(name="user"),
            rg.TextField(name="assistant"),
        ],
        questions=[
            rg.LabelQuestion(name="verdict", labels=["keep", "rewrite", "reject"]),
            rg.RatingQuestion(name="quality", values=[1, 2, 3, 4, 5]),
            rg.TextQuestion(name="improved_assistant", required=False),
        ],
    ),
)
dataset.create()

records = [
    rg.Record(fields={"system": ex["messages"][0]["content"],
                       "user":   ex["messages"][1]["content"],
                       "assistant": ex["messages"][2]["content"]})
    for ex in raw_examples
]
dataset.records.log(records)
30-line CLI reviewer for the in-between case·python
import json

def review(in_path: str, out_path: str) -> None:
    with open(in_path) as f:
        examples = [json.loads(line) for line in f]
    approved = []
    for i, ex in enumerate(examples, 1):
        print(f"\n--- {i}/{len(examples)} ---")
        for m in ex["messages"]:
            print(f"[{m['role']}] {m['content'][:240]}")
        choice = input("(a)pprove / (r)eject / (e)dit / (q)uit: ").strip().lower()
        if choice == "a":
            approved.append(ex)
        elif choice == "e":
            new = input("Rewrite the assistant response:\n")
            ex["messages"][-1]["content"] = new
            approved.append(ex)
        elif choice == "q":
            break
    with open(out_path, "w") as f:
        for ex in approved:
            f.write(json.dumps(ex) + "\n")
    print(f"approved {len(approved)}")

External links

Exercise

프로젝트 크기에 맞는 접근법 골라 30개 실제 예제로 end-to-end 세팅. Argilla 골랐으면 로컬 또는 Space에 배포하고 팀원 한 명 어노테이션 초대. 30개 리뷰 시간 기록 — 그게 스케일링 처리량 추정치.

Progress

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

댓글 0

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

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