디플리
경력근거: 소리에 담긴 신호를 AI로 읽어내는 사운드 AI 회사
※ 실제 산출물이 아닌 AI 예측 시안입니다.
디플리는 소리에 담긴 신호를 AI 로 읽어내는 사운드 AI 회사로, 제조와 공공안전 현장에 기술을 적용해 왔습니다. 어떤 소리 패턴이 어떤 고장으로 이어지는지는 디플리가 현장에서 모은 이상 이벤트 데이터가 있어야 학습되고, ‘이상 소리 → 대응 초안 → 정비 결과 검증’ 으로 이어지는 사슬은 다른 회사 데이터로는 그대로 만들 수 없습니다.
‘정확한 모델을 만드는 것과 고객이 매일 믿고 쓰는 것은 다른 일’ 이라고 명시합니다. 모델 점수를 현장 대응으로 번역하는 트리아지 레이어가 FDE 의 일입니다.
사운드 AI 를 제조·공공안전 현장에 실제 적용해 왔습니다. 1주는 이상 이벤트에서 대응 초안까지 한 루프가 끝나는 최소 단위입니다.
엔지니어링 팀은 사운드 AI 를 프로덕트와 사용자 경험으로 만듭니다. 분류 근거를 현장 담당자가 읽히게 내고, 단정 표현을 누그러뜨려 신뢰를 올립니다.
사운드 AI 가 탐지한 이상 소리 이벤트에 설비·라인·정비 이력을 붙여 한 화면에서 봅니다. LLM 이 근거 이벤트를 붙여 고장 유형 Top3 와 대응 초안을 내고, 매일 아침 슬랙으로 현장 트리아지 리포트를 보냅니다. 1주차만으로 완성품이고, 분류가 실제 정비 결과와 맞는지 검증(2주차)·라인별 이상 추세 추적(3주차)으로 키웁니다.
디플리 FDE. 사운드 모델이 뱉는 이상 점수를 현장 담당자가 ‘그래서 뭘 해야 하나’ 로 번역하던 일을 끝내고, 그 분류가 실제 정비 결과와 맞았는지 보여주고 싶은 사람입니다.
이상 소리 이벤트를 한 스키마로 받고 설비·정비 이력을 붙이면, LLM 이 (a) 고장 유형 Top3 와 (b) 대응 초안 3건을 근거 이벤트와 함께 내고, (c) 다음 정비 결과로 그 분류가 맞았는지 검증합니다.
사운드 모델이 내보내는 이상 점수·주파수 대역 메타데이터를 입력으로 가정해, 이상 이벤트를 고장 유형으로 분류하고 대응 초안에 근거를 붙여 내고 매일 슬랙으로 보내는 동작하는 도구입니다. 무거운 오디오 모델 학습은 W2·W3 로 미루고 W1 은 메타데이터 기반으로 1주에 혼자 완성합니다.
LLM 이 분류한 고장 유형을 실제 정비 결과와 맞춰보고, 정비 담당자 2명이 분류가 타당한지 라벨링해 정확도·신뢰도를 보여주는 대시보드입니다.
검증된 분류를 라인·설비별로 누적해, 어느 라인에서 어떤 고장이 늘고 있는지 추세를 보여주는 단계입니다.
이상 소리 이벤트 한 건을 넣으면, 고장 유형 Top3 와 대응 초안, 근거 이벤트가 몇 초 안에 나오는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(점수 결측·미등록 설비·별칭 표기)을 넣어도 출력 형식(Zod 스키마)이 한 번도 안 깨지는 걸 보여줍니다
매일 아침 슬랙으로 트리아지 리포트가 자동 발송되는 걸 14일치 시연으로 보여줍니다
내가 만든 정답 30개 중 고장 유형 Top1 이 일치한 게 25개(83%)입니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 ‘성능 검증’ 이 아니라 ‘데모 조건에서의 동작’ 임을 밝힙니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 분류 정확도는 디플리 실 사운드 모델 출력과 실 정비 결과가 있어야 측정됩니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다
이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 ‘성능 증명’ 이 아닙니다. 면접에서 ‘데모 조건 동작 + 실검증 준비 상태’ 로 솔직히 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 헷갈리는 점수 결측·미등록 설비·경계 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다
‘이 소리 때문에 이 고장이다’ 는 상관일 뿐 인과가 아닐 수 있습니다. 대응 초안의 단정 표현을 강제로 누그러뜨리고 별도 LLM 검사로 우회 표현을 거릅니다
설비 이름 표기가 제각각입니다. 이름 유사도 + 라인·타입 필터로 같은 설비로 묶고, 못 묶은 건 추측하지 말고 ‘미등록 설비’ 로 알립니다
실제 도입 시 달라지는 점을 명시합니다. 실 사운드 모델 출력 분포는 더미와 다르므로 임계값을 다시 맞춰야 하고, 정비 검토자도 실제 인력으로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
사운드 AI 가 탐지한 이상 소리 이벤트 로그입니다(원본 오디오가 아니라 모델 출력 메타). 트리아지 LLM 이 가장 먼저 질의하는 테이블입니다. 운영 현실대로 결측(점수 누락)·미등록 설비·별칭 표기·경계값을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| event_id | ts | line_id | machine_raw | machine_id | anomaly_score | peak_band_hz | duration_ms | label_raw |
|---|---|---|---|---|---|---|---|---|
| ev_0001 | 2026-05-04T08:12:00 | L1 | 1호 컴프레서 | m_comp1 | 0.91 | 4,200 | 1,800 | 베어링 마모 의심 |
| ev_0002 | 2026-05-04T09:03:00 | L1 | 컴프레서 1 | m_comp1 | 0.88 | 4,100 | 1,500 | — |
| ev_0003 | 2026-05-04T10:20:00 | L2 | 2호 모터 | m_motor2 | 0.73 | 1,200 | 900 | 모터 불균형 |
| ev_0004 | 2026-05-05T08:40:00 | L2 | 컨베이어 | m_conv2 | — | 800 | 1,200 | 측정 누락 |
| ev_0005 | 2026-05-05T11:15:00 | L3 | 신규 펌프(미등록) | — | 0.95 | 5,200 | 2,200 | 누설음 의심 |
아래 Zod 스키마에 맞는 제조 설비 이상 소리 이벤트 14일치 JSON 배열로 생성. 라인 3개(L1~L3), 설비 유형(컴프레서·모터·컨베이어·팬·펌프) 분포 포함.
{"type":"object","properties":{"event_id":{"type":"string"},"ts":{"type":"string"},"line_id":{"type":"string"},"machine_raw":{"type":"string"},"machine_id":{"type":["string","null"]},"anomaly_score":{"type":["number","null"]},"peak_band_hz":{"type":["integer","null"]},"duration_ms":{"type":"integer"},"label_raw":{"type":["string","null"]}},"required":["event_id","ts","line_id","machine_raw","machine_id","anomaly_score","peak_band_hz","duration_ms","label_raw"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라(쉬운 문제만 푸는 함정 회피): (1) 같은 설비의 별칭 표기 혼입('1호 컴프레서'/'컴프레서 1'→machine_id m_comp1 로 정규화돼야 함), (2) 미등록 신규 설비(machine_id=null) 2~3건, (3) 결측. anomaly_score 가 null 인 행 1~2건(측정 누락) + peak_band_hz 가 null 인 행 1건, (4) 경계값 anomaly_score 0.0(오탐 의심)과 1.0(긴급) 각 1건. JSON 배열만.{"type":"object","properties":{"event_id":{"type":"string"},"ts":{"type":"string"},"line_id":{"type":"string"},"machine_raw":{"type":"string"},"machine_id":{"type":["string","null"]},"anomaly_score":{"type":["number","null"]},"peak_band_hz":{"type":["integer","null"]},"duration_ms":{"type":"integer"},"label_raw":{"type":["string","null"]}},"required":["event_id","ts","line_id","machine_raw","machine_id","anomaly_score","peak_band_hz","duration_ms","label_raw"]}설비 표준 ID + 별칭(같은 설비가 ‘1호 컴프레서/컴프레서 1/1번 압축기’ 로 들어옴)입니다. 트리아지가 별칭 차이로 분산되는 문제를 해소합니다.
| machine_id | canonical_name | aliases | line_id | machine_type | installed_year |
|---|---|---|---|---|---|
| m_comp1 | 1호 컴프레서 | ["컴프레서 1","1번 압축기"] | L1 | compressor | 2,019 |
| m_motor2 | 2호 모터 | ["2호모터","모터 2"] | L2 | motor | 2,020 |
| m_motor3 | 3호 모터 | ["모터 3"] | L3 | motor | 2,018 |
| m_conv2 | 2라인 컨베이어 | ["컨베이어","컨베이어 벨트"] | L2 | conveyor | 2,021 |
| m_fan1 | 1라인 냉각팬 | ["냉각팬"] | L1 | fan | — |
아래 Zod 스키마에 맞는 제조 machine_master 30행 JSON 배열로 생성. 같은 설비가 별칭 1~3개를 가지도록.
{"type":"object","properties":{"machine_id":{"type":"string"},"canonical_name":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"line_id":{"type":"string"},"machine_type":{"type":"string","enum":["compressor","motor","conveyor","fan","pump"]},"installed_year":{"type":["integer","null"]}},"required":["machine_id","canonical_name","aliases","line_id","machine_type","installed_year"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 의도적 혼입: (1) installed_year=null(설치연도 미상) 1~2건, (2) machine_type 분포 자연스럽게 라인 3개 분산. JSON 배열만.{"type":"object","properties":{"machine_id":{"type":"string"},"canonical_name":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"line_id":{"type":"string"},"machine_type":{"type":"string","enum":["compressor","motor","conveyor","fan","pump"]},"installed_year":{"type":["integer","null"]}},"required":["machine_id","canonical_name","aliases","line_id","machine_type","installed_year"]}| Python | ingest 파이프라인(이상 이벤트 메타 → PostgreSQL) + 트리아지 오케스트레이션 + eval 스크립트 |
| FastAPI | 트리아지 API(이상 이벤트 입력 → output_schema 반환) + 일일 리포트 봇 엔드포인트 |
| PyTorch | W2·W3 에서 이상 점수 보정·주파수 특징 분류기 학습(W1 은 모델 출력 메타 가정) |
| Linux | 현장 엣지 서버 가정 배포 환경 + cron 스케줄러 운영 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(분류가 실제 정비 결과와 맞는지 검증)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(라인별 이상 추세 추적)로 진행합니다.
1) 이상 이벤트별 분류 카드(고장 유형·근거 이벤트·완곡 표현), 2) 대응 초안 3건 + 긴급도 + 확신도, 3) 다음 정비 결과로 분류 적중 검증. 분류→대응→검증 한 주기를 한 스키마에 담습니다.
{"type":"object","properties":{"period":{"type":"string"},"classifications":{"type":"array","items":{"type":"object","properties":{"event_id":{"type":"string"},"machine_id":{"type":["string","null"]},"fault_type":{"type":"string","enum":["bearing","imbalance","leak","belt","normal","unknown"]},"headline":{"type":"string","minLength":10},"interpretation":{"type":"string","minLength":20},"evidence_events":{"type":"array","items":{"type":"string"},"minimum":1},"hedge":{"type":["string","null"],"minLength":8}},"required":["event_id","machine_id","fault_type","headline","interpretation","evidence_events","hedge"]},"minimum":3,"maximum":8},"actions":{"type":"array","items":{"type":"object","properties":{"machine_id":{"type":"string"},"reason":{"type":"string","minLength":20},"urgency":{"type":"string","enum":["low","mid","high"]},"confidence_prob":{"type":"number"}},"required":["machine_id","reason","urgency","confidence_prob"]},"minimum":3,"maximum":3},"verification":{"type":["object","null"],"properties":{"prior_period":{"type":"string"},"top1_match_rate":{"type":"number"},"brier_score":{"type":"number"},"checks":{"type":"array","items":{"type":"object","properties":{"event_id":{"type":"string"},"predicted_type":{"type":"string"},"actual_type":{"type":"string"},"match":{"type":"boolean"},"confidence_prob":{"type":"number"}},"required":["event_id","predicted_type","actual_type","match","confidence_prob"]}}},"required":["prior_period","top1_match_rate","brier_score","checks"]}},"required":["period","classifications","actions","verification"]}[
{
"input_ref": "2026-05-11 주간 (verification 은 직전 주 분류 결과)",
"output": {
"period": "2026-05-11",
"classifications": [
{
"event_id": "ev_0001",
"machine_id": "m_comp1",
"fault_type": "bearing",
"headline": "1호 컴프레서 베어링 마모 의심",
"interpretation": "4200Hz 고대역 피크 반복, anomaly_score 0.91. 베어링 마모 패턴과 유사.",
"evidence_events": [
"ev_0001",
"ev_0002"
],
"hedge": "표본 2건. 윤활 상태 미반영, 정비 확인 필요."
},
{
"event_id": "ev_0007",
"machine_id": "m_motor3",
"fault_type": "imbalance",
"headline": "3호 모터 심각 진동",
"interpretation": "1500Hz 대역 3초 지속, score 0.99. 회전 불균형 가능성.",
"evidence_events": [
"ev_0007",
"ev_0010"
],
"hedge": "단일 라인 표본. 부하 조건 미통제."
},
{
"event_id": "ev_0005",
"machine_id": null,
"fault_type": "unknown",
"headline": "미등록 설비 누설음 의심",
"interpretation": "5200Hz 고대역, machine_id 미매핑. 설비 등록 후 재분류 필요.",
"evidence_events": [
"ev_0005"
],
"hedge": "설비 미등록. 추측 대신 등록 권장."
}
],
"actions": [
{
"machine_id": "m_comp1",
"reason": "베어링 마모 의심. 다음 정비 주기 앞당겨 윤활·진동 점검 권장.",
"urgency": "mid",
"confidence_prob": 0.7
},
{
"machine_id": "m_motor3",
"reason": "심각 진동 지속. 즉시 부하 낮추고 정렬 점검 권장.",
"urgency": "high",
"confidence_prob": 0.85
},
{
"machine_id": "m_conv2",
"reason": "저대역 간헐 이상. 벨트 장력 점검 권장.",
"urgency": "low",
"confidence_prob": 0.55
}
],
"verification": {
"prior_period": "2026-05-04 ~ 2026-05-10 분류",
"top1_match_rate": 0.8,
"brier_score": 0.16,
"checks": [
{
"event_id": "ev_0001",
"predicted_type": "bearing",
"actual_type": "bearing",
"match": true,
"confidence_prob": 0.7
},
{
"event_id": "ev_0003",
"predicted_type": "imbalance",
"actual_type": "imbalance",
"match": true,
"confidence_prob": 0.65
},
{
"event_id": "ev_0009",
"predicted_type": "bearing",
"actual_type": "belt",
"match": false,
"confidence_prob": 0.55
}
]
}
}
},
{
"input_ref": "2026-05-18 주간",
"output": {
"period": "2026-05-18",
"classifications": [
{
"event_id": "ev_0012",
"machine_id": "m_comp1",
"fault_type": "bearing",
"headline": "1호 컴프레서 긴급 정지 이벤트",
"interpretation": "score 1.0, 4300Hz 4초 지속. 베어링 손상 임박 신호.",
"evidence_events": [
"ev_0012",
"ev_0001"
],
"hedge": "긴급 이벤트 단발. 재현 확인 필요."
},
{
"event_id": "ev_0011",
"machine_id": "m_conv2",
"fault_type": "belt",
"headline": "2라인 컨베이어 벨트 이상",
"interpretation": "저대역 750Hz 반복. 벨트 장력 저하 패턴.",
"evidence_events": [
"ev_0011",
"ev_0004"
],
"hedge": "측정 누락 행 1건 제외 집계."
},
{
"event_id": "ev_0008",
"machine_id": "m_motor2",
"fault_type": "normal",
"headline": "2호 모터 오탐 의심",
"interpretation": "score 0.0, 짧은 지속. 정상 가능성 높음.",
"evidence_events": [
"ev_0008"
],
"hedge": "단발 오탐. 추세 확인 필요."
}
],
"actions": [
{
"machine_id": "m_comp1",
"reason": "긴급 정지 재발 방지. 즉시 베어링 교체 검토.",
"urgency": "high",
"confidence_prob": 0.85
},
{
"machine_id": "m_conv2",
"reason": "벨트 장력 점검·조정. 라인 정지 전 예방.",
"urgency": "mid",
"confidence_prob": 0.6
},
{
"machine_id": "m_fan1",
"reason": "중대역 간헐 이상. 정기 점검 시 팬 베어링 확인.",
"urgency": "low",
"confidence_prob": 0.55
}
],
"verification": {
"prior_period": "2026-05-11 ~ 2026-05-17 분류",
"top1_match_rate": 0.8,
"brier_score": 0.17,
"checks": [
{
"event_id": "ev_0007",
"predicted_type": "imbalance",
"actual_type": "imbalance",
"match": true,
"confidence_prob": 0.85
},
{
"event_id": "ev_0005",
"predicted_type": "leak",
"actual_type": "leak",
"match": true,
"confidence_prob": 0.6
},
{
"event_id": "ev_0011",
"predicted_type": "belt",
"actual_type": "bearing",
"match": false,
"confidence_prob": 0.6
}
]
}
}
}
]자동: (1) Zod parse, (2) evidence_events 가 입력 sound_events 의 실재 event_id 인지 검사(환각 이벤트 차단), (3) 과잉 단정 토큰 검출 + LLM-as-judge 근거 인용 평가, (4) Brier score 자동 계산. confidence_prob 는 합성 기준 추정값이라 검증된 수치가 아님을 카드 hedge 에 드러냅니다. 수동: 정비 담당자 2명 비동기 라벨 → bootstrap Cohen’s κ CI 하한 ≥ 0.6, spot check 5%. verification 은 차주 정비 결과 자동 조인.