크디랩
경력근거: 실시간 대화에서 발생하는 지연, 턴 전환, 인터럽션 등 Conversational AI의 핵심 문제를 해결합니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
크디랩의 쏘카인드는 실제 고객처럼 행동하는 AI 와 대화하며 실전 상황을 반복 훈련하는 직무 화법 코칭 서비스이고, 이 공고는 실시간 대화에서 생기는 지연·턴 전환·인터럽션을 해결하고 평가·피드백 로직을 제품으로 구현할 사람을 찾습니다. 음성 롤플레이 뒤에 점수가 나오는 구조라서 AI 고객 쪽 지연과 끼어들기가 설계사 점수로 넘어가는지는 쏘카인드 평가의 신뢰도와 바로 맞닿고, 이 판정은 보험 영업 화법 롤플레이 기록이 쌓이는 쏘카인드에서 쓸모가 생깁니다. 이 포트폴리오는 턴 시각으로 응답 지연과 겹침을 재 세션 점수의 반영 여부를 판정하는 Python 백엔드와 교육 담당자 화면을 보여줍니다. 음성 인식 모델이나 보험 영업 화법 코칭의 전문성은 주장하지 않습니다.
크디랩의 쏘카인드는 설계사가 실제 고객처럼 행동하는 AI 와 대화하며 실전 상황을 반복 훈련하고, 대화가 끝나면 개인별 피드백을 받는 직무 화법 코칭 서비스입니다. 보험 영업에서 먼저 PMF 를 검증한 제품이라, 롤플레이 한 번이 끝날 때마다 나오는 점수가 교육 담당자의 코칭 대상 선정으로 이어집니다.
주요업무는 실시간 대화의 지연·턴 전환·인터럽션 문제 해결이고, 우대사항은 음성 대화 시스템에서 짧은 턴과 발화 끊김, back-channel(맞장구) 같은 음성 특유의 패턴을 처리해 본 경험입니다. 턴마다 남는 시작·끝 시각으로 응답 간격과 겹침을 재고, 짧은 맞장구와 인식 실패를 턴 길이로 구분하는 계산이 이 포트폴리오의 뼈대입니다.
우대사항은 LLM 기반 평가·피드백 시스템의 정확도와 신뢰도 개선, AI Evals·Observability·Guardrail, 클라우드 컨테이너 배포 경험입니다. 점수를 믿을 세션과 아닌 세션을 가르는 판정은 평가 신뢰도 문제이고, 2주차에 시나리오별 응답 지연을 관측하는 탭과 AWS 배포를, 3주차에 모델 설명의 인용을 턴 기록과 대조하는 장치를 붙입니다.
쏘카인드는 보험 설계사가 실제 고객처럼 행동하는 AI 고객과 음성으로 롤플레이하고, 대화가 끝나면 코칭 리포트와 화법 점수를 받는 직무 화법 코칭 서비스입니다. 이 관리자 페이지는 롤플레이 턴 기록(말한 사람, 시작과 끝 시각, 음성 인식 결과), 세션별 코칭 리포트 점수, 시나리오별 최소 턴 수를 받아 세션마다 다섯 판정 중 하나를 붙입니다. 설계사 턴이 끝난 시각과 다음 AI 고객 턴이 시작한 시각의 간격으로 응답 지연과 끼어들기를 세고, 2초 넘게 말했는데 인식 결과가 빈 설계사 턴을 찾으며, 턴 수를 시나리오의 최소 턴 수와 견줍니다. 보험사 교육 담당자는 이 판정으로 점수를 그대로 쓸 세션과 다시 치르게 할 세션을 나누고, 크디랩 고객 성공 담당자는 문제가 몰린 시나리오를 찾아 AI 고객 설정을 손봅니다.
쏘카인드 교육 담당자용 웹에서 지점별 설계사의 화법 점수를 보고 코칭할 직원을 고르는 보험사 교육 담당자와, 그 고객사를 맡는 크디랩 고객 성공 담당자. 같은 화면을 보고 교육 담당자는 재응시 여부를, 크디랩 담당자는 문제가 몰린 시나리오 대응을 정한다
지금 교육 담당자는 지점 리포트에서 화법 점수가 낮은 설계사부터 코칭 대상으로 고릅니다. 점수가 낮은 세션 가운데 일부는 설계사의 화법이 아니라 AI 고객이 3초 넘게 늦게 답하거나 설계사 말 도중 끼어들어 대화 흐름이 끊긴 세션입니다. 턴 기록에는 턴마다 시작과 끝 시각, 음성 인식 결과가 이미 남아 있어서, 차례 사이 간격과 겹침을 세면 점수를 믿을 세션과 다시 치르게 할 세션이 리포트에 오르기 전에 나뉩니다.
교육 담당자가 턴 기록·코칭 리포트·시나리오 세 파일을 올리면 세션마다 대표 판정과 함께 걸린 판정, 늦은 AI 고객 턴 수, 끼어들기 횟수, 인식이 빈 설계사 턴 수, 턴 수와 최소 턴 수가 서는 관리자 페이지입니다. 턴을 순서대로 세워 설계사 턴 끝과 다음 AI 고객 턴 시작의 간격을 재는 계산과 null·빈 문자열·공백만 남은 인식 결과를 하나로 읽는 처리를 이 주에 만듭니다.
정상 세션의 AI 고객 턴을 늦추거나 앞당기고 인식 결과를 지운 변형 세션 200회를 만들어, 넣은 문제가 그 판정으로 돌아오는지 셉니다. 롤플레이가 끝나면 FastAPI 가 턴 기록을 받아 비동기 작업으로 판정하고, 크디랩 고객 성공 담당자용 탭에서 시나리오마다 AI 고객 응답 간격의 p90(느린 쪽 10% 가 시작되는 값)과 끼어들기 세션 비율을 주차별로 보여줍니다. 서버는 Docker 이미지로 묶어 AWS App Runner 에 올립니다.
Claude Haiku 4.5 가 도구 호출로 걸린 턴 앞뒤 대화를 읽어 문제가 난 장면을 한 문장으로 적고, 인용한 말이 턴 기록에 없으면 그 설명을 버립니다. 교육 담당자는 점수에서 뺄 세션의 설계사를 골라 재응시 명단으로 내려받습니다.
교육 담당자가 강남지점 이번 주 롤플레이 11회를 올리면 52점을 받은 S-90311 이 AI 고객 턴 3개 중 1개가 3.1초 늦어 응답 지연에, 48점인 S-90327 이 설계사 말 도중 두 번 끼어들어 끼어들기에 서면서 마지막 2.5초 지연이 함께 걸린 판정으로 붙고, 84점인 S-90301 은 그대로 반영에 남습니다.
크디랩 고객 성공 담당자는 SC-OBJ-01 에서 걸린 세션들의 타임라인을 차례로 넘기며 AI 고객이 늦은 자리가 같은 질문 뒤인지 봅니다.
정확히 2.0초 만에 답한 AI 고객 턴, 끼어들기가 한 번뿐인 세션, 정확히 2.0초 말하고 인식 결과가 빈 설계사 턴, 공백만 남은 1.4초 맞장구와 3.4초 발화, 시나리오 표에 없는 커스텀 롤플레이를 한 번에 넣어도 세션마다 대표 판정이 하나로 정해집니다. 턴 시각이 뒤집힌 세션은 판정 보류로 두고 타임라인을 그리지 않습니다.
교육 담당자가 S-90327 을 열면 대표 판정 끊음 옆에 함께 걸린 늦은 응답이 보여, 판정 차례를 바꿨을 때 대표 판정만 바뀌고 걸린 문제 목록은 그대로인 것을 확인합니다.
위 수치는 더미데이터 자가채점이며, 이 판정이 교육 담당자의 코칭 대상 선정을 실제로 바로잡는지는 쏘카인드의 실제 롤플레이 턴 기록과 재응시 전후 점수가 있어야 측정됩니다. 턴 기록이 말한 사람·시작·끝·인식 결과 네 칸뿐이라, 실제 음성 로그 한 주치를 넣는 날 바로 같은 화면이 열립니다.
판정 기준과 시험 세션을 모두 제가 지었습니다. 변형 세션 200회에서 넣은 문제가 그대로 돌아오는 것은 규칙이 제 설계대로 돈다는 뜻이라, 면접에서는 실제 점수가 AI 고객 탓에 깎였는지를 보여준 것이 아니라고 말합니다.
공백 문자열을 빈 결과로 읽지 않는 구현은 S-90380 의 3.4초 턴을 인식된 말로 보고 그대로 반영에 남기고, 기준을 '2초 이상'으로 잘못 옮기면 정확히 2.0초인 S-90374 첫 턴이 인식 실패로 넘어갑니다. 두 세션을 기대 출력에 묶어 이 두 실수가 테스트에서 드러나게 했습니다.
2초와 30% 기준은 주제를 정할 때 잡은 값이고 실제 쏘카인드 음성 파이프라인의 지연 분포를 보고 정한 값이 아닙니다. 전화 통화에서는 1초 남짓한 침묵도 어색하게 들리는 반면 고객이 생각할 틈을 두는 시나리오도 있어, 시나리오마다 기준을 달리 둘지는 실제 응답 간격 분포를 본 뒤 정합니다.
설계사 턴의 인식 결과가 비었다고 모두 음성 인식 실패는 아닙니다. 마이크를 끈 채 말했거나 주변 소음만 들어간 경우도 같은 모양으로 남으므로, 재응시 여부는 교육 담당자가 녹음을 들어 보고 정하도록 판정 근거에 그 턴의 길이를 둡니다.
턴 수 미달은 AI 고객이 '운전 중' 설정으로 대화를 일찍 끊어도, 설계사가 대화를 이어가지 못해도 같은 숫자로 남습니다. 시나리오의 AI 고객 설정을 보지 않고는 둘을 가를 수 없어, 이 묶음은 크디랩 고객 성공 담당자가 시나리오 쪽부터 확인합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
쏘카인드 음성 롤플레이에서 턴마다 남는 기록입니다. 시각은 세션 녹음이 시작된 뒤 지난 초이고, stt_text 는 설계사 턴이면 설계사 말의 음성 인식 결과, AI 고객 턴이면 AI 고객이 말한 문장입니다. 인식 결과가 null 인 턴, 빈 문자열인 턴, 짧은 맞장구와 3초 넘는 발화에서 공백만 남은 턴을 일부러 넣었습니다.
| session_id | turn_no | speaker | started_at | ended_at | stt_text |
|---|---|---|---|---|---|
| S-90301 | 1 | employee | 0 | 6.2 | 안녕하세요 고객님, ○○생명 김민준 설계사입니다. 지난번 보장 분석 … |
| S-90301 | 2 | ai_customer | 7 | 11.5 | 아 네, 그런데 요즘 좀 바빠서요. |
| S-90301 | 3 | employee | 12.4 | 19.8 | 길게 안 걸립니다. 이번 주 목요일 오후에 20분만 뵐 수 있을까요? |
| S-90301 | 4 | ai_customer | 21 | 24.1 | 목요일 3시면 괜찮아요. |
| S-90305 | 1 | employee | 0 | 5.4 | 안녕하세요 고객님, 실손 청구 문의 남겨 주셔서 연락드렸습니다. |
아래 JSON Schema 에 맞는 음성 롤플레이 턴 기록 행을 더 만들어 주세요. {"type":"object","properties":{"session_id":{"type":"string"},"turn_no":{"type":"integer","minimum":1},"speaker":{"type":"string","enum":["employee","ai_customer"],"description":"employee 는 설계사, ai_customer 는 AI 고객입니다."},"started_at":{"type":"number","minimum":0,"description":"세션 녹음 시작부터 지난 초입니다."},"ended_at":{"type":"number","minimum":0,"description":"세션 녹음 시작부터 지난 초입니다."},"stt_text":{"type":["string","null"],"description":"설계사 턴은 음성 인식 결과, AI 고객 턴은 AI 가 말한 문장입니다. 인식 결과가 없으면 null 입니다."}},"required":["session_id","turn_no","speaker","started_at","ended_at","stt_text"]} 한 세션은 설계사(employee)가 먼저 말을 꺼내고 AI 고객(ai_customer)과 번갈아 말하며, AI 고객은 대개 설계사 턴이 끝나고 0.5~1.5초 뒤에 답합니다. 보험 영업 상황(보장 점검·반론 극복·방문 약속·청구 안내)의 대화를 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) AI 고객이 정확히 2.0초 뒤에 답하는 턴, (2) AI 고객 턴 started_at 이 앞 설계사 턴 ended_at 보다 이른 겹침이 한 세션에 한 번과 두 번인 경우, (3) 2초 넘게 말했는데 stt_text 가 null 이거나 빈 문자열인 설계사 턴, (4) 2초 이하 맞장구인데 stt_text 가 공백만 남은 턴, (5) 시나리오 최소 턴 수보다 일찍 끝난 세션. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"session_id":{"type":"string"},"turn_no":{"type":"integer","minimum":1},"speaker":{"type":"string","enum":["employee","ai_customer"],"description":"employee 는 설계사, ai_customer 는 AI 고객입니다."},"started_at":{"type":"number","minimum":0,"description":"세션 녹음 시작부터 지난 초입니다."},"ended_at":{"type":"number","minimum":0,"description":"세션 녹음 시작부터 지난 초입니다."},"stt_text":{"type":["string","null"],"description":"설계사 턴은 음성 인식 결과, AI 고객 턴은 AI 가 말한 문장입니다. 인식 결과가 없으면 null 입니다."}},"required":["session_id","turn_no","speaker","started_at","ended_at","stt_text"]}롤플레이가 끝난 뒤 쏘카인드가 만드는 코칭 리포트 가운데 점수 부분입니다. score 를 화법 점수라 부르는 것은 공고가 아니라 쏘카인드 제품 사이트(https://sokind.ai)의 용어를 따른 것입니다. 시나리오 표에 없는 커스텀 롤플레이 세션을 하나 넣었습니다.
| session_id | employee_id | branch | scenario_id | score | reported_at |
|---|---|---|---|---|---|
| S-90301 | E-1042 | 강남지점 | SC-CALL-03 | 84 | 2026-09-28T10:14:00+09:00 |
| S-90305 | E-1077 | 강남지점 | SC-CLM-05 | 79 | 2026-09-28T11:02:00+09:00 |
| S-90311 | E-1013 | 강남지점 | SC-OBJ-01 | 52 | 2026-09-29T09:40:00+09:00 |
| S-90327 | E-1058 | 강남지점 | SC-NEED-02 | 48 | 2026-09-29T14:21:00+09:00 |
| S-90342 | E-1031 | 강남지점 | SC-CALL-03 | 41 | 2026-09-30T10:05:00+09:00 |
아래 JSON Schema 에 맞는 롤플레이 코칭 리포트 점수 행을 더 만들어 주세요. {"type":"object","properties":{"session_id":{"type":"string"},"employee_id":{"type":"string"},"branch":{"type":"string"},"scenario_id":{"type":"string","description":"배정된 시나리오 번호입니다. 커스텀 롤플레이는 CUSTOM- 으로 시작합니다."},"score":{"type":"integer","minimum":0,"maximum":100,"description":"코칭 리포트의 화법 점수입니다."},"reported_at":{"type":"string","description":"+09:00 오프셋이 붙은 ISO 8601 시각입니다."}},"required":["session_id","employee_id","branch","scenario_id","score","reported_at"]} 점수는 대개 60~90 사이이고, 같은 설계사가 같은 주에 여러 시나리오를 치른 기록을 섞습니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 시나리오 표에 없는 CUSTOM- 시나리오 번호, (2) 대화 기록상 문제가 없는데 점수가 낮은 세션, (3) 같은 설계사가 같은 시나리오를 두 번 치른 세션. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"session_id":{"type":"string"},"employee_id":{"type":"string"},"branch":{"type":"string"},"scenario_id":{"type":"string","description":"배정된 시나리오 번호입니다. 커스텀 롤플레이는 CUSTOM- 으로 시작합니다."},"score":{"type":"integer","minimum":0,"maximum":100,"description":"코칭 리포트의 화법 점수입니다."},"reported_at":{"type":"string","description":"+09:00 오프셋이 붙은 ISO 8601 시각입니다."}},"required":["session_id","employee_id","branch","scenario_id","score","reported_at"]}고객사 교육 담당자가 설계사에게 배정하는 롤플레이 시나리오 목록입니다. min_turns 는 그 시나리오의 미션을 끝내려면 필요한 최소 턴 수입니다.
| scenario_id | title | min_turns |
|---|---|---|
| SC-OBJ-01 | [반론극복] 보험료가 부담된다는 고객 | 6 |
| SC-NEED-02 | 종신보험 니즈 환기 상담 | 6 |
| SC-CALL-03 | 방문 약속 잡기 콜 화법 | 4 |
| SC-REF-04 | [반론극복] 이미 보험이 많다는 고객 | 6 |
| SC-CLM-05 | 실손 청구 문의 응대 | 4 |
아래 JSON Schema 에 맞는 롤플레이 시나리오 행을 더 만들어 주세요. {"type":"object","properties":{"scenario_id":{"type":"string"},"title":{"type":"string"},"min_turns":{"type":"integer","minimum":2,"description":"설계사와 AI 고객 턴을 합친 최소 턴 수입니다."}},"required":["scenario_id","title","min_turns"]} 보험 영업의 상황(반론 극복·니즈 환기·방문 약속·청구 안내·갱신·해지 방어)을 제목으로 쓰고, 짧은 확인 콜은 min_turns 4, 상담형은 6~8 로 둡니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 제목이 비슷한데 min_turns 가 다른 시나리오, (2) min_turns 가 10 이상인 긴 상담 시나리오. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"scenario_id":{"type":"string"},"title":{"type":"string"},"min_turns":{"type":"integer","minimum":2,"description":"설계사와 AI 고객 턴을 합친 최소 턴 수입니다."}},"required":["scenario_id","title","min_turns"]}| Python | 턴 간격과 겹침, 인식이 빈 긴 턴, 턴 수 미달을 세는 판정 엔진의 언어입니다. |
| FastAPI·비동기 작업 | 롤플레이가 끝날 때마다 세션 턴 기록을 받아 비동기 작업으로 판정하고, 코칭 리포트 점수 옆에 판정을 붙이는 API 입니다. |
| TypeScript·React | 교육 담당자가 지점·주차별 판정 목록과 세션 턴 타임라인을 보는 웹 화면입니다. |
| STT 기반 음성 대화 처리 | 1.4초 맞장구처럼 짧은 턴과 인식이 실패한 긴 발화를 턴 길이 2초로 나누고, 공백만 남은 인식 결과를 빈 결과로 읽습니다. |
| AI Evals | 2주차에 AI 고객 턴을 늦추거나 앞당기고 인식 결과를 지운 변형 세션 200회를 만들어, 넣은 문제가 판정으로 돌아오는지 셉니다. |
| Observability | 세션마다 AI 고객 응답 간격을 남겨 시나리오별 p90 응답 간격과 끼어들기 비율을 주차별로 띄웁니다. |
| LLM Native SDK·Tool Calling | 3주차에 Anthropic SDK 의 tool use 로 Claude Haiku 4.5 가 세션 턴 조회 도구를 불러 걸린 턴 앞뒤를 읽습니다. |
| Guardrail | 모델이 적은 장면 설명의 턴 번호와 인용문이 실제 턴 기록에 있는지 대조해, 없는 인용이 섞이면 설명을 버립니다. |
| AWS | 2주차부터 Docker 이미지로 AWS App Runner 에 올려 교육 담당자와 크디랩 고객 성공 담당자가 같은 주소로 봅니다. |
✗ fail → 교육 담당자가 S-90327 을 늦은 응답 쪽으로 먼저 봐야 한다고 하면 끼어들기와 늦은 응답의 차례를 바꿔 대표 판정만 달라지는지 보고, 응답 지연 비율이 어긋나면 AI 고객이 먼저 말을 거는 시나리오의 첫 AI 턴을 어떻게 세는지부터 살핍니다.
✓ pass → 교육 담당자가 그대로 반영 묶음만 남긴 순위표로 이번 주 코칭 대상을 다시 뽑아 볼 수 있으면 1주차로 충분합니다. 이어간다면 롤플레이가 끝날 때마다 판정을 붙이는 비동기 작업과 시나리오별 탭이 다음입니다.
✗ fail → 넣은 문제가 다른 판정으로 돌아오면 간격을 잴 때 바로 앞 설계사 턴을 잡는 코드부터 보고, 장면 메모는 미룹니다.
✓ pass → 문제 장면 메모와 재응시 명단으로 3주차를 엽니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · session_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
직원 말이 글자로 안 잡힘음성 인식 실패AI 고객이 말을 끊음AI 끼어들기AI 고객 응답이 늦음AI 응답 지연미션 전에 대화가 끝남턴 수 미달점수 그대로 반영점수 반영롤플레이 세션 하나가 설계사 턴의 인식 공백, AI 고객 끼어들기, AI 고객 응답 간격, 턴 수를 거쳐 화법 점수를 그대로 반영할지 판정받는 형식입니다. 판정은 규칙이 정하고, 3주차부터 걸린 세션의 문제 장면 설명만 모델이 씁니다.
{"type":"object","properties":{"session_id":{"type":"string"},"employee_id":{"type":"string"},"scenario_id":{"type":"string"},"score":{"type":"integer","minimum":0,"maximum":100},"verdict":{"type":"string","enum":["점수 그대로 반영","AI 고객 응답이 늦음","AI 고객이 말을 끊음","직원 말이 글자로 안 잡힘","미션 전에 대화가 끝남"]},"also_flagged":{"type":"array","items":{"type":"string","enum":["AI 고객 응답이 늦음","AI 고객이 말을 끊음","직원 말이 글자로 안 잡힘","미션 전에 대화가 끝남"]},"description":"대표 판정(verdict) 말고도 걸린 판정입니다. 판정 차례에서 대표 판정 뒤에 걸린 것만 차례대로 담고, 없으면 빈 배열입니다."},"turn_count":{"type":"integer","minimum":0,"description":"그 session_id 의 roleplay_turns 행 수입니다."},"min_turns":{"type":["integer","null"],"description":"coach_reports.scenario_id 로 찾은 scenarios.min_turns 입니다. 시나리오 표에 없으면 null 입니다."},"ai_turns":{"type":"integer","minimum":0,"description":"speaker 가 ai_customer 인 턴 수입니다."},"late_ai_turns":{"type":"integer","minimum":0,"description":"바로 앞이 employee 턴인 AI 고객 턴 가운데 started_at 에서 앞 턴 ended_at 을 뺀 간격이 2초를 넘는 턴 수입니다."},"late_ratio":{"type":"number","minimum":0,"maximum":1,"description":"late_ai_turns 를 ai_turns 로 나눈 값(소수 셋째 자리)입니다."},"overlap_count":{"type":"integer","minimum":0,"description":"AI 고객 턴 started_at 이 바로 앞 employee 턴 ended_at 보다 이른 횟수입니다."},"blank_long_turns":{"type":"integer","minimum":0,"description":"ended_at 에서 started_at 을 뺀 길이가 2초를 넘고 stt_text 가 null 이거나 앞뒤 공백을 지우면 빈 employee 턴 수입니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["session_id","employee_id","scenario_id","score","verdict","also_flagged","turn_count","min_turns","ai_turns","late_ai_turns","late_ratio","overlap_count","blank_long_turns","evidence","summary"]}[
{
"session_id": "S-90363",
"employee_id": "E-1090",
"scenario_id": "CUSTOM-0921",
"score": 76,
"verdict": "점수 그대로 반영",
"also_flagged": [],
"turn_count": 4,
"min_turns": null,
"ai_turns": 2,
"late_ai_turns": 0,
"late_ratio": 0,
"overlap_count": 1,
"blank_long_turns": 0,
"evidence": [
{
"field": "ended_at",
"value": 7.2
},
{
"field": "started_at",
"value": 6.6
},
{
"field": "stt_text",
"value": " "
},
{
"field": "ended_at",
"value": 12.9
},
{
"field": "scenario_id",
"value": "CUSTOM-0921"
}
],
"summary": "AI 고객이 설계사 말 끝보다 0.6초 일찍 말을 시작한 겹침이 한 번 있었지만 기준 두 번에 못 미쳐 점수를 그대로 반영합니다.",
"hedge": "공백만 남은 3번 턴은 1.4초짜리 맞장구라 인식 실패로 세지 않았습니다. CUSTOM-0921 은 시나리오 표에 없는 커스텀 롤플레이라 턴 수 비교를 건너뛰었습니다."
},
{
"session_id": "S-90374",
"employee_id": "E-1101",
"scenario_id": "SC-CALL-03",
"score": 69,
"verdict": "점수 그대로 반영",
"also_flagged": [],
"turn_count": 4,
"min_turns": 4,
"ai_turns": 2,
"late_ai_turns": 0,
"late_ratio": 0,
"overlap_count": 0,
"blank_long_turns": 0,
"evidence": [
{
"field": "started_at",
"value": 0
},
{
"field": "ended_at",
"value": 2
},
{
"field": "stt_text",
"value": ""
},
{
"field": "min_turns",
"value": 4
}
],
"summary": "AI 고객이 0.6초와 0.8초 만에 답했고 턴 4개를 채워 점수를 그대로 반영합니다.",
"hedge": "1번 설계사 턴은 인식 결과가 비었지만 길이가 정확히 2.0초라 2초 초과 기준에 걸리지 않았습니다. 첫인사가 인식되지 않은 것이 69점에 영향을 줬는지는 교육 담당자가 녹음으로 확인합니다."
},
{
"session_id": "S-90311",
"employee_id": "E-1013",
"scenario_id": "SC-OBJ-01",
"score": 52,
"verdict": "AI 고객 응답이 늦음",
"also_flagged": [],
"turn_count": 6,
"min_turns": 6,
"ai_turns": 3,
"late_ai_turns": 1,
"late_ratio": 0.333,
"overlap_count": 0,
"blank_long_turns": 0,
"evidence": [
{
"field": "ended_at",
"value": 24
},
{
"field": "started_at",
"value": 27.1
},
{
"field": "ended_at",
"value": 7.5
},
{
"field": "started_at",
"value": 9.5
},
{
"field": "speaker",
"agg": "count",
"value": 3
},
{
"field": "score",
"value": 52
}
],
"summary": "AI 고객 턴 3개 중 4번 턴이 설계사 말이 끝나고 3.1초 뒤에 시작해 늦은 턴 비율이 33.3% 로 기준 30% 를 넘었습니다.",
"hedge": "2번 턴은 정확히 2.0초 만에 시작해 늦은 턴으로 세지 않았습니다. AI 턴이 세 개뿐인 세션은 한 턴만 늦어도 기준을 넘으니, 교육 담당자는 늦은 장면을 보고 재응시를 정합니다."
},
{
"session_id": "S-90327",
"employee_id": "E-1058",
"scenario_id": "SC-NEED-02",
"score": 48,
"verdict": "AI 고객이 말을 끊음",
"also_flagged": [
"AI 고객 응답이 늦음"
],
"turn_count": 6,
"min_turns": 6,
"ai_turns": 3,
"late_ai_turns": 1,
"late_ratio": 0.333,
"overlap_count": 2,
"blank_long_turns": 0,
"evidence": [
{
"field": "ended_at",
"value": 9
},
{
"field": "started_at",
"value": 8.2
},
{
"field": "ended_at",
"value": 21.4
},
{
"field": "started_at",
"value": 20.1
},
{
"field": "ended_at",
"value": 30.2
},
{
"field": "started_at",
"value": 32.7
},
{
"field": "speaker",
"agg": "count",
"value": 3
},
{
"field": "score",
"value": 48
}
],
"summary": "설계사가 1번과 3번 턴을 말하는 도중 AI 고객이 0.8초, 1.3초 일찍 말을 시작해 겹침이 두 번 생겼습니다.",
"hedge": "마지막 6번 턴은 설계사 말이 끝나고 2.5초 뒤에 시작해 늦은 턴 비율도 33.3% 로 기준을 넘었습니다. 끼어들기가 판정 차례에서 앞이라 대표 판정이 되고, 늦은 응답은 함께 걸린 판정에 남습니다."
},
{
"session_id": "S-90342",
"employee_id": "E-1031",
"scenario_id": "SC-CALL-03",
"score": 41,
"verdict": "직원 말이 글자로 안 잡힘",
"also_flagged": [],
"turn_count": 4,
"min_turns": 4,
"ai_turns": 2,
"late_ai_turns": 0,
"late_ratio": 0,
"overlap_count": 0,
"blank_long_turns": 1,
"evidence": [
{
"field": "started_at",
"value": 0
},
{
"field": "ended_at",
"value": 6
},
{
"field": "stt_text",
"value": null
},
{
"field": "score",
"value": 41
}
],
"summary": "1번 설계사 턴이 6초 동안 이어졌는데 음성 인식 결과가 없습니다.",
"hedge": "AI 고객이 바로 '잘 안 들리는데요' 라고 답해 인식 실패가 대화에도 드러납니다. 마이크 문제인지 인식 문제인지는 녹음으로 확인합니다."
},
{
"session_id": "S-90380",
"employee_id": "E-1077",
"scenario_id": "SC-CALL-03",
"score": 55,
"verdict": "직원 말이 글자로 안 잡힘",
"also_flagged": [],
"turn_count": 4,
"min_turns": 4,
"ai_turns": 2,
"late_ai_turns": 0,
"late_ratio": 0,
"overlap_count": 0,
"blank_long_turns": 1,
"evidence": [
{
"field": "started_at",
"value": 9.8
},
{
"field": "ended_at",
"value": 13.2
},
{
"field": "stt_text",
"value": " "
},
{
"field": "score",
"value": 55
}
],
"summary": "3번 설계사 턴이 3.4초 이어졌는데 인식 결과에 공백만 남아 말이 글자로 잡히지 않았습니다.",
"hedge": "공백을 그대로 글자로 읽으면 이 턴이 인식된 말로 보여 점수가 그대로 반영됩니다. AI 고객이 바로 다시 말해 달라고 해 대화에도 드러납니다."
},
{
"session_id": "S-90358",
"employee_id": "E-1066",
"scenario_id": "SC-OBJ-01",
"score": 38,
"verdict": "미션 전에 대화가 끝남",
"also_flagged": [],
"turn_count": 4,
"min_turns": 6,
"ai_turns": 2,
"late_ai_turns": 0,
"late_ratio": 0,
"overlap_count": 0,
"blank_long_turns": 0,
"evidence": [
{
"field": "turn_no",
"agg": "count",
"value": 4
},
{
"field": "min_turns",
"value": 6
},
{
"field": "scenario_id",
"value": "SC-OBJ-01"
},
{
"field": "score",
"value": 38
}
],
"summary": "세션 턴이 4개로 끝나 SC-OBJ-01 의 최소 턴 6개에 못 미쳤습니다.",
"hedge": "응답 간격과 인식 결과에는 문제가 없어, AI 고객이 '운전 중' 설정으로 일찍 대화를 끊은 것인지 설계사가 이어가지 못한 것인지는 교육 담당자가 대화를 읽고 정합니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 점수 그대로 반영·AI 고객 응답이 늦음·AI 고객이 말을 끊음·직원 말이 글자로 안 잡힘·미션 전에 대화가 끝남 다섯 값 중 하나인지 확인합니다. 2. session_id·employee_id·scenario_id·score·verdict·also_flagged·turn_count·min_turns·ai_turns·late_ai_turns·late_ratio·overlap_count·blank_long_turns·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. late_ratio 가 0 이상 1 이하이고 late_ai_turns 가 ai_turns 이하인지 확인합니다. 4. turn_count·ai_turns·late_ai_turns·late_ratio·overlap_count·blank_long_turns 를 같은 session_id 의 roleplay_turns 를 turn_no 순으로 세워 다시 계산합니다. 응답 간격은 AI 고객 턴 started_at 에서 바로 앞 employee 턴 ended_at 을 뺀 값이고, 2초를 넘으면 늦은 턴, 0 보다 작으면 겹침입니다. 5. blank_long_turns 가 1 이상이면 verdict 는 직원 말이 글자로 안 잡힘입니다. 6. 앞 조건에 걸리지 않고 overlap_count 가 2 이상이면 verdict 는 AI 고객이 말을 끊음입니다. 7. 앞 조건에 걸리지 않고 late_ratio 가 0.3 이상이면 verdict 는 AI 고객 응답이 늦음입니다. 8. 앞 조건에 걸리지 않고 min_turns 가 null 이 아니며 turn_count 가 min_turns 미만이면 verdict 는 미션 전에 대화가 끝남이고, 어느 조건에도 걸리지 않으면 점수 그대로 반영입니다. 9. also_flagged 의 값이 verdict 와 겹치지 않고, 판정 차례에서 verdict 뒤에 오는 판정 가운데 조건이 성립한 것만 차례대로 담겼는지 확인합니다. 10. evidence 의 field 이름이 세 데이터셋 중 하나에 있는 컬럼인지 대조합니다. 11. evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 여러 행을 센 수는 agg 를 적습니다. 12. summary 가 존댓말로 끝나는지 확인합니다. [판정 차례 · 한 세션에 문제가 겹칠 때] 교육 담당자 목록에는 아래 차례에서 처음 걸린 판정이 세션의 대표 판정으로 뜨고, 뒤에 함께 걸린 판정은 also_flagged 에 남아 세션 페이지에 같이 보입니다. ① 직원 말이 글자로 안 잡힘 → ② AI 고객이 말을 끊음 → ③ AI 고객 응답이 늦음 → ④ 미션 전에 대화가 끝남 → ⑤ 점수 그대로 반영. 말이 안 잡힌 턴이 있으면 점수를 매긴 재료가 비어 있어 맨 앞이고, 설계사 말을 자른 끼어들기는 대화 순서를 바꾸므로 늦은 응답보다 앞입니다. 턴 수 미달은 앞 세 문제 끝에 생기기도 해서 맨 뒤입니다. [하드 케이스 · 판정이 갈리는 이유] S-90311 의 2번 턴은 간격이 정확히 2.0초라 늦은 턴이 아니고, 4번 턴의 3.1초 하나만으로 1/3 이 되어 기준 30% 를 넘습니다. S-90363 은 겹침이 한 번뿐이라 끊음이 아니고, 공백만 남은 3번 턴은 길이 1.4초라 인식 실패로 세지 않으며, CUSTOM-0921 이 scenarios 에 없어 min_turns 가 null 이므로 턴 수 비교를 건너뜁니다. S-90374 의 1번 턴은 stt_text 가 빈 문자열이지만 길이가 정확히 2.0초라 2초 초과가 아닙니다. S-90342 의 1번 턴은 stt_text 가 null 이고 6초라 인식 실패입니다. S-90380 의 3번 턴은 3.4초인데 stt_text 가 공백 세 칸이라, 공백을 지운 뒤에야 빈 결과로 읽혀 인식 실패가 됩니다. S-90327 은 겹침 두 번과 6번 턴의 2.5초 지연이 함께 걸려, 대표 판정은 끊음이고 also_flagged 에 늦은 응답이 남습니다. [용어 출처 · 공고 밖] 화법 점수는 이 공고에 나오지 않는 말입니다. 공고는 쏘카인드를 직무 화법 코칭 서비스로 소개하고, 코칭 리포트의 점수를 화법 점수라 부르는 것은 쏘카인드 제품 사이트(https://sokind.ai)의 용어를 따랐습니다. coach_reports.score 가 그 점수 자리입니다. [평가 러너 · 2주차] 정상 세션의 AI 고객 턴을 일부러 늦추거나 앞당기고 설계사 인식 결과를 지운 변형 세션 200회를 만들어, 넣은 문제가 그 판정으로 돌아온 세션 수를 셉니다. [수동 검증 · 사람이 봅니다] 1. 걸린 세션의 설계사를 재응시시킬지는 교육 담당자가 녹음과 대화를 보고 정합니다. 2. 문제가 몰린 시나리오의 AI 고객 설정을 바꿀지는 크디랩 고객 성공 담당자가 정합니다.