본문으로 건너뛰기

LLM 및 에이전트 트레이스를 위한 사람 검토 큐

트레이스가 사람 검토 큐에 도달하는 경로, 검토자가 라벨링하는 내용, Langfuse, LangSmith, Potato가 라벨을 점수와 평가 데이터셋으로 바꾸는 방식을 설명합니다.

사람 검토 큐는 사람의 라벨을 기다리는 LLM 또는 에이전트 트레이스의 목록이며, Langfuse와 LangSmith는 이 기능을 어노테이션 큐라고 부릅니다. Langfuse, LangSmith, Arize AX는 어노테이션 큐를 트레이싱 도구에 내장하고, Braintrust는 Review 페이지에서 로그를 검토자에게 배정하며, Arize Phoenix는 검토자가 트레이스 뷰에서 스팬을 어노테이션할 수 있게 합니다. Potato는 Langfuse, 웹훅, 내보내기에서 트레이스를 가져와 각 트레이스를 여러 검토자에게 보내고, 검토자들이 얼마나 일치하는지 보고하며, 병합된 답을 점수로 Langfuse나 LangSmith에 다시 기록하는 무료 자체 호스팅 검토 도구입니다.

트레이스는 LLM 애플리케이션의 한 번의 실행을 기록하고, 스팬(Langfuse에서는 observation)은 모델 호출이나 도구 호출처럼 실행 안의 한 단계를 기록합니다(OpenTelemetry 트레이스). 에이전트 전사본은 다단계 에이전트나 다중 턴 채팅의 트레이스입니다. 검토자가 트레이스에 라벨을 다는 이유는 두 가지입니다. 첫째, 사람의 라벨은 LLM 심사자(LLM-as-a-judge)가 프로덕션 트래픽을 단독으로 채점하기 전에 대조하는 기준입니다(Zheng et al., 2023). 둘째, 검토된 트레이스는 평가 데이터셋이 됩니다. 평가 데이터셋은 새로운 프롬프트나 모델 버전마다 테스트하는, 고정된 입력과 기대 출력의 집합입니다. 어노테이터 간 일치도는 두 검토자가 같은 라벨을 주는 빈도입니다. 일치도는 보통 Cohen의 카파나 Krippendorff의 알파로 보고합니다.

AI 에이전트 평가 도구 비교는 플랫폼을 기능별로 비교합니다. LLM 사람 평가 및 선호도 데이터 도구 비교는 선호도 데이터를 다룹니다. 에이전트 궤적 어노테이션은 단계 수준 오류 분류 체계의 설계를 다룹니다.

검토 큐에 들어가는 트레이스의 출처

팀이 모든 트레이스를 검토하는 일은 드뭅니다. 그래서 각 도구는 사람에게 도달할 트레이스를 고르는 방법을 제공합니다. Langfuse에서는 표에서 트레이스, observation, 세션을 선택하고 Add to queue를 고르거나, 항목의 상세 페이지에서 항목 하나를 어노테이션합니다. LangSmith 큐는 직접 또는 자동화 규칙으로 추가한 실행과 전체 스레드를 받습니다. 수동 추가는 한 번의 동작으로 최대 100개의 실행이나 스레드를 큐에 넣습니다. LangSmith 스레드 규칙은 대화가 유휴 상태가 되면 그 대화를 추가합니다. Arize AX는 큐를 시간 범위의 스팬이나 데이터셋 예제로 채웁니다.

Potato는 세 가지 방법으로 트레이스를 읽습니다.

  • 내보내기. python -m potato.trace_converter는 15개 트레이스 형식을 Potato의 JSONL로 변환하며, LangSmith 실행 내보내기를 위한 langchain, langfuse, 그리고 Phoenix나 Braintrust 내보내기 도구에서 나온 OpenTelemetry 및 OpenInference 스팬을 위한 otel이 포함됩니다.
  • 웹훅. trace_ingestion이 활성화되면 Potato는 /api/traces/webhook, /api/traces/langsmith, /api/traces/otel로 전송된 트레이스를 받아들이고 검토자가 작업하는 동안 각 트레이스를 큐에 추가합니다.
  • Langfuse 폴링. trace_ingestion.sources 아래의 langfuse 항목은 일정 간격으로 Langfuse 프로젝트에서 새 트레이스를 가져옵니다.

