에이치에너지는 옥상과 지붕을 임대해 지은 태양광 발전소를 모햇으로 모으고 솔라온케어로 남의 소유 발전소까지 플랫폼에서 관리하는 구조라, 한 곳을 사람이 붙어서 보는 게 아니라 흩어진 다수를 원격 계측으로 살펴야 합니다. 소유주가 제각각이라 조치 하나를 보낼 때도 무엇을 근거로 판단했는지 남겨야 하고, 그래서 이상 판정과 조치 절차가 규칙으로 설명되어야 하는 요구가 에이치에너지의 제3자 소유 운영 구조에서 그대로 나옵니다. 이 포트폴리오가 입증하는 것은 계측 데이터를 기대값 규칙으로 판정하고 절차표와 이어 실행 가능한 지시로 바꾸는 기술이며, 태양광 발전 설비나 전력거래 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
발전소 진단 알람과 조치를 자동화하는 일을 빠른 빌드 과제로 직접 지목합니다.
개발·인허가·O&M·전력거래로 이어지는 사업 프로세스를 사람이 하던 반복 업무부터 자동화합니다.
빠르게 만든 시제품을 배포와 모니터링, 예외 처리까지 마감해 본 경험을 우대합니다.
에이치에너지가 솔라온케어로 제3자 소유 발전소를 플랫폼에서 운영·관리하는 맥락에서, 발전소 계측 기록을 받아 기대 발전량에 못 미치는 구간과 인버터 고장 신호를 규칙으로 짚고 오류코드에 대응하는 조치 절차를 찾아 작업지시 초안을 근거와 함께 만들어 주는 O&M 도구입니다. 계측 기록과 조치 절차표는 실 데이터 대신 더미를 가정합니다.
전국에 흩어진 발전소 발전량 표를 아침마다 눈으로 훑어 어제보다 덜 나온 곳을 찾고, 인버터 오류코드를 다시 문서에서 뒤져 어떤 조치를 보낼지 정하던 O&M 담당자가, 이상 구간과 보낼 작업지시를 근거와 함께 받아보고 싶은 사람입니다.
일사량 대비 기대 발전량과 인버터 오류코드별 조치 절차를 규칙으로 두면, 발전소가 늘어도 사람이 표를 훑지 않고 이상 구간과 조치 초안을 근거와 함께 받을 수 있다는 가정입니다.
발전소 계측 기록 더미를 넣으면 일사량 대비 기대 발전량에 못 미치는 구간과 인버터 오류코드를 규칙으로 짚고, 오류코드에 대응하는 조치 절차를 찾아 작업지시 초안을 근거와 함께 내는 화면이 도는 완결품입니다. 현장 설비 연동은 계측 API를 가정하고 시작합니다.
1주차 판정 위에 정답을 붙인 계측 표본으로 이상 판정 일치율과 오탐 비율을 재고, 배포한 서비스에 실패 알림과 예외 처리, 재시도를 붙여 계측이 끊겨도 멈추지 않게 만듭니다.
2주차 판정 위에 같은 원인에서 나온 알람을 하나로 묶고 조치 결과를 다시 받아 절차표를 갱신하는 되먹임을 붙여, 발전소 수를 늘려도 사람이 처리할 양으로 유지되게 합니다.
발전소 계측 더미를 넣으면 이상 구간 판정부터 근거 계측값, 절차 매칭, 작업지시 초안까지 한 화면에 나오는 과정을 시연합니다.
작업지시에 담긴 조치가 절차표에 실제로 있는 항목인지 건별로 대조해 절차 밖 조치가 섞이지 않음을 보여주되, 계측과 절차표를 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
일사량 결측·계측 두절·발전량 0·미등록 오류코드·설비명 표기 흔들림 30종을 넣어도 도구가 멈추지 않고 판정이나 사유를 내는 강건성을 보여줍니다.
같은 원인에서 쏟아진 알람을 묶었을 때 담당자에게 전달되는 건수가 얼마나 줄어드는지 묶기 전후로 보여줍니다.
위 수치는 더미데이터 자가채점이며, 실제 이상 판정 정확도와 조치 적절성은 에이치에너지의 실 발전소 계측과 실 O&M 담당자가 있어야 측정 가능합니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 게 당연하므로, 일사량 결측·계측 두절·발전량 0·미등록 오류코드 같은 경계 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
이 포트폴리오가 입증하는 것은 계측을 기대값 규칙으로 판정하고 절차표와 이어 실행 가능한 지시로 바꾸는 기술이며, 태양광 발전 설비나 전력거래 도메인 전문성은 주장하지 않습니다. 판정과 조치 선택은 규칙이 하고 LLM은 지시 문장만 씁니다.
발전량이 낮다고 모두 고장인 것은 아니어서 구름과 그림자, 계절 각도가 함께 움직이므로, 일사량을 함께 보지 않고 발전량만으로 이상을 단정하지 않습니다.
실제 도입 때는 제조사별 오류코드 체계와 소유주별 조치 권한이 달라 절차표가 갈리므로, 설비별 절차표 교체와 권한 분리를 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
이상 판정 입력이 되는 발전소 계측 기록으로, 일사량 결측·계측 두절·발전량 0·미등록 오류코드 같은 하드 케이스를 일부러 섞어 규칙 판정이 제대로 도는지 확인합니다.
| reading_id | plant_raw | plant_id | ts | capacity_kw | irradiance_wm2 | output_kwh | inverter_code | comm_ok |
|---|---|---|---|---|---|---|---|---|
| R-001 | 모햇 1호 옥상 | PL-001 | 2026-07-20T12:00:00+09:00 | 100 | 850 | 78.2 | — | true |
| R-002 | 모햇 1호 옥상 | PL-001 | 2026-07-20T13:00:00+09:00 | 100 | 880 | 41 | E-204 | true |
| R-003 | 모햇1호옥상 | — | 2026-07-20T14:00:00+09:00 | 100 | 900 | 80.1 | — | true |
| R-004 | 솔라온 3호 창고지붕 | PL-003 | 2026-07-20T12:00:00+09:00 | 250 | — | 120 | — | true |
| R-005 | 솔라온 3호 창고지붕 | PL-003 | 2026-07-20T13:00:00+09:00 | 250 | 910 | 0 | E-101 | true |
다음 JSON Schema 에 맞는 발전소 계측 행을 더 생성하세요: {"type":"object","properties":{"reading_id":{"type":"string"},"plant_raw":{"type":"string"},"plant_id":{"type":["string","null"]},"ts":{"type":"string"},"capacity_kw":{"type":"number"},"irradiance_wm2":{"type":["number","null"]},"output_kwh":{"type":["number","null"]},"inverter_code":{"type":["string","null"]},"comm_ok":{"type":"boolean"}},"required":["reading_id","plant_raw","ts","capacity_kw","comm_ok"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: irradiance_wm2 가 null 이라 기대 발전량을 계산 못 하는 결측, comm_ok 가 false 이고 output_kwh 도 null 인 계측 두절, output_kwh 가 0.0 인데 일사량은 정상이라 고장이 의심되는 경우, irradiance_wm2 가 0.0 이고 야간이라 발전량 0 이 정상인 경계, irradiance_wm2 가 120 처럼 흐린 날이라 발전량이 낮아도 정상인 경우, inverter_code 가 절차표에 없는 미등록 코드(E-999), plant_id 가 null 이라 발전소 마스터에 매핑 안 된 경우, plant_raw 가 같은 발전소의 표기 흔들림(모햇 1호 옥상 을 모햇1호옥상 으로)이라 정규화가 필요한 경우. 정상 시간대와 이상 시간대를 골고루 섞고, 형식 깨뜨리기 시도(스키마 타입 위반) 3건은 데이터가 아니라 별도 목록으로 표시하세요.{"type":"object","properties":{"reading_id":{"type":"string"},"plant_raw":{"type":"string"},"plant_id":{"type":["string","null"]},"ts":{"type":"string"},"capacity_kw":{"type":"number"},"irradiance_wm2":{"type":["number","null"]},"output_kwh":{"type":["number","null"]},"inverter_code":{"type":["string","null"]},"comm_ok":{"type":"boolean"}},"required":["reading_id","plant_raw","ts","capacity_kw","comm_ok"]}오류코드와 이상 유형에 대응하는 조치 절차표로, 작업지시가 절차 밖으로 나가지 않게 하는 판정 기준이 됩니다.
| code | fault_type | severity | action | needs_site_visit | sla_hours |
|---|---|---|---|---|---|
| E-101 | inverter_fault | high | 인버터 주회로 차단 후 절연 저항을 측정하고 제조사 기술지원을 요청합… | true | 4 |
| E-204 | output_drop | mid | 스트링별 전류 편차를 확인하고 그늘·오염 여부를 점검한 뒤 세척 일정… | true | 24 |
| E-312 | inverter_fault | low | 인버터 팬 동작과 내부 온도를 원격으로 확인하고 이상이 지속되면 방문… | false | 48 |
| COMM-LOST | comm_lost | mid | 게이트웨이 전원과 통신 모뎀 상태를 원격으로 재시작하고 회복되지 않으… | false | 12 |
| DROP-30 | output_drop | mid | 기대 발전량 대비 30% 이상 미달이 두 시간 연속이면 스트링 점검 … | true | 24 |
다음 JSON Schema 에 맞는 조치 절차 행을 더 생성하세요: {"type":"object","properties":{"code":{"type":"string"},"fault_type":{"type":"string","enum":["output_drop","inverter_fault","comm_lost","unknown"]},"severity":{"type":"string","enum":["low","mid","high"]},"action":{"type":"string"},"needs_site_visit":{"type":"boolean"},"sla_hours":{"type":["integer","null"]}},"required":["code","fault_type","severity","action","needs_site_visit"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: sla_hours 가 null 이라 기한이 정해지지 않은 절차, 같은 fault_type 에 severity 만 다른 두 절차가 있어 어느 쪽을 고를지 갈리는 경우, fault_type 이 unknown 이라 담당자 확인으로 넘기는 절차, 조치가 원격으로 끝나 needs_site_visit 가 false 인 항목과 반드시 방문해야 하는 항목, 서로 상충해 함께 발행하면 안 되는 두 조치(재기동 보류 와 즉시 재기동). action 은 반드시 한 문장 이상으로 쓰고, 형식 깨뜨리기 시도(스키마 타입 위반) 3건은 데이터가 아니라 별도 목록으로 표시하세요.{"type":"object","properties":{"code":{"type":"string"},"fault_type":{"type":"string","enum":["output_drop","inverter_fault","comm_lost","unknown"]},"severity":{"type":"string","enum":["low","mid","high"]},"action":{"type":"string"},"needs_site_visit":{"type":"boolean"},"sla_hours":{"type":["integer","null"]}},"required":["code","fault_type","severity","action","needs_site_visit"]}| Python | 기대 발전량 규칙과 조치 절차 매칭, 알람 묶음 처리를 구현합니다. |
| 규칙 기반 이상 판정 | 일사량 대비 기대 발전량 하회와 인버터 오류코드를 임계로 판정합니다. |
| 조치 절차표 매칭 | 오류코드와 이상 유형을 조치 절차에 대응시켜 작업지시 항목을 채웁니다. |
| LLM API(Claude) | 확정된 판정과 절차만 넣어 현장이 읽을 작업지시 문장을 쓰고, 판정에는 관여하지 않습니다. |
| 워크플로 자동화 | 이상 발생부터 작업지시 생성, 담당자 전달까지 한 흐름으로 잇습니다. |
| 웹 화면 | 이상 구간과 근거 계측값, 작업지시 초안을 한 화면에서 확인하게 만듭니다. |
| 배포·모니터링·예외 처리 | 2주차에 실패 알림과 재시도를 붙여 계측이 끊겨도 서비스가 멈추지 않게 합니다. |
| JSON Schema | 계측 기록과 작업지시의 모양을 강제해 필드 누락을 막고 더미 증강에 씁니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차에서 판정 일치율을 재고 운영 품질로 마감합니다.
✓ pass → 여기서 멈춰도 검증된 완결입니다. 더 키우려면 3주차에서 알람 묶음과 조치 되먹임을 다룹니다.
이상 판정 한 건을 작업지시 초안으로 내보내면서 판정 근거와 인용한 절차를 함께 담아, 절차표에 없는 조치가 현장으로 나가지 않게 합니다.
{"type":"object","properties":{"reading_id":{"type":"string"},"plant_id":{"type":["string","null"]},"fault_type":{"type":"string","enum":["output_drop","inverter_fault","comm_lost","unknown"]},"matched_code":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":["string","number","boolean","null"]}},"required":["field","value"]}},"instruction":{"type":"string"},"needs_site_visit":{"type":"boolean"},"hedge":{"type":["string","null"]}},"required":["reading_id","plant_id","fault_type","matched_code","evidence","instruction","needs_site_visit"]}[
{
"reading_id": "R-005",
"plant_id": "PL-003",
"fault_type": "inverter_fault",
"matched_code": "E-101",
"evidence": [
{
"field": "output_kwh",
"value": 0
},
{
"field": "irradiance_wm2",
"value": 910
},
{
"field": "inverter_code",
"value": "E-101"
}
],
"instruction": "일사량이 910으로 충분한데 발전량이 0이고 인버터 코드 E-101이 떴습니다. 인버터 주회로를 차단한 뒤 절연 저항을 측정하고 제조사 기술지원을 요청해 주세요. 기한은 4시간입니다.",
"needs_site_visit": true,
"hedge": null
},
{
"reading_id": "R-012",
"plant_id": "PL-009",
"fault_type": "output_drop",
"matched_code": "DROP-60",
"evidence": [
{
"field": "output_kwh",
"value": 131
},
{
"field": "irradiance_wm2",
"value": 895
},
{
"field": "capacity_kw",
"value": 300
}
],
"instruction": "일사량 895 기준 기대 발전량 대비 실측이 60% 이상 미달했습니다. 당일 현장 점검을 배정하고 소유주에게 통지해 주세요. 기한은 8시간입니다.",
"needs_site_visit": true,
"hedge": null
},
{
"reading_id": "R-006",
"plant_id": "PL-003",
"fault_type": "comm_lost",
"matched_code": "COMM-LOST",
"evidence": [
{
"field": "comm_ok",
"value": false
},
{
"field": "output_kwh",
"value": null
}
],
"instruction": "계측 통신이 끊겨 발전량을 받지 못했습니다. 게이트웨이 전원과 통신 모뎀을 원격으로 재시작하고 회복되지 않으면 현장 점검을 배정해 주세요. 기한은 12시간입니다.",
"needs_site_visit": false,
"hedge": "통신이 끊긴 동안 실제 발전 상태는 알 수 없으므로 발전 이상 여부는 회복 후 다시 판정합니다."
},
{
"reading_id": "R-008",
"plant_id": "PL-007",
"fault_type": "unknown",
"matched_code": "UNMAPPED",
"evidence": [
{
"field": "inverter_code",
"value": "E-999"
},
{
"field": "output_kwh",
"value": 402.5
}
],
"instruction": "절차표에 없는 인버터 코드 E-999가 올라왔고 발전량은 기대 범위 안입니다. 원문 코드를 그대로 담아 담당자 확인 대기로 두었습니다.",
"needs_site_visit": false,
"hedge": "코드가 절차표에 없어 조치를 지정하지 않았으므로 담당자가 코드 의미를 확인해야 합니다."
}
][자동 검증] 1. matched_code 가 조치 절차표에 실제로 있는 코드인지 대조하고, 없으면 UNMAPPED 로 떨어졌는지 확인해 절차 밖 조치를 거릅니다. 2. instruction 에 담긴 조치 문구가 매칭된 절차의 action 범위 안인지 확인해, 절차에 없는 작업이 추가되지 않게 합니다. 3. evidence 의 field·value 가 입력 계측 행의 실제 값과 같은지 확인해, 근거 없는 판정을 거릅니다. 4. needs_site_visit 가 절차표의 값과 일치하는지 대조합니다. 5. irradiance_wm2 가 0 인 야간 구간에서 output_drop 판정이 나오면 오탐으로 표시합니다. [수동 검증] 1. 기대 발전량 계산식의 계수와 미달 임계가 실제 설비 특성과 맞는지 O&M 담당자가 확인합니다. 2. 발전 저하와 인버터 고장이 함께 잡힐 때 어느 쪽을 대표 사유로 발행할지 담당자가 정합니다. 3. 제3자 소유 발전소에서 소유주 통지 시점과 범위를 담당자가 정합니다.