리얼월드
경력근거: 평가 결과와 실패 사례를 다음 데이터 수집, 큐레이션, 학습으로 연결하는 반복 실험 워크플로우 구현
※ 실제 산출물이 아닌 AI 예측 시안입니다.
리얼월드는 teleoperation 부터 수집과 큐레이션, 학습, 실제 로봇 평가, 배포까지를 하나의 Robotics AI Product Platform 으로 묶고 있고, 공고가 그 안에서 평가 결과와 실패 사례를 다음 수집으로 잇는 반복 실험 흐름을 콕 집어 업무로 둡니다. 태스크 기준표와 평가 회차와 수집 목록이 한 플랫폼 안에 같이 있어야 어느 태스크가 데이터 부족으로 막혔는지 가려지고, 4D+ 모션 캡처로 현장마다 손 형태를 달리 찍는 회사라야 다시 찍을 현장과 그리퍼를 지목하는 일이 뜻을 가집니다. 다만 이 포트폴리오는 여러 기록을 상태 모델로 정리해 판정으로 잇는 제품 설계를 보여줍니다. 로봇 파운데이션 모델 학습이나 조작 알고리즘의 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
공고는 평가 결과와 실패 사례를 다음 데이터 수집과 큐레이션, 학습으로 잇는 반복 실험 흐름을 구현하라고 못박습니다. 이 순환의 매듭을 화면 하나로 만드는 것이 이 자리의 첫 산출물입니다.
Dataset, Task, Robot Session, Training Run, Model Artifact, Evaluation, Deployment 를 핵심 개념으로 나열하고 그 상태 모델 설계를 업무로 둡니다. 태스크와 평가와 수집 데이터를 한 표씩 정해 서로 잇는 일이 곧 그 설계입니다.
연구자와 엔지니어가 script 와 notebook, CLI 로 하던 절차를 반복 가능한 제품 기능으로 바꾸라고 적혀 있고, 서버가 상태를 소유하는 웹 제품 경험을 자격 요건으로 둡니다. 개인 파일에 남던 평가 결과를 서버가 쥐고 판정까지 내주는 화면이 그 요구에 맞물립니다.
평가 회차 기록과 태스크 기준표, 수집 데이터 목록을 올리면 태스크마다 성공률과 실패 사유 분포와 작업 주기를 세어 기준과 견주고, 배포로 넘길 태스크와 다시 찍어야 할 태스크를 다섯 갈래로 나눕니다. 어느 갈래인지는 회차 집계와 기준표 대조가 정하고, 클로드는 그 태스크를 다음 회차 계획에 적을 한 줄로 옮깁니다.
4D+ 모션 캡처로 현장 작업 데이터를 모으고 그 모델을 실제 로봇에 태워 평가하는 데이터 오퍼레이터와 로보틱스 연구자 — 평가는 각자 노트북과 스크립트로 돌아가 결과가 개인 파일로 흩어지고, 다음 회차에 어느 태스크를 다시 찍을지는 회의에서 기억에 기대 정한다
다음 수집 대상이 회의에서 갈리는 까닭은 판단이 어려워서가 아니라, 성공률과 실패 사유와 수집 현황이 서로 다른 파일에 있어 세 값을 한자리에 놓고 본 사람이 없기 때문입니다. 세 기록을 태스크 단위로 모아 기준표와 견줘 두면, 회의는 숫자를 다시 세는 자리가 아니라 순서를 정하는 자리가 됩니다.
연구자가 평가가 끝난 날 여는 화면 하나가 돕니다. 평가 회차와 태스크 기준표, 수집 목록을 올리면 태스크마다 다섯 갈래 중 하나가 붙고 성공률과 주기, 모자란 회차 수가 근거로 열립니다. 세 기록은 내보낸 파일로 올리는 것으로 시작하고, 평가 러너와 저장소를 직접 붙이는 일은 3주차로 미룹니다.
연구자가 회의에서 직접 고른 다음 수집 대상을 태스크 30개마다 정답으로 붙여 판정 일치를 자동으로 세고, 갈라진 태스크를 유형별로 리포트로 냅니다. 실패로 걸린 회차는 목록에서 눌러 그 회차 영상과 사유를 그 자리에서 되짚습니다.
다시 찍어야 할 태스크를 현장과 손 형태별로 묶어 다음 회차 수집 계획으로 뽑고, 회차 집계와 영상 색인처럼 오래 걸리는 작업은 배경 작업 대기열로 돌려 진행 상황과 실패 사유, 재시도와 취소를 화면에서 다룹니다.
연구자가 세 기록을 올리면 태스크마다 판정이 붙고, 막힌 태스크는 성공률과 주기, 모자란 회차 수 가운데 무엇에 걸렸는지 그 자리에서 읽습니다.
실패 사유가 비거나 수집 회차가 비거나 평가 회차가 아예 없는 태스크를 섞은 입력 30종을 올려도 목록이 사라지지 않고, 판정을 멈춘 태스크만 근거가 빈 채로 남습니다.
성공률이 기준과 정확히 같은 태스크(insert-conn-B)와 한 사유가 실패의 딱 절반인 태스크(cable-plug-G)를 시드에 넣어 두어, 경계에서 넘김과 못 넘김이 규칙대로 갈라지는지 그 두 카드로 확인합니다.
태스크 30개(기준표 10행에 증강 20행)에 대해 회의에서 고른 다음 수집 대상을 정답으로 붙여 판정 일치를 셉니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며 실제 판정 적중률은 리얼월드의 실제 평가 회차와 수집 목록이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
화면에 뜨는 판정 일치 수는 제가 직접 만든 평가 회차로 낸 자가채점이라 모델 성능이나 판정 적중률의 증명이 아닙니다. 면접에서는 리얼월드의 실제 회차 기록이 들어왔을 때 무엇부터 확인할지로 이야기를 잇습니다.
어느 태스크를 다시 찍을지 제가 정해 두고 맞춰 본 것이라 일치가 높은 것은 당연합니다. 그래서 시드에 사유 칸이 빈 실패 회차, 수집 회차가 집계되지 않은 태스크, 성공률이 기준과 정확히 같은 태스크, 한 사유가 실패의 딱 절반인 태스크를 넣어 규칙이 경계에서 어느 쪽으로 가는지 카드로 드러나게 두었습니다.
성공률이 낮다는 사실이 곧 데이터가 모자라다는 뜻은 아닙니다. 그리퍼 마모나 조명 변화처럼 모델 밖에서 오는 원인도 있어 판정은 다음 회차 후보로 읽고 마지막은 연구자가 정합니다.
이 포트폴리오는 여러 기록을 상태 모델로 묶어 판정으로 잇는 제품 설계를 보여줍니다. 로봇 파운데이션 모델 학습과 조작 알고리즘의 전문성은 주장하지 않습니다.
회차 영상과 모델 산출물은 크기가 커서 이 포트폴리오에서는 참조만 다루고 실물 재생은 다루지 않습니다. 대용량 저장소 운영은 도입 단계 과제로 남깁니다.
실제 도입에서는 태스크 기준이 고객 현장마다 다르고 회차 도중에 바뀌기도 합니다. 기준표를 언제 시점으로 고정해 판정할지 정하는 일은 도입 단계에서 따로 잡습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
실제 로봇에 모델을 올려 돌린 평가 회차 기록입니다. 회차 하나가 한 줄이고 태스크마다 열 줄 넘게 쌓여 성공률과 중앙값, 사유별 비중을 셀 수 있으며, 실패한 회차인데 사유 칸이 비어 있는 줄도 그대로 섞입니다.
| eval_id | task_id | model_artifact | episode_id | success | failure_reason | grasp_slip_count | cycle_sec |
|---|---|---|---|---|---|---|---|
| EV-20260310-01 | pick-tray-A | RLDX-1-rc7 | EP-000112 | true | — | 0 | 9.8 |
| EV-20260310-01 | pick-tray-A | RLDX-1-rc7 | EP-000113 | true | — | 0 | 10.1 |
| EV-20260310-01 | pick-tray-A | RLDX-1-rc7 | EP-000114 | true | — | 0 | 10.4 |
| EV-20260310-01 | pick-tray-A | RLDX-1-rc7 | EP-000115 | true | — | 0 | 10.9 |
| EV-20260310-01 | pick-tray-A | RLDX-1-rc7 | EP-000116 | true | — | 0 | 11.2 |
아래 JSON Schema 를 그대로 지키는 평가 회차 줄을 120행 더 만듭니다. 태스크 하나에 최소 10행이 붙어 성공률과 중앙값이 표본으로 서게 합니다. {"type":"object","properties":{"eval_id":{"type":"string"},"task_id":{"type":"string"},"model_artifact":{"type":"string"},"episode_id":{"type":"string"},"success":{"type":"boolean"},"failure_reason":{"type":["string","null"]},"grasp_slip_count":{"type":"integer"},"cycle_sec":{"type":"number"}},"required":["eval_id","task_id","model_artifact","episode_id","success","cycle_sec"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: 실패한 회차인데 failure_reason 이 null 인 줄을 3~4행 섞습니다. failure_reason 은 grasp_slip·pose_error·force_limit·timeout·collision 다섯 값에서 고르되 한 태스크에서 한 사유가 절반을 넘는 경우와 고르게 퍼지는 경우가 둘 다 나오게 합니다. cycle_sec 은 태스크 기준 주기의 0.6배에서 1.6배 사이로 흩뜨리고 한 태스크에 몇 개는 기준을 크게 넘는 값을 둡니다. 성공률이 target_success_rate 와 정확히 같아지는 태스크와, 한 사유가 실패의 정확히 절반인 태스크를 각각 하나씩 만듭니다. grasp_slip_count 는 grasp_slip 실패 회차에서만 1 이상으로 둡니다. 형식을 깨뜨리는 시도 3건(success 를 문자열 'true' 로 적기·cycle_sec 을 '12s' 로 적기·episode_id 를 숫자로만 적기)은 데이터가 아니라 파서 시험용으로 따로 만듭니다.{"type":"object","properties":{"eval_id":{"type":"string"},"task_id":{"type":"string"},"model_artifact":{"type":"string"},"episode_id":{"type":"string"},"success":{"type":"boolean"},"failure_reason":{"type":["string","null"]},"grasp_slip_count":{"type":"integer"},"cycle_sec":{"type":"number"}},"required":["eval_id","task_id","model_artifact","episode_id","success","cycle_sec"]}태스크마다 몇 퍼센트를 넘겨야 배포 후보로 보는지, 한 사이클을 몇 초 안에 끝내야 하는지, 어떤 조작 능력이 필요한지, 한 사유가 실패의 몇 할을 넘으면 쏠림으로 볼지 적어 둔 기준표입니다. 판정의 잣대가 전부 여기 있어 기준이 바뀌면 코드가 아니라 이 표만 고칩니다.
| task_id | target_success_rate | max_cycle_sec | required_skill | min_episode_count | top_reason_share_limit |
|---|---|---|---|---|---|
| pick-tray-A | 0.9 | 12 | single_arm_pick | 250 | 0.5 |
| insert-conn-B | 0.8 | 15 | force_insert | 400 | 0.5 |
| screw-M4-C | 0.8 | 11 | screw_drive | 300 | 0.6 |
| wire-route-D | 0.75 | 30 | bimanual_coord | 500 | 0.5 |
| tray-stack-E | 0.9 | 10 | single_arm_pick | 250 | 0.5 |
아래 JSON Schema 를 그대로 지키는 태스크 기준 줄을 20행 더 만듭니다. {"type":"object","properties":{"task_id":{"type":"string"},"target_success_rate":{"type":"number"},"max_cycle_sec":{"type":"number"},"required_skill":{"type":"string"},"min_episode_count":{"type":"integer"},"top_reason_share_limit":{"type":"number","minimum":0,"maximum":1}},"required":["task_id","target_success_rate","max_cycle_sec","required_skill","min_episode_count","top_reason_share_limit"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: target_success_rate 는 0.6~0.95 사이에서 조작이 어려운 태스크일수록 낮게 잡고, max_cycle_sec 은 5~40초 사이로 둡니다. required_skill 은 single_arm_pick·force_insert·screw_drive·bimanual_coord·deformable_handling 다섯 값을 씁니다. min_episode_count 는 150~600 사이로 두되 어려운 능력일수록 크게 잡고, top_reason_share_limit 는 0.4~0.6 사이에서 실패가 한쪽으로 몰리는 것을 얼마나 참을지에 따라 태스크마다 다르게 둡니다. task_id 는 동작-대상-알파벳 꼴로 짓습니다.{"type":"object","properties":{"task_id":{"type":"string"},"target_success_rate":{"type":"number"},"max_cycle_sec":{"type":"number"},"required_skill":{"type":"string"},"min_episode_count":{"type":"integer"},"top_reason_share_limit":{"type":"number","minimum":0,"maximum":1}},"required":["task_id","target_success_rate","max_cycle_sec","required_skill","min_episode_count","top_reason_share_limit"]}지금까지 모은 학습 데이터를 태스크와 조작 능력별로 세어 둔 목록입니다. 어느 현장에서 어느 손 형태로 찍었는지가 남아 있어 다시 찍을 곳을 짚는 근거가 됩니다.
| task_id | required_skill | episode_count | robot_hand_type | capture_site |
|---|---|---|---|---|
| pick-tray-A | single_arm_pick | 210 | parallel_2f | 안산 |
| insert-conn-B | force_insert | 460 | parallel_2f | 안산 |
| screw-M4-C | screw_drive | 340 | parallel_2f | 판교 |
| wire-route-D | single_arm_pick | 120 | 5finger | 안산 |
| tray-stack-E | single_arm_pick | 300 | parallel_2f | 판교 |
아래 JSON Schema 를 그대로 지키는 수집 현황 줄을 20행 더 만듭니다. {"type":"object","properties":{"task_id":{"type":"string"},"required_skill":{"type":"string"},"episode_count":{"type":["integer","null"]},"robot_hand_type":{"type":"string"},"capture_site":{"type":"string"}},"required":["task_id","required_skill","robot_hand_type","capture_site"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: episode_count 가 null 인 미집계 줄을 2~3행 섞고, 태스크 기준표가 요구하는 required_skill 과 다른 능력만 모아 둔 줄을 3~4행 만듭니다. episode_count 는 0~800 사이로 흩뜨리되 0 인 줄도 1~2행 둡니다. robot_hand_type 은 parallel_2f·5finger·suction 세 값, capture_site 는 안산·판교·평택 세 값을 씁니다.{"type":"object","properties":{"task_id":{"type":"string"},"required_skill":{"type":"string"},"episode_count":{"type":["integer","null"]},"robot_hand_type":{"type":"string"},"capture_site":{"type":"string"}},"required":["task_id","required_skill","robot_hand_type","capture_site"]}| Python | 판정 엔진과 회차 집계의 언어입니다. 성공률과 중앙값, 사유별 집계가 여기 모여 있습니다. |
| Django | 서버가 상태를 쥐고 화면을 그리는 본체입니다. 평가와 태스크, 수집 목록의 상태 모델과 이관을 한곳에서 다룹니다. |
| PostgreSQL | 평가 회차와 태스크 기준표, 수집 목록을 담습니다. 기준표가 바뀐 시점을 남겨 지난 회차 판정을 그대로 되짚습니다. |
| 마이그레이션 | 태스크와 평가의 상태 값이 늘어날 때마다 스키마를 옮기고 지난 데이터를 채워 넣는 절차를 코드로 남깁니다. |
| 트랜잭션 | 한 평가 회차의 결과와 그 회차가 바꾼 태스크 상태를 한 묶음으로 커밋해, 중간에 끊겨도 절반만 반영되는 일이 없게 합니다. |
| 배경 작업 대기열 | 3주차에 회차 집계와 영상 색인을 대기열로 돌리고 진행 상황·실패 사유·재시도·취소를 화면에 드러냅니다. |
| htmx | 판정 카드를 펼치고 회차를 되짚는 조작을 서버가 그린 조각으로 갈아 끼웁니다. 화면 상태를 브라우저에 따로 두지 않습니다. |
| 역할 기반 접근 제어 | 데이터 오퍼레이터는 수집 목록을, 연구자는 판정과 배포 후보를 다루도록 화면과 조작을 나눕니다. |
| 감사 로그 | 누가 어느 태스크를 배포 후보로 넘겼는지 시각과 함께 남겨 회차가 끝난 뒤 되짚습니다. |
| 객체 스토리지 | 회차 영상과 모델 산출물은 본문 대신 참조만 두고 실물은 스토리지에서 읽습니다. |
| LLM | 판정이 정해진 뒤 그 태스크를 다음 회차 계획에 적을 한 줄로 옮깁니다. 어느 갈래인지는 집계와 기준표가 정합니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 연구자가 회의에서 고른 대상과 맞대 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 수집 계획을 뽑고 오래 걸리는 작업을 대기열로 돌리는 단계로 확장합니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · task_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
배포 후보배포 후보성공률 미달성공률 미달실패 유형 쏠림실패 쏠림작업 주기 초과주기 초과학습에 없는 조건능력 불일치·평가 미실시태스크 하나를 다섯 갈래 중 하나로 판정하고, 학습에 없는 조건으로 내려간 태스크는 그 까닭까지 나눠 근거가 된 집계 값과 기준값을 함께 남기는 형식입니다. 갈래는 규칙이 정하고 계획 문장만 모델이 씁니다.
{"type":"object","properties":{"task_id":{"type":"string"},"model_artifact":{"type":"string"},"verdict":{"type":"string","enum":["배포 후보","성공률 미달","실패 유형 쏠림","작업 주기 초과","학습에 없는 조건"]},"blocked_cause":{"type":["string","null"],"enum":["능력 불일치","평가 미실시",null],"description":"학습에 없는 조건으로 내려간 까닭. 수집 데이터의 조작 능력이 태스크 요구와 다르면 능력 불일치, 이번 회차에 평가를 한 줄도 돌리지 않았으면 평가 미실시입니다. 다른 판정에서는 비웁니다"},"success_rate":{"type":["number","null"],"minimum":0,"maximum":1,"description":"success 가 참인 회차 수를 그 태스크의 평가 회차 수로 나눠 소수 둘째 자리까지 반올림한 값. 이 반올림한 값이 target_success_rate 보다 작을 때만 성공률 미달입니다"},"failure_total":{"type":["integer","null"],"description":"그 태스크에서 success 가 거짓인 회차 수. 사유 칸이 빈 실패 회차도 셉니다"},"top_failure_reason":{"type":["string","null"],"description":"failure_reason 이 빈 회차를 뺀 나머지를 세어 가장 많은 값. 수가 같으면 이름이 앞서는 값을 씁니다"},"top_failure_count":{"type":["integer","null"],"description":"top_failure_reason 이 붙은 회차 수"},"top_failure_share":{"type":["number","null"],"minimum":0,"maximum":1,"description":"top_failure_count 를 failure_total 로 나눠 소수 둘째 자리까지 반올림한 값. 실패가 3회 이상이고 이 값이 task_spec.top_reason_share_limit 를 넘을 때만 한 사유로 쏠린 것으로 봅니다"},"cycle_sec_median":{"type":["number","null"],"exclusiveMinimum":0,"description":"그 태스크 평가 회차 cycle_sec 의 중앙값. 회차 수가 짝수면 가운데 두 값의 평균을 내고 소수 둘째 자리까지 반올림합니다. max_cycle_sec 보다 클 때만 작업 주기 초과입니다"},"more_episode_count":{"type":["integer","null"],"minimum":0,"description":"task_spec.min_episode_count 에서 dataset_index.episode_count 를 뺀 값이며 음수면 0 으로 둡니다. 짝이 되는 수집 줄이 없거나 수집 회차가 비어 있으면 비웁니다"},"recapture_site":{"type":["string","null"],"description":"다시 찍을 현장. 그 태스크 수집 줄의 capture_site 를 그대로 옮기고, 배포 후보이거나 수집 줄이 없으면 비웁니다"},"recapture_hand":{"type":["string","null"],"description":"다시 찍을 손 형태. 그 태스크 수집 줄의 robot_hand_type 을 그대로 옮기고, 배포 후보이거나 수집 줄이 없으면 비웁니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["evaluation_run","task_spec","dataset_index"]},"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","median","min","max",null]},"value":{"type":["string","number","null"]}},"required":["source","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["task_id","model_artifact","verdict","evidence","summary"]}[
{
"task_id": "pick-tray-A",
"model_artifact": "RLDX-1-rc7",
"verdict": "성공률 미달",
"blocked_cause": null,
"success_rate": 0.6,
"failure_total": 4,
"top_failure_reason": "grasp_slip",
"top_failure_count": 2,
"top_failure_share": 0.5,
"cycle_sec_median": 11.05,
"more_episode_count": 40,
"recapture_site": "안산",
"recapture_hand": "parallel_2f",
"evidence": [
{
"source": "evaluation_run",
"field": "episode_id",
"agg": "count",
"value": 10
},
{
"source": "evaluation_run",
"field": "success",
"agg": "count",
"value": 6
},
{
"source": "task_spec",
"field": "target_success_rate",
"value": 0.9
},
{
"source": "task_spec",
"field": "min_episode_count",
"value": 250
},
{
"source": "dataset_index",
"field": "episode_count",
"value": 210
}
],
"summary": "평가 10회 가운데 6회만 성공해 기준 90%에 못 미쳤고, 수집 회차도 250회 기준에서 40회 모자랍니다.",
"hedge": "실패 4회 가운데 1회는 사유 칸이 비어 있어 어느 유형인지 세지 못했습니다."
},
{
"task_id": "insert-conn-B",
"model_artifact": "RLDX-1-rc7",
"verdict": "실패 유형 쏠림",
"blocked_cause": null,
"success_rate": 0.8,
"failure_total": 3,
"top_failure_reason": "grasp_slip",
"top_failure_count": 2,
"top_failure_share": 0.67,
"cycle_sec_median": 13.5,
"more_episode_count": 0,
"recapture_site": "안산",
"recapture_hand": "parallel_2f",
"evidence": [
{
"source": "evaluation_run",
"field": "episode_id",
"agg": "count",
"value": 15
},
{
"source": "evaluation_run",
"field": "success",
"agg": "count",
"value": 12
},
{
"source": "evaluation_run",
"field": "failure_reason",
"value": "grasp_slip"
},
{
"source": "evaluation_run",
"field": "grasp_slip_count",
"agg": "sum",
"value": 3
},
{
"source": "task_spec",
"field": "target_success_rate",
"value": 0.8
},
{
"source": "task_spec",
"field": "top_reason_share_limit",
"value": 0.5
}
],
"summary": "성공률은 기준 80%에 딱 맞췄지만 실패 3회 가운데 2회가 잡다 놓친 경우라 다음 회차는 미끄러지는 각도를 골라 찍는 편이 낫습니다.",
"hedge": null
},
{
"task_id": "screw-M4-C",
"model_artifact": "RLDX-1-rc7",
"verdict": "작업 주기 초과",
"blocked_cause": null,
"success_rate": 0.8,
"failure_total": 2,
"top_failure_reason": "force_limit",
"top_failure_count": 1,
"top_failure_share": 0.5,
"cycle_sec_median": 12.45,
"more_episode_count": 0,
"recapture_site": "판교",
"recapture_hand": "parallel_2f",
"evidence": [
{
"source": "evaluation_run",
"field": "cycle_sec",
"agg": "median",
"value": 12.45
},
{
"source": "task_spec",
"field": "max_cycle_sec",
"value": 11
},
{
"source": "evaluation_run",
"field": "success",
"agg": "count",
"value": 8
},
{
"source": "task_spec",
"field": "target_success_rate",
"value": 0.8
},
{
"source": "dataset_index",
"field": "capture_site",
"value": "판교"
}
],
"summary": "성공률 80%는 기준을 지켰지만 한 사이클 중앙값이 12.45초라 기준 11초를 넘겨 현장 택트에 못 들어갑니다.",
"hedge": "실패 2회 가운데 1회는 사유 칸이 비어 있고, 실패가 3회에 못 미쳐 쏠림 판정은 건너뛰었습니다."
},
{
"task_id": "cable-plug-G",
"model_artifact": "RLDX-1-rc7",
"verdict": "배포 후보",
"blocked_cause": null,
"success_rate": 0.71,
"failure_total": 4,
"top_failure_reason": "force_limit",
"top_failure_count": 2,
"top_failure_share": 0.5,
"cycle_sec_median": 16.7,
"more_episode_count": 0,
"recapture_site": null,
"recapture_hand": null,
"evidence": [
{
"source": "evaluation_run",
"field": "episode_id",
"agg": "count",
"value": 14
},
{
"source": "evaluation_run",
"field": "success",
"agg": "count",
"value": 10
},
{
"source": "evaluation_run",
"field": "cycle_sec",
"agg": "median",
"value": 16.7
},
{
"source": "task_spec",
"field": "target_success_rate",
"value": 0.7
},
{
"source": "task_spec",
"field": "max_cycle_sec",
"value": 18
},
{
"source": "task_spec",
"field": "top_reason_share_limit",
"value": 0.5
}
],
"summary": "성공률 71%와 주기 중앙값 16.7초가 두 기준 안에 들고, 가장 잦은 실패 사유가 실패의 딱 절반이라 쏠림 문턱도 넘지 않았습니다.",
"hedge": null
},
{
"task_id": "box-close-F",
"model_artifact": "RLDX-1-rc7",
"verdict": "배포 후보",
"blocked_cause": null,
"success_rate": 0.9,
"failure_total": 1,
"top_failure_reason": "timeout",
"top_failure_count": 1,
"top_failure_share": 1,
"cycle_sec_median": 11.7,
"more_episode_count": 0,
"recapture_site": null,
"recapture_hand": null,
"evidence": [
{
"source": "evaluation_run",
"field": "episode_id",
"agg": "count",
"value": 10
},
{
"source": "evaluation_run",
"field": "success",
"agg": "count",
"value": 9
},
{
"source": "evaluation_run",
"field": "cycle_sec",
"agg": "median",
"value": 11.7
},
{
"source": "task_spec",
"field": "target_success_rate",
"value": 0.85
},
{
"source": "task_spec",
"field": "max_cycle_sec",
"value": 14
},
{
"source": "dataset_index",
"field": "episode_count",
"value": 280
}
],
"summary": "성공률 90%에 주기 중앙값 11.7초로 두 기준을 다 넘겨 추가 수집 없이 배포 대상으로 올릴 만합니다.",
"hedge": null
},
{
"task_id": "wire-route-D",
"model_artifact": "RLDX-1-rc7",
"verdict": "학습에 없는 조건",
"blocked_cause": "능력 불일치",
"success_rate": null,
"failure_total": null,
"top_failure_reason": null,
"top_failure_count": null,
"top_failure_share": null,
"cycle_sec_median": null,
"more_episode_count": 380,
"recapture_site": "안산",
"recapture_hand": "5finger",
"evidence": [
{
"source": "task_spec",
"field": "required_skill",
"value": "bimanual_coord"
},
{
"source": "dataset_index",
"field": "required_skill",
"value": "single_arm_pick"
},
{
"source": "task_spec",
"field": "min_episode_count",
"value": 500
},
{
"source": "dataset_index",
"field": "episode_count",
"value": 120
},
{
"source": "dataset_index",
"field": "robot_hand_type",
"value": "5finger"
},
{
"source": "dataset_index",
"field": "capture_site",
"value": "안산"
}
],
"summary": "양손 협조가 필요한 태스크인데 모아 둔 데이터는 한 팔 집기뿐이고 회차도 380회 모자라, 안산 현장에서 5지 그리퍼로 다시 찍어야 합니다.",
"hedge": "능력이 어긋나 평가를 돌리지 않았으므로 성공률과 주기는 이 카드에서 비어 있습니다."
},
{
"task_id": "door-open-J",
"model_artifact": "RLDX-1-rc7",
"verdict": "학습에 없는 조건",
"blocked_cause": "평가 미실시",
"success_rate": null,
"failure_total": null,
"top_failure_reason": null,
"top_failure_count": null,
"top_failure_share": null,
"cycle_sec_median": null,
"more_episode_count": null,
"recapture_site": "판교",
"recapture_hand": "5finger",
"evidence": [
{
"source": "task_spec",
"field": "required_skill",
"value": "bimanual_coord"
},
{
"source": "dataset_index",
"field": "required_skill",
"value": "bimanual_coord"
},
{
"source": "dataset_index",
"field": "episode_count",
"value": null
},
{
"source": "task_spec",
"field": "min_episode_count",
"value": 400
}
],
"summary": "능력은 맞는 데이터가 있는데 이번 회차에 평가를 돌리지 않았고 수집 회차도 집계되지 않아 400회 기준을 채웠는지 알 수 없습니다.",
"hedge": "수집 회차가 비어 있어 얼마나 모자란지는 세지 못했고, 판교 현장 목록을 다시 세는 일이 먼저입니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 가운데 하나인지 확인합니다. 판정은 규칙이 정하므로 모델이 새 값을 적으면 그 응답을 버립니다. 2. task_id·model_artifact·verdict·evidence·summary 다섯 칸이 모두 차 있는지 봅니다. 3. success_rate 를 성공 회차 수 나누기 평가 회차 수로 다시 계산해 소수 둘째 자리까지 반올림한 값과 같은지 보고, 그 값이 target_success_rate 보다 **작을 때만** 성공률 미달이 붙었는지 맞춰 봅니다. 기준과 같은 값은 미달로 보지 않습니다. 4. top_failure_reason 은 사유 칸이 빈 실패 회차를 뺀 나머지에서 가장 많은 값이고, 수가 같으면 이름이 앞서는 값을 씁니다. top_failure_share 는 top_failure_count 나누기 failure_total 로 다시 계산합니다 — 사유가 빈 실패 회차도 분모에 셉니다. 5. 실패 유형 쏠림은 실패 회차가 3회 이상이고 top_failure_share 가 그 태스크 task_spec.top_reason_share_limit 를 넘을 때만 붙습니다. 문턱과 같은 값이면 붙지 않고, 실패가 3회에 못 미치면 표본이 모자라 쏠림 판정을 건너뜁니다. 6. cycle_sec_median 을 그 태스크 cycle_sec 의 중앙값으로 다시 계산합니다. 회차 수가 짝수면 가운데 두 값의 평균을 내고 소수 둘째 자리까지 반올림하며, max_cycle_sec 보다 클 때만 작업 주기 초과가 붙었는지 봅니다. 7. more_episode_count 를 min_episode_count 빼기 episode_count 로 다시 계산하되 음수면 0 으로 둡니다. 짝이 되는 수집 줄이 없거나 episode_count 가 비면 이 칸도 빕니다. 8. 평가 회차가 한 줄도 없는 태스크는 success_rate·failure_total·top_failure_reason·top_failure_count·top_failure_share·cycle_sec_median 이 모두 비어 있는지 봅니다. 9. blocked_cause 는 학습에 없는 조건일 때만 채우고 다른 판정에서는 비웁니다. 능력 짝이 어긋나면 능력 불일치, 능력은 맞는데 평가 회차가 없으면 평가 미실시입니다. 10. recapture_site·recapture_hand 는 배포 후보이거나 수집 줄이 없으면 비우고, 그 밖에는 그 태스크 dataset_index 줄의 capture_site·robot_hand_type 을 그대로 옮깁니다. 11. success_rate 와 top_failure_share 는 0 이상 1 이하, cycle_sec_median 은 0보다 큰 값인지 봅니다. 12. evidence 의 field 이름이 세 표의 컬럼에 실제로 있는 이름인지 대조합니다. 없는 이름을 인용하면 요약이 지어낸 문장이라는 뜻이라 규칙이 써 둔 기본 문장으로 되돌립니다. 13. agg 가 없는 evidence 의 value 가 인용한 그 줄의 값과 글자 그대로 같은지 보고, 여러 줄에서 센 값에는 count·sum·median 같은 agg 를 반드시 붙였는지 봅니다. 14. summary 가 존댓말 한 문장으로 끝나는지 봅니다. [판정 순서 · 규칙이 지키는 차례] ① 그 태스크 수집 줄의 required_skill 이 task_spec.required_skill 과 다르거나 수집 줄 자체가 없으면 학습에 없는 조건(능력 불일치)입니다. ② 능력은 맞는데 평가 회차가 한 줄도 없으면 학습에 없는 조건(평가 미실시)입니다. ③ 성공률 미달, ④ 실패 유형 쏠림, ⑤ 작업 주기 초과 차례로 보고, 앞에서 걸리면 뒤는 보지 않습니다. ⑥ 여기까지 걸리지 않으면 배포 후보입니다. 값이 비어 계산이 서지 않는 칸은 판정을 붙이지 않고 빈 채로 남깁니다. [평가 러너 · 2주차] 1. 연구자가 회의에서 직접 고른 다음 수집 대상을 태스크 30개(기준표 10행에 증강 20행)마다 정답으로 붙여 판정이 같은지 세고, 갈라진 태스크를 유형별로 모읍니다. 2. 다시 찍으라고 짚은 현장과 손 형태가 실제 수집 계획과 맞았는지 회차가 끝난 뒤 되짚습니다. [수동 검증 · 사람이 봅니다] 1. 한 사유로 쏠렸다는 판정이 실제로 같은 실패인지 재생 화면으로 표본 20건을 확인합니다. 2. 쏠림 문턱과 최소 실패 회차 3회가 이 현장의 감각과 맞는지 연구자와 맞춰 task_spec 값을 조정합니다.