Potato는 들어오는 트레이스 중 어느 것이 어떤 순서로 검토자에게 도달할지를 정합니다. 자동화 규칙은 필드와 비율로 들어오는 트레이스를 표집합니다. 분류 큐는 오류가 난 트레이스, 엄지 아래 피드백, 낮은 자동 점수를 먼저 검토자에게 제공합니다.

검토자가 트레이스에 주는 라벨

검토자가 주는 라벨의 종류는 그 라벨이 나중에 어디에 쓰이는지에 달려 있습니다. 통과 또는 실패 판정은 성공률을 주고, 기준별 루브릭 점수는 심사자가 맞출 대상을 줍니다. 수정된 출력은 학습 예제를 줍니다. 아래 표의 각 라벨 종류에는 그 라벨을 기록하는 Potato 스킴이 있습니다.

라벨예Potato 스킴
통과 또는 실패에이전트가 요청을 해결했는가?radio
루브릭 점수정확성, 어조, 안전성을 1-5점 척도로rubric_eval, likert
오류 스팬환각된 문장을 강조하고 유형과 심각도를 지정error_span
단계 정확성처음으로 틀린 단계를 표시하거나 모든 단계를 판단process_reward, trajectory_eval
도구 호출올바른 도구, 올바른 인수tool_call_review
다중 에이전트 실행의 책임어떤 에이전트와 어떤 단계가 실패를 일으켰는가failure_attribution, agent_scorecard
수정된 출력최종 답변이나 틀린 단계를 다시 작성text_edit, trajectory_edit
두 실행 사이의 선호응답 A, 응답 B, 또는 동점pairwise

트레이싱 플랫폼은 같은 판단을 점수로 기록합니다. Langfuse는 수정된 출력을 트레이스나 observation에 저장합니다. LangSmith 검토자는 데이터셋 예제의 기대 출력이 되는 어서션을 작성하고, Braintrust는 expected 필드에 자유 형식 점수를 쓸 수 있습니다. LangSmith의 쌍별 큐는 두 실험의 실행을 나란히 보여 주고 검토자가 A, B, 또는 Equal을 고릅니다.

도구별 검토 큐 기능

Potato 팀은 아래의 라이선스, 요금제, 기능을 2026-11-02에 각 프로젝트의 자체 페이지와 대조해 확인했습니다.

도구실행 형태라이선스 또는 가격검토 기능
Langfuse호스팅 클라우드 또는 자체 호스팅MIT, 어노테이션 큐를 포함해 자체 호스팅은 무료. Cloud Hobby는 무료이며 큐 1개, Core는 월 29달러에 3개, Pro는 월 199달러에 무제한 큐트레이스, observation, 세션의 큐. 수정된 출력. 두 점수 이름 사이의 Cohen의 카파
LangSmith호스팅 클라우드Developer는 1석 무료. Plus는 석당 월 39달러. 자체 호스팅은 Enterprise 전용단일 실행 큐와 쌍별 큐, 스레드 검토, 실행당 지정된 검토자 수, Add to Dataset
Arize Phoenixpip 또는 Docker로 자체 호스팅Elastic License 2.0사람, LLM, 코드가 작성한 범주형, 연속형, 자유 형식 어노테이션이며 각각 작성자와 함께 표시됨
Arize AX호스팅 플랫폼상용ALL 또는 RANDOM 배정 방식을 갖춘 스팬 또는 데이터셋 예제의 큐
Braintrust호스팅 클라우드Starter는 프로젝트당 사람 검토 점수 1개까지 무료. Pro는 월 249달러. 온프레미스 배포는 Enterprise지정된 검토자, 블라인드 검토, expected에 기록되는 점수
Label Studio웹 앱Apache-2.0 Community Edition. 트레이스 검토 템플릿은 Enterprise가 필요노트북이 가져온 Langfuse나 Braintrust 트레이스에서 턴별 및 트레이스별 통과 또는 실패
ArgillaDocker 또는 Hugging Face Space의 웹 앱Apache-2.0ChatField를 통한 채팅 레코드, 레코드당 최소 응답 수
Potato자체 머신의 Python 웹 서버GPL-3.0-or-later, 무료트레이스당 여러 블라인드 검토자, 일치도, 단계 수준 스킴, Langfuse나 LangSmith로 되돌려 보내는 점수

