다이얼로그디자인에이전시
경력근거: AI 학습 데이터셋 관리 플랫폼(Java/Spring Boot, React/Next.js) 및 데이터 생성 ·분류·평가 파이프라인 자동화
※ 실제 산출물이 아닌 AI 예측 시안입니다.
다이얼로그디자인에이전시는 삼성전자·LG전자처럼 AI 음성비서와 LLM 서비스를 운영하는 기업과 NIA·국립국어원의 정부 데이터 사업에, AI 대화 설계와 LLM 학습·평가 데이터 구축을 용역으로 납품하는 회사예요. 크라우드워커를 활용해 발화 의도와 문장 구조를 태깅한 학습 말뭉치를 만들고, AI 응답 품질 평가와 레드티밍 데이터도 구축해요.
공고는 이 자리가 현업 부서와 협업해 업무의 비효율을 찾아 풀고, 'AI 학습 데이터셋 관리 플랫폼(Java/Spring Boot, React/Next.js) 및 데이터 생성 ·분류·평가 파이프라인 자동화 기능 개발'을 맡는다고 적었어요. 이 회사는 발화 태깅과 응답 품질 평가 같은 LLM 학습·평가 데이터를 만들어 고객사와 정부 사업에 납품해요. 이런 데이터는 보통 작업자가 만든 결과를 검수자가 따로 판정하고, 반려되면 작업자가 고쳐 다시 내는 과정을 거쳐서 한 건에 제출본과 검수 기록이 여러 벌 쌓여요. 그러면 납품일 앞에서 어느 건을 넘겨도 되는지 기록만 보고 가려내기 어려워져요.
공고는 Java/Spring Boot와 React/Next.js로 AI 학습 데이터셋 관리 플랫폼을 만들고, 데이터 생성·분류·평가 파이프라인을 자동화하는 기능을 개발하는 일을 이 자리에 맡겨요.
공고는 현업 부서와 협업해 업무상의 비효율과 개선 요구사항을 찾고, AI 기반 소프트웨어 솔루션을 기획·개발하는 일을 첫 담당업무로 적었어요. 자격요건에도 비개발 직군과 직접 소통하며 업무 요구사항을 구체화하고 해결한 경험을 꼽았어요.
공고는 우대사항으로 AI 학습 데이터 구축·검수·어노테이션 시스템을 이해하고 관련 도구를 개발해 본 경험과, 데이터 품질 검증 시스템을 구축해 본 경험을 꼽았어요.
프로젝트 매니저가 납품일을 앞두고 여는 관리자 페이지예요. 한 납품 차수에 묶인 대화마다 지금 넘겨도 되는지, 검수가 모자란지, 검수자 판정이 갈렸는지, 반려된 뒤 다시 제출되지 않았는지 알려 주고, 대화를 펼치면 제출과 검수가 오간 기록을 보여 줘요. 받은 데이터를 담을 DB 설계와 기술·구조는 지원자가 정해요.
고객사에 넘길 LLM 학습·평가 데이터 구축 프로젝트를 맡은 프로젝트 매니저예요. 납품일이 다가오면 차수에 묶인 대화마다 검수자를 더 붙일지, 갈린 판정을 정리할지, 작업자에게 다시 맡길지 정해야 하는데, 한 대화에 제출과 검수가 여러 번 오가면 지금 어느 단계에 멈춰 있는지 하나씩 찾아봐야 해요.
프로젝트마다 고객사에 데이터를 넘기는 납품 차수예요. 한 행이 차수 하나이고 batch_id 가 키예요. project_id 는 프로젝트 코드(PJ-01~PJ-09)이고, round_no 는 그 프로젝트의 몇 번째 납품인지로 한 프로젝트 안에서 겹치지 않아요. due_at 은 고객사에 넘기기로 한 시각이에요. required_reviews 는 그 차수 계약에서 정한 검수 인원으로, 한 제출본을 서로 다른 검수자 몇 명이 승인해야 넘길 수 있는지를 뜻해요. 대부분 2명이지만, 모든 차수가 3명인 프로젝트와 처음 네 차수만 3명이고 그 뒤로 2명인 프로젝트도 있어요. 큰 데이터는 2025년 11월부터 2026년 10월 20일 18시까지 제출이 한 번이라도 있었던 차수 161개이고, 시작용은 그 가운데 PJ-07 3차 납품 한 줄을 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 1행 가운데 앞 1행이에요.
| batch_id | project_id | round_no | due_at | required_reviews |
|---|---|---|---|---|
| BT-0158 | PJ-07 | 3 | 2026-10-21T18:00:00+09:00 | 2 |
1행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 161행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "납품 차수 하나. 키는 batch_id.",
"additionalProperties": false,
"required": [
"batch_id",
"project_id",
"round_no",
"due_at",
"required_reviews"
],
"properties": {
"batch_id": {
"type": "string",
"pattern": "^BT-[0-9]{4}$",
"description": "납품 차수 번호. 이 표의 키예요."
},
"project_id": {
"type": "string",
"pattern": "^PJ-[0-9]{2}$",
"description": "프로젝트 코드(PJ-01~PJ-09)."
},
"round_no": {
"type": "integer",
"minimum": 1,
"description": "그 프로젝트의 몇 번째 납품인지. 한 프로젝트 안에서 겹치지 않아요."
},
"due_at": {
"type": "string",
"format": "date-time",
"description": "고객사에 넘기기로 한 시각. 한국 시간(+09:00) ISO 8601, 초 단위."
},
"required_reviews": {
"type": "integer",
"minimum": 1,
"description": "이 차수 계약에서 정한 검수 인원. 한 제출본을 서로 다른 검수자 몇 명이 승인해야 넘길 수 있는지예요."
}
}
}작업자가 납품 차수에 맞춰 만드는 대화예요. 한 행이 대화 하나이고 dialog_id 가 키예요. batch_id 는 이 대화가 묶인 납품 차수로 delivery_batches.batch_id 를 가리키고, 한 대화는 한 차수에만 속해요. worker_id 는 이 대화를 맡은 작업자이고, 고쳐 다시 내는 제출도 같은 작업자가 해요. 대화는 작업자가 처음 제출할 때 생겨서, 모든 대화에 제출 기록이 하나 이상 있어요. 큰 데이터는 차수 161개에 묶인 대화 64,416개이고, 시작용은 PJ-07 3차 납품에 묶인 대화 18개 전부예요.
전체 18행 가운데 앞 5행이에요.
| dialog_id | batch_id | worker_id |
|---|---|---|
| DG-063154 | BT-0158 | W-0408 |
| DG-063166 | BT-0158 | W-0411 |
| DG-063176 | BT-0158 | W-0415 |
| DG-063209 | BT-0158 | W-0423 |
| DG-063295 | BT-0158 | W-0427 |
18행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 64,416행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "대화 하나. 키는 dialog_id.",
"additionalProperties": false,
"required": [
"dialog_id",
"batch_id",
"worker_id"
],
"properties": {
"dialog_id": {
"type": "string",
"pattern": "^DG-[0-9]{6}$",
"description": "대화 번호. 이 표의 키예요."
},
"batch_id": {
"type": "string",
"pattern": "^BT-[0-9]{4}$",
"description": "이 대화가 묶인 납품 차수. delivery_batches.batch_id 를 가리켜요. 한 대화는 한 차수에만 속해요."
},
"worker_id": {
"type": "string",
"pattern": "^W-[0-9]{4}$",
"description": "이 대화를 맡은 작업자 코드. 고쳐 다시 내는 제출도 같은 작업자가 해요."
}
}
}작업자가 대화를 플랫폼에 제출한 기록이에요. 한 행이 제출 한 번(제출본 하나)이고 submission_id 가 키예요. dialog_id 는 dialogs.dialog_id 를 가리키고, 반려된 뒤 고쳐서 다시 낸 대화는 제출이 여러 번 있어요. submitted_at 은 플랫폼 서버가 제출을 받은 시각이고, review_logs.reviewed_at 과 같은 서버 시계예요. 처음 낸 그대로 승인된 대화, 반려된 뒤 한 번 다시 낸 대화, 마지막 반려 몇 분 뒤에 다시 낸 대화가 들어 있고, 여러 번 다시 낸 대화는 큰 데이터에만 있어요. 이 데이터는 2026년 10월 20일 18시까지의 기록이라 그 뒤의 제출은 없어요. 큰 데이터는 제출 72,938번이고, 시작용은 PJ-07 3차 납품 대화 18개의 제출 24번 전부예요.
전체 24행 가운데 앞 5행이에요.
| submission_id | dialog_id | submitted_at |
|---|---|---|
| SB-0071525 | DG-063154 | 2026-10-15T09:42:17+09:00 |
| SB-0071539 | DG-063166 | 2026-10-15T10:18:39+09:00 |
| SB-0071549 | DG-063176 | 2026-10-15T11:05:12+09:00 |
| SB-0071588 | DG-063209 | 2026-10-15T14:27:55+09:00 |
| SB-0071681 | DG-063295 | 2026-10-16T09:20:03+09:00 |
24행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 72,938행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "작업자의 제출 한 번(제출본 하나). 키는 submission_id.",
"additionalProperties": false,
"required": [
"submission_id",
"dialog_id",
"submitted_at"
],
"properties": {
"submission_id": {
"type": "string",
"pattern": "^SB-[0-9]{7}$",
"description": "제출본 번호. 이 표의 키예요."
},
"dialog_id": {
"type": "string",
"pattern": "^DG-[0-9]{6}$",
"description": "제출한 대화. dialogs.dialog_id 를 가리켜요. 한 대화에 제출이 여러 번 있을 수 있어요."
},
"submitted_at": {
"type": "string",
"format": "date-time",
"description": "플랫폼 서버가 제출을 받은 시각. 한국 시간(+09:00) ISO 8601, 초 단위. review_logs.reviewed_at 과 같은 서버 시계예요. 한 대화 안에서 같은 시각의 제출은 없어요."
}
}
}검수자가 제출본 하나를 보고 남긴 판정이에요. 한 행이 판정 하나이고 review_id 가 키예요. submission_id 는 검수한 제출본으로 dialog_submissions.submission_id 를 가리켜요. reviewer_id 는 검수자 코드이고, 한 검수자는 한 제출본을 한 번만 검수해요. 같은 검수자가 같은 대화의 다른 제출본을 다시 검수할 수는 있어요. decision 은 approve(승인)와 reject(반려) 둘 중 하나이고, reject_reason 은 반려할 때 고른 사유로 승인이면 null 이에요. reviewed_at 은 판정을 저장한 시각이고, submitted_at 과 같은 플랫폼 서버 시계예요. 작업자가 다시 제출하면 그 전 제출본에는 더 이상 판정이 붙지 않아요. 정해진 인원이 모두 승인한 제출본, 한 명은 승인하고 다른 한 명은 반려한 제출본, 모두 반려한 제출본, 아직 일부만 검수했거나 판정이 하나도 없는 제출본, 정해진 인원보다 한 명 더 검수한 제출본이 들어 있어요. 큰 데이터는 판정 154,275건이고, 시작용은 PJ-07 3차 납품 제출 24번에 붙은 판정 43건 전부예요.
전체 43행 가운데 앞 5행이에요.
| review_id | submission_id | reviewer_id | decision | reject_reason | reviewed_at |
|---|---|---|---|---|---|
| RV-0151330 | SB-0071525 | R-07 | approve | — | 2026-10-15T13:10:44+09:00 |
| RV-0151347 | SB-0071539 | R-03 | approve | — | 2026-10-15T14:02:51+09:00 |
| RV-0151378 | SB-0071549 | R-11 | reject | 발화 의도 태그 오류 | 2026-10-15T15:31:06+09:00 |
| RV-0151408 | SB-0071525 | R-19 | approve | — | 2026-10-15T16:25:02+09:00 |
| RV-0151436 | SB-0071588 | R-07 | approve | — | 2026-10-15T17:52:09+09:00 |
43행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 154,275행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "검수자가 제출본 하나에 남긴 판정. 키는 review_id.",
"additionalProperties": false,
"required": [
"review_id",
"submission_id",
"reviewer_id",
"decision",
"reject_reason",
"reviewed_at"
],
"properties": {
"review_id": {
"type": "string",
"pattern": "^RV-[0-9]{7}$",
"description": "판정 번호. 이 표의 키예요."
},
"submission_id": {
"type": "string",
"pattern": "^SB-[0-9]{7}$",
"description": "검수한 제출본. dialog_submissions.submission_id 를 가리켜요."
},
"reviewer_id": {
"type": "string",
"pattern": "^R-[0-9]{2}$",
"description": "검수자 코드. 한 검수자는 한 제출본을 한 번만 검수해요."
},
"decision": {
"type": "string",
"enum": [
"approve",
"reject"
],
"description": "approve 는 승인, reject 는 반려예요."
},
"reject_reason": {
"type": [
"string",
"null"
],
"enum": [
"발화 의도 태그 오류",
"개체명 태그 누락",
"응답문이 페르소나와 맞지 않음",
"대화 흐름이 끊김",
"가이드 금지 표현 포함",
null
],
"description": "반려할 때 고른 사유. decision 이 reject 면 다섯 가지 가운데 하나이고, approve 면 null 이에요."
},
"reviewed_at": {
"type": "string",
"format": "date-time",
"description": "검수자가 판정을 저장한 시각. 한국 시간(+09:00) ISO 8601, 초 단위. dialog_submissions.submitted_at 과 같은 서버 시계예요."
}
}
}