Label Studio는 대규모 언어 모델(LLM)의 fine-tuning을 위한 데이터 레이블링에 있어 LangChain에 유연성을 제공하는 오픈 소스 데이터 레이블링 플랫폼입니다. 또한 커스텀 학습 데이터 준비와 인간 피드백을 통한 응답 수집 및 평가를 가능하게 합니다.
이 가이드에서는 LangChain 파이프라인을 Label Studio에 연결하여 다음을 수행하는 방법을 배웁니다:
  • 모든 입력 prompt, 대화 및 응답을 단일 Label Studio 프로젝트에 집계합니다. 이를 통해 모든 데이터를 한 곳에 통합하여 더 쉽게 레이블링하고 분석할 수 있습니다.
  • prompt와 응답을 개선하여 지도 학습 fine-tuning(SFT) 및 인간 피드백을 통한 강화 학습(RLHF) 시나리오를 위한 데이터셋을 생성합니다. 레이블링된 데이터는 LLM의 성능을 향상시키기 위해 추가 학습에 사용될 수 있습니다.
  • 인간 피드백을 통해 모델 응답을 평가합니다. Label Studio는 인간이 모델 응답을 검토하고 피드백을 제공할 수 있는 인터페이스를 제공하여 평가와 반복을 가능하게 합니다.

설치 및 설정

먼저 Label Studio와 Label Studio API client의 최신 버전을 설치합니다:
pip install -qU langchain label-studio label-studio-sdk langchain-openai langchain-community
다음으로, 커맨드 라인에서 label-studio를 실행하여 http://localhost:8080에서 로컬 LabelStudio 인스턴스를 시작합니다. 더 많은 옵션은 Label Studio 설치 가이드를 참조하세요. API 호출을 위해서는 token이 필요합니다. 브라우저에서 LabelStudio 인스턴스를 열고 Account & Settings > Access Token으로 이동하여 키를 복사합니다. LabelStudio URL, API key 및 OpenAI API key로 환경 변수를 설정합니다:
import os

os.environ["LABEL_STUDIO_URL"] = "<YOUR-LABEL-STUDIO-URL>"  # e.g. http://localhost:8080
os.environ["LABEL_STUDIO_API_KEY"] = "<YOUR-LABEL-STUDIO-API-KEY>"
os.environ["OPENAI_API_KEY"] = "<YOUR-OPENAI-API-KEY>"

LLM prompt 및 응답 수집

레이블링에 사용되는 데이터는 Label Studio 내의 프로젝트에 저장됩니다. 모든 프로젝트는 입력 및 출력 데이터의 사양을 상세히 설명하는 XML 구성으로 식별됩니다. 텍스트 형식의 인간 입력을 받고 텍스트 영역에서 편집 가능한 LLM 응답을 출력하는 프로젝트를 생성합니다:
<View>
<Style>
    .prompt-box {
        background-color: white;
        border-radius: 10px;
        box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
        padding: 20px;
    }
</Style>
<View className="root">
    <View className="prompt-box">
        <Text name="prompt" value="$prompt"/>
    </View>
    <TextArea name="response" toName="prompt"
              maxSubmissions="1" editable="true"
              required="true"/>
</View>
<Header value="Rate the response:"/>
<Rating name="rating" toName="prompt"/>
</View>
  1. Label Studio에서 프로젝트를 생성하려면 “Create” 버튼을 클릭합니다.
  2. “Project Name” 필드에 프로젝트 이름(예: My Project)을 입력합니다.
  3. Labeling Setup > Custom Template으로 이동하여 위에 제공된 XML 구성을 붙여넣습니다.
LabelStudioCallbackHandler를 통해 연결하여 LabelStudio 프로젝트에서 입력 LLM prompt와 출력 응답을 수집할 수 있습니다:
from langchain_community.callbacks.labelstudio_callback import (
    LabelStudioCallbackHandler,
)
from langchain_openai import OpenAI