Argilla 저장소는 원래 저자들이 떠났으며 프로젝트가 버그 수정과 패치는 배포하지만 새 기능은 배포하지 않는다고 밝힙니다. 호스팅 플랫폼은 이미 그 플랫폼 중 하나에서 프로덕션 트래픽을 트레이싱하는 팀에 맞습니다. 호스팅 플랫폼에서는 엔지니어가 트레이스를 디버깅하는 바로 그 도구에서 검토자가 트레이스를 엽니다.

Humanloop의 마이그레이션 가이드는 Humanloop 플랫폼이 2025년 9월 8일에 종료되며 그 이후에는 플랫폼과 모든 데이터에 영구적으로 접근할 수 없게 된다고 밝혔습니다. 2025년 8월 13일, TechCrunch는 보도했습니다. 공동 창업자들과 대부분의 팀이 Anthropic에 합류했으며, Anthropic 대변인은 Anthropic이 Humanloop의 자산이나 지식재산을 인수하지 않았다고 말했습니다. 자동 평가와 사람 검토를 하나의 호스팅 제품에서 원한다면 가장 가까운 호스팅 대체재는 Langfuse, LangSmith, Braintrust, Arize입니다. 모든 트레이스에서 블라인드 검토자 사이의 일치도가 필요한 팀은 네 플랫폼 어디에든 Potato를 함께 추가할 수 있습니다.

트레이스당 검토자와 일치도

트레이스당 검토자가 한 명이면 라벨을 확인할 방법이 없는 라벨이 나오고, 블라인드 검토자가 두 명이면 어느 트레이스가 모호한지와 루브릭이 명확한지가 드러납니다. LangSmith 큐는 실행당 검토자 수를 설정하며, LangSmith 검토자는 서로의 피드백을 볼 수 없습니다. Braintrust는 검토자가 제출하기 전까지 동료의 점수를 숨깁니다. Require all scores를 켜면 Braintrust의 행은 지정된 모든 검토자가 그 행에 점수를 매기는 즉시 완료됩니다. Phoenix는 스팬의 모든 어노테이션을 작성자와 함께 나열합니다. Langfuse 포럼에서 사용자들은 2025년 11월 7일에 두 사람이 큐에서 같은 트레이스를 여전히 독립적으로 어노테이션할 수 없다고 보고했습니다. 토론의 우회 방법은 검토자당 점수 구성 하나입니다. 가장 최근 댓글의 날짜는 2026년 4월 22일이며 여전히 우회 방법을 설명합니다. Langfuse 점수 분석은 임의의 두 점수 이름 사이의 Cohen의 카파를 한 번에 두 개씩 계산합니다.

Potato에서는 num_annotators_per_item이 각 트레이스를 보는 검토자 수를 정합니다. /admin/iaa 대시보드는 범주형 스킴에 대해 Cohen의 카파, Fleiss의 카파, Krippendorff의 알파를, 순서형 스킴에 대해 가중 카파를 보고하며, /admin/api/step_agreement는 단계 수준 라벨의 일치도를 보고합니다. 판정자는 /adjudicate 페이지에서 불일치를 해소하고, 언제 판정할지는 판정과 불일치 해소가 다룹니다. 어노테이터 간 일치도 설명은 계수 선택을 다룹니다.

트레이싱 도구와 평가 데이터셋으로 되돌아가는 라벨

