두부
경력근거: 보호자와 아이의 실제 사용 경험을 반영해 실시간 이슈를 진단하고 빠르게 해결
※ 실제 산출물이 아닌 AI 예측 시안입니다.
두부핑퐁은 아이와 또래처럼 상호작용하는 음성 AI라, 인식 실패나 무응답 같은 세션 이슈 패턴이 아이 발화 특성과 두부의 STT·LLM·TTS 파이프라인 구성에서만 현실적으로 나옵니다. 이 포트폴리오는 세션 이벤트를 받아 규칙으로 이슈를 진단하고 파이프라인 단계별로 원인을 분해하는 백엔드 기술을 보여주며, 아동 발달이나 언어치료 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
아이와 AI가 또래처럼 주고받는 두부핑퐁 세션의 턴 기록을 받아 저장·집계하는 웹 백엔드를 담당합니다.
보호자와 아이의 실제 사용에서 생기는 인식 실패·응답 지연·무응답을 규칙으로 진단하고 근거 턴을 붙여, 문제가 된 세션만 골라냅니다.
STT·LLM·TTS 각 단계의 지연과 실패를 나눠 재, 어느 단계에서 세션이 막혔는지 근거로 보여줍니다.
두부핑퐁의 아이와 AI 음성 상호작용 세션을 받아 이슈를 진단하는 백엔드입니다. 세션의 턴별 기록(음성 인식 전사·인식 확신도·응답 지연·아이 응답 여부)을 받아 음성 인식 실패·응답 지연·아이 무응답 같은 이슈를 규칙으로 판정하고 근거 턴을 붙여, 문제가 된 세션만 골라 보호자·운영자가 볼 리포트로 만듭니다. 세션 기록은 사내 파이프라인 대신 더미 이벤트를 가정합니다.
아이와 AI가 주고받은 세션이 하루에도 수없이 쌓이는데 어느 세션에서 음성 인식이 헛돌거나 아이가 답을 안 했는지 로그를 일일이 뒤져야 알 수 있어 답답하던 운영 엔지니어가, 이슈가 생긴 세션과 그 근거 턴만 자동으로 받아보고 싶은 사람입니다.
세션 턴마다 인식 확신도·응답 지연·응답 여부를 남기고 그 값으로 이슈를 규칙으로 판정하면, 사람이 로그를 뒤지지 않아도 문제가 된 세션을 근거 턴과 함께 골라낼 수 있다는 가정입니다.
세션 턴 기록 더미(인식 전사·인식 확신도·응답 지연·응답 여부)를 넣으면 음성 인식 실패·응답 지연·아이 무응답을 규칙으로 판정하고 근거 턴을 붙여, 이슈가 있는 세션과 없는 세션을 나눠 세션 리포트로 돌려주는 백엔드 API 가 도는 완결품입니다. 세션 기록은 사내 파이프라인 대신 더미 이벤트를 가정합니다.
1주차 API 를 AWS 로 배포·운영하고, 이슈가 생긴 세션을 실시간으로 플래그해 이슈 유형별 발생 건수와 최근 추이를 집계 화면으로 보여줍니다.
STT·LLM·TTS 각 단계의 지연을 나눠 재고 세션이 어느 단계에서 막혔는지 짚어, 단계별 지연 분포와 병목 세션 목록을 함께 보여줍니다.
세션 턴 더미를 넣으면 인식 실패·응답 지연·무응답 이슈가 근거 턴과 함께 판정되는 과정을 시연합니다.
규칙으로 만든 이슈 정답과 판정 결과의 일치율을 보여주며, 단 정답과 더미 세션을 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
일부러 만든 인식 실패·극단 지연·무응답·표기 흔들림 30종을 넣어도 API 가 멈추지 않고 이슈를 근거와 함께 판정하는 강건성을 보여줍니다.
위 수치는 더미데이터 자가채점이며, 실제 이슈 진단 정확도는 두부 실 세션 로그와 실 운영자가 있어야 측정 가능합니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 게 당연하므로, 인식 실패·극단 지연·무응답 같은 경계 케이스를 더미 세션에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
이 포트폴리오는 세션 이벤트 진단·집계·단계 분해 백엔드 기술을 보여주며, 아동 발달 도메인 전문성은 주장하지 않습니다. 이슈 판정은 임계값 규칙으로 채점하고 LLM 은 요약 보조만 맡아 지어낸 이슈가 통과하지 못하게 합니다.
실제 도입 때는 실 세션의 인식 확신도 분포와 아이 발화 특성, 실 파이프라인 지연으로 임계값과 이슈 정의가 달라지므로, 이슈 규칙과 임계값 교체를 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
두부핑퐁 음성 세션의 턴 기록으로, 인식 확신도 결측·극단 지연·아이 무응답·화자 표기 흔들림 같은 하드 케이스를 일부러 섞어 이슈가 근거 턴과 함께 판정되는지 확인합니다.
| session_id | turn_index | speaker | stt_text | stt_confidence | response_latency_ms | tts_latency_ms |
|---|---|---|---|---|---|---|
| S-4001 | 0 | ai | 오늘 뭐 하고 놀았어? | — | — | 320 |
| S-4001 | 1 | child | 블록 쌓기 했어요 | 0.92 | 1,400 | — |
| S-4002 | 0 | ai | 좋아하는 색깔이 뭐야? | — | — | 300 |
| S-4002 | 1 | child | — | 0.21 | 8,200 | — |
| S-4003 | 0 | ai | 우리 같이 세어 볼까? | — | — | 5,200 |
다음 JSON Schema 에 맞는 세션 턴 기록을 더 생성하세요: {"type":"object","properties":{"session_id":{"type":"string"},"turn_index":{"type":"integer"},"speaker":{"type":"string","enum":["child","ai"]},"stt_text":{"type":["string","null"]},"stt_confidence":{"type":["number","null"]},"response_latency_ms":{"type":["integer","null"]},"tts_latency_ms":{"type":["integer","null"]}},"required":["session_id","turn_index","speaker"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: 아이 턴인데 stt_text 가 null 이고 stt_confidence 가 낮은 음성 인식 실패, response_latency_ms 가 8000 이상인 극단 지연, 아이가 끝까지 응답 없는 무응답 세션, stt_text 가 '어어… 그거…'처럼 불완전 발화인 경계값, ai 턴의 tts_latency_ms 가 0 이거나 결측인 표기 흔들림. 각 이슈 유형마다 정상 세션 1건과 하드 케이스 1건 이상이 섞이게 하고, 형식 깨뜨리기 시도(스키마 타입 위반) 3건은 데이터가 아니라 별도 목록으로 표시하세요.{"type":"object","properties":{"session_id":{"type":"string"},"turn_index":{"type":"integer"},"speaker":{"type":"string","enum":["child","ai"]},"stt_text":{"type":["string","null"]},"stt_confidence":{"type":["number","null"]},"response_latency_ms":{"type":["integer","null"]},"tts_latency_ms":{"type":["integer","null"]}},"required":["session_id","turn_index","speaker"]}| TypeScript | 세션 이벤트를 받는 백엔드 API 와 세션 기록 스키마를 타입으로 묶어, 필드 누락을 컴파일 단계에서 막습니다. |
| Node.js | 세션 턴 이벤트를 받아 이슈 판정과 리포트 생성을 처리하는 API 서버를 구현합니다. |
| Go | 쌓인 세션을 이슈 유형·단계별로 집계하는 배치 워커를 구현합니다. |
| PostgreSQL | 세션과 턴 기록을 저장하고 이슈·단계별 집계 질의를 처리합니다. |
| Redis | 진행 중인 세션의 실시간 이슈 플래그 상태를 담아 집계 화면에 빠르게 내보냅니다. |
| WebRTC | 실시간 음성 세션에서 턴 시작·종료와 지연 같은 이벤트를 받아오는 지점을 다룹니다. |
| 음성 파이프라인(STT·LLM·TTS) | 각 단계의 지연과 실패를 턴 기록으로 남겨 단계별 원인 분해의 입력으로 씁니다. |
| Claude Sonnet | 이슈로 잡힌 세션의 턴 전사를 한 줄로 요약해 리포트에 붙이고, 이슈 판정 자체는 규칙이 합니다. |
| AWS | 2주차부터 API 와 집계 워커를 AWS 로 배포·운영합니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차에서 AWS 배포와 실시간 이슈 플래그·집계를 붙입니다.
✓ pass → 여기서 멈춰도 검증된 완결입니다. 더 키우려면 3주차에서 음성 파이프라인 단계별 지연을 분해합니다.
세션 한 건을 받아 판정된 이슈와 그 근거 턴을 함께 내보내, 근거 없는 이슈 판정을 자동으로 거를 수 있게 합니다.
{"type":"object","properties":{"session_id":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["인식_실패","응답_지연","무응답","파이프라인_지연"]},"evidence_turns":{"type":"array","items":{"type":"integer"}},"stage":{"type":["string","null"],"enum":["STT","LLM","TTS",null]}},"required":["type","evidence_turns"]}},"summary":{"type":["string","null"]},"hedge":{"type":["string","null"]}},"required":["session_id","issues"]}[
{
"session_id": "S-4002",
"issues": [
{
"type": "인식_실패",
"evidence_turns": [
1
],
"stage": "STT"
},
{
"type": "응답_지연",
"evidence_turns": [
1
],
"stage": null
}
],
"summary": "아이 발화 인식 확신도가 0.21 로 낮고 응답이 8.2초 지연됐습니다.",
"hedge": "인식 확신도 0.5 미만과 지연 5초 초과라는 합성 임계값 기준으로 판정했습니다."
},
{
"session_id": "S-4004",
"issues": [
{
"type": "응답_지연",
"evidence_turns": [
1
],
"stage": null
}
],
"summary": "아이 응답이 12초 지연됐습니다.",
"hedge": "지연 5초 초과 임계값으로 판정했고 인식 확신도 0.35 는 경계라 인식 실패로는 올리지 않았습니다(합성 기준)."
},
{
"session_id": "S-4003",
"issues": [
{
"type": "파이프라인_지연",
"evidence_turns": [
0
],
"stage": "TTS"
}
],
"summary": "AI 턴의 TTS 지연이 5.2초로 큽니다.",
"hedge": "TTS 지연 3초 초과를 파이프라인 지연으로 봤습니다."
},
{
"session_id": "S-4001",
"issues": [],
"summary": null,
"hedge": null
}
][자동 검증] 1. 각 issue 의 type 이 규칙 임계값(인식 확신도 0.5 미만이면 인식_실패, 응답 지연 5초 초과면 응답_지연, 아이 턴 stt_text 결측이면 무응답, TTS·LLM 지연 초과면 파이프라인_지연)과 일치하는지 대조합니다. 2. evidence_turns 가 실제로 그 조건을 만족하는 턴을 가리키는지 확인해, 근거 없는 이슈 판정을 거릅니다. 3. stage 가 파이프라인_지연일 때만 채워지는지 확인합니다. [수동 검증] 1. 인식 확신도가 0.35 처럼 경계에 있는 턴을 인식 실패로 올릴지 사람이 임계값 정책과 함께 봅니다. 2. summary 문구가 근거 턴 내용과 어긋나지 않는지 스팟체크합니다.