llm = OpenAI(
    temperature=0, callbacks=[LabelStudioCallbackHandler(project_name="My Project")]
)
print(llm.invoke("Tell me a joke"))
Label Studio에서 My Project를 엽니다. prompt, 응답 및 모델 이름과 같은 메타데이터를 확인할 수 있습니다.

Chat 모델 대화 수집

마지막 응답을 평가하고 수정할 수 있는 기능과 함께 LabelStudio에서 전체 채팅 대화를 추적하고 표시할 수도 있습니다:
  1. Label Studio를 열고 “Create” 버튼을 클릭합니다.
  2. “Project Name” 필드에 프로젝트 이름(예: New Project with Chat)을 입력합니다.
  3. Labeling Setup > Custom Template으로 이동하여 다음 XML 구성을 붙여넣습니다:
<View>
<View className="root">
     <Paragraphs name="dialogue"
               value="$prompt"
               layout="dialogue"
               textKey="content"
               nameKey="role"
               granularity="sentence"/>
  <Header value="Final response:"/>
    <TextArea name="response" toName="dialogue"
              maxSubmissions="1" editable="true"
              required="true"/>
</View>
<Header value="Rate the response:"/>
<Rating name="rating" toName="dialogue"/>
</View>
from langchain.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI

chat_llm = ChatOpenAI(
    callbacks=[
        LabelStudioCallbackHandler(
            mode="chat",
            project_name="New Project with Chat",
        )
    ]
)
llm_results = chat_llm.invoke(
    [
        SystemMessage(content="Always use a lot of emojis"),
        HumanMessage(content="Tell me a joke"),
    ]
)
Label Studio에서 “New Project with Chat”을 엽니다. 생성된 task를 클릭하여 대화 기록을 확인하고 응답을 편집/주석 처리합니다.

커스텀 레이블링 구성

LabelStudio의 기본 레이블링 구성을 수정하여 응답 감정, 관련성 및 기타 다양한 유형의 주석자 피드백과 같은 더 많은 대상 레이블을 추가할 수 있습니다. 새로운 레이블링 구성은 UI에서 추가할 수 있습니다: Settings > Labeling Interface로 이동하여 감정을 위한 Choices 또는 관련성을 위한 Rating과 같은 추가 태그로 커스텀 구성을 설정합니다. LLM 응답을 표시하려면 TextArea 태그가 모든 구성에 포함되어야 한다는 점을 유념하세요. 또는 프로젝트 생성 전 초기 호출에서 레이블링 구성을 지정할 수 있습니다:
ls = LabelStudioCallbackHandler(
    project_config="""
<View>
<Text name="prompt" value="$prompt"/>
<TextArea name="response" toName="prompt"/>
<TextArea name="user_feedback" toName="prompt"/>
<Rating name="rating" toName="prompt"/>
<Choices name="sentiment" toName="prompt">
    <Choice value="Positive"/>
    <Choice value="Negative"/>
</Choices>
</View>
"""
)
프로젝트가 존재하지 않으면 지정된 레이블링 구성으로 생성됩니다.

기타 매개변수

LabelStudioCallbackHandler는 여러 선택적 매개변수를 허용합니다:
  • api_key - Label Studio API key. 환경 변수 LABEL_STUDIO_API_KEY를 재정의합니다.
  • url - Label Studio URL. LABEL_STUDIO_URL을 재정의하며, 기본값은 http://localhost:8080입니다.
  • project_id - 기존 Label Studio 프로젝트 ID. LABEL_STUDIO_PROJECT_ID를 재정의합니다. 이 프로젝트에 데이터를 저장합니다.
  • project_name - 프로젝트 ID가 지정되지 않은 경우 프로젝트 이름. 새 프로젝트를 생성합니다. 기본값은 현재 날짜로 포맷된 "LangChain-%Y-%m-%d"입니다.
  • project_config - 커스텀 레이블링 구성
  • mode: 처음부터 대상 구성을 생성하기 위해 이 단축키를 사용합니다:
    • "prompt" - 단일 prompt, 단일 응답. 기본값입니다.
    • "chat" - 다중 턴 채팅 모드.

Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I