검토된 라벨은 다음 버전을 테스트하는 평가 데이터셋에 도달해야 유용합니다. LangSmith 검토자는 큐에서 실행이나 전체 스레드를 데이터셋에 추가합니다. Langfuse는 원본 트레이스로의 링크와 함께 observation을 데이터셋에 추가하며, Langfuse 점수 API는 수정된 출력을 CORRECTION 유형의 점수로 반환합니다. Phoenix는 스팬 어노테이션을 데이터셋으로 전파하고, Braintrust는 검토된 로그에서 데이터셋을 만듭니다.

Potato는 세 가지 방식으로 라벨을 돌려줍니다.

  • 원본 트레이스의 점수. trace_ingestion.writeback을 쓰면 Langfuse 폴러나 LangSmith 웹훅에서 온 트레이스는 min_annotators명이 응답한 뒤 스킴마다 하나의 점수를 받습니다. radio 응답은 다수결 라벨이고, multiselect 응답은 검토자의 절반을 넘는 수가 선택한 클래스의 집합입니다. 코멘트와 메타데이터에는 어노테이터 수와 일치한 검토자 쌍의 비율이 기록됩니다. 동률 투표는 판정을 기다립니다. process_reward 같은 단계 수준 스킴은 각 Langfuse observation에도 점수를 매깁니다.
  • 학습 데이터. trajectory_correction 내보내기 도구는 수정된 각 트레이스를 SFT 레코드(prompt, completion)와 DPO 레코드(prompt, chosen, rejected)로 쓰며, 이는 SFT/DPO를 위한 궤적 편집에 설명되어 있습니다.
  • 파일과 데이터셋. Potato는 CSV, JSONL, Parquet, Hugging Face 데이터셋, agent_eval로 내보냅니다. agent_eval 내보내기는 트레이스별로 점수를 집계합니다. Potato의 데이터셋은 버전이 관리되는 평가 세트를 유지합니다.

Langfuse가 채우는 Potato 검토 큐

아래 구성에서 Potato는 60초마다 Langfuse 프로젝트를 폴링하고 각 트레이스를 두 검토자에게 줍니다. 검토자는 세 가지 질문에 답하며, 두 검토자가 모두 답하면 Potato는 각 답을 review.outcome, review.failure_mode, review.step_correctness라는 이름의 Langfuse 점수로 트레이스에 다시 보냅니다. 이 구성은 완전하며 python -m potato.validate_cli --strict를 통과합니다.

yaml
annotation_task_name: Support agent trace review, two reviewers per trace
task_dir: .
output_annotation_dir: annotation_output/
data_files:
  - data/traces.jsonl
item_properties:
  id_key: id
  text_key: task_description
user_config:
  allow_all_users: true
  users: []
 
# Pull new traces from Langfuse every 60 seconds, and send each merged
# answer back to the trace as a Langfuse score once two people have judged it
trace_ingestion:
  enabled: true
  api_key: change-me
  sources:
    - type: langfuse
      api_url: https://cloud.langfuse.com
      public_key: pk-lf-...
      secret_key: sk-lf-...
      poll_interval: 60
  writeback:
    trigger: fully_annotated
    min_annotators: 2
    score_prefix: review
 
# Two reviewers per trace, so agreement can be measured on every trace
num_annotators_per_item: 2
 
instance_display:
  fields:
    - key: steps
      type: agent_trace
      label: Agent trace
 
annotation_schemes:
  - annotation_type: radio
    name: outcome
    description: Did the agent resolve the customer's request?
    labels: [pass, fail]
  - annotation_type: multiselect
    name: failure_mode
    description: Which problems does the trace show?
    labels: [wrong_tool, hallucinated_fact, ignored_instruction, unsafe_action, none]
  - annotation_type: process_reward
    name: step_correctness
    description: Mark the first step that went wrong.
    steps_key: steps
    mode: first_error

potato start config.yaml -p 8000으로 서버를 시작하세요. 쓰기 되돌리기는 Langfuse나 LangSmith에서 온 트레이스에만 적용되며, data/traces.jsonl에서 불러온 트레이스는 Potato에 남습니다. 파일로 내보낸 트레이스는 먼저 내보내기를 변환하세요.

bash
python -m potato.trace_converter --input langfuse_traces.json --output data/traces.jsonl --input-format langfuse

Potato는 api_key를 사용해 웹훅 엔드포인트를 보호합니다. 쓰기 되돌리기는 LANGFUSE_PUBLIC_KEY와 LANGFUSE_SECRET_KEY가 둘 다 설정되어 있으면 해당 변수에서, 그렇지 않으면 langfuse 소스에서 Langfuse 키를 읽습니다. curl -H "X-API-Key: $KEY" http://localhost:8000/admin/api/trace_writeback은 대기 중, 전송됨, 실패, 보류된 점수의 수를 보여 줍니다.

검토 큐로서 Potato의 한계

  • 프로덕션 트레이싱 없음. Potato는 트레이싱 도구에서 트레이스를 읽으며 트레이싱 도구를 대체하지 않습니다.
  • 검토자 없음. 자기 팀을 초대하거나 크라우드소싱 연동에 설명된 대로 Prolific에서 검토자를 모집하세요.
  • 두 서비스로만 쓰기 되돌리기. 점수는 Langfuse와 LangSmith로만 갑니다. 텍스트 응답은 전송되지 않으며 LangSmith는 트레이스 수준 피드백만 받습니다. Potato의 문서는 LangSmith 전송이 LangSmith가 공개한 API를 따르며 해당 서비스에 대해 실행해 본 적이 없다고 밝힙니다.
  • Langfuse에만 폴링. LangSmith 실행은 웹훅이나 내보내기로 도착합니다.

자주 묻는 질문

에이전트 및 LLM 트레이스의 어노테이션 큐란 무엇인가요?

어노테이션 큐는 팀이 사람이 라벨링하도록 따로 모아 둔 트레이스, 스팬, 대화의 목록이며, 각 항목에 대해 고정된 질문 집합이 있습니다. 검토자는 다음 항목을 열고 질문에 답한 뒤 항목을 완료로 표시합니다. Langfuse, LangSmith, Arize AX는 이 기능을 어노테이션 큐라고 부릅니다. Potato는 같은 워크플로를 자체 서버에서 실행하며, 트레이스당 여러 검토자와 일치도 보고를 제공합니다.

어떤 도구가 LLM 트레이스의 사람 검토와 라벨링을 지원하나요?

Langfuse, LangSmith, Braintrust, Arize Phoenix, Arize AX는 트레이싱 도구 안에서 트레이스에 사람의 라벨을 붙입니다. Label Studio Enterprise에서는 검토자가 템플릿을 통해 Langfuse와 Braintrust 트레이스에 라벨을 붙입니다. Potato는 검토자에게 Langfuse, LangSmith, OpenTelemetry, 그리고 다른 12개 형식의 트레이스를 보여 주고, 검토자 사이의 일치도를 측정하며, 결과를 Langfuse나 LangSmith로 되돌려 보냅니다.

평가와 사람 검토를 위한 Humanloop의 대안은 무엇인가요?

Humanloop의 호스팅 대안에는 Langfuse, LangSmith, Braintrust, Arize가 있습니다. 네 플랫폼 모두 트레이싱, 자동 평가기, 사람 검토를 결합하며, Langfuse는 MIT 라이선스이고 자체 호스팅은 무료입니다. Humanloop 플랫폼은 2025년 9월 8일에 종료되었습니다. Potato는 블라인드 검토자 사이의 일치도와 Langfuse나 LangSmith로 되돌려 쓰는 점수를 갖춘, 사람 검토 부분을 위한 무료 자체 호스팅 대안입니다.

더 읽을거리

참고문헌

  1. Zheng, L., Chiang, W.-L., Sheng, Y., et al. (2023). Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. NeurIPS 2023 Datasets and Benchmarks. https://arxiv.org/abs/2306.05685