제스트
경력근거: 도면, 에너지, 규정, 태양광 등 복잡한 도메인 문제 해결
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 건설과 신재생과 농업처럼 오래된 산업의 복잡한 문제를 분석해 끝까지 만들어 내라고 하고, 도면과 에너지와 규정과 태양광을 다룰 도메인으로 적습니다. 이 포트폴리오는 그중 태양광 하나를 골라 작은 기능 단위로 끝냈습니다. 계측값과 설비 정보를 계산 규칙으로 잇고 판정 근거를 화면에 남겨, 검증과 피드백 구조를 함께 만듭니다. 다만 이 포트폴리오는 계산 규칙과 화면 구현을 보여줍니다. 태양광 설비 진단이나 발전 사업 운영에 대한 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
건설과 신재생과 농업처럼 오래된 산업의 복잡한 문제를 빠르게 분석해 끝까지 만들어 낼 사람을 찾는다고 주요업무 첫 줄에 적습니다. 도메인 자료를 읽어 규칙으로 옮기는 일이 업무의 시작입니다.
작은 기능 단위로 빠르게 만들고 사용자가 나오기 전까지 과도한 구조 설계를 하지 않으며, 문제 정의에서 실행까지 반복한다고 일하는 방식에 적습니다. 완결된 작은 산출물이 그대로 근거가 됩니다.
검증과 피드백 구조를 가진 AI native software 개발이라고 실제로 하게 될 일에 적습니다. 결과를 내는 것만이 아니라 그 결과가 맞는지 확인하는 구조를 함께 만들어야 합니다.
설비 담당자가 날짜를 고르면, 발전소별 일일 발전량을 설비 용량과 일사량으로 계산한 예상치와 비교해 덜 만든 곳을 사유별로 보여줍니다. 예상치와 차이는 계산 규칙이 정하고, 모델은 발전량이 예상치에 못 미친 사유를 한 문장으로 간추립니다.
저는 태양광 발전소 열몇 곳을 관리합니다. 아침에 어제 발전량을 보는데 어떤 곳이 적게 나왔는지는 알아도 그게 날씨 탓인지 인버터 문제인지는 알 수 없습니다. 결국 현장 담당자에게 전화를 돌려 하나씩 물어봅니다.
덜 만든 이유를 못 찾는 이유는 발전량만 보기 때문입니다. 같은 날의 일사량으로 예상치를 계산해 실적과 견주면, 날씨로 설명되는 감소와 설비를 봐야 하는 감소가 화면에서 갈립니다.
설비 담당자가 쓰는 화면 하나가 완결됩니다. 일일 발전량과 일사량으로 예상치를 계산해 차이가 큰 발전소를 사유별로 보여주고, 계산에 쓴 값을 같이 냅니다. 계측기를 직접 붙이는 일은 일일 집계 파일을 올리는 것으로 대신하고 3주차로 미룹니다.
현장에서 확인한 원인 100건과 규칙의 판정을 맞춰 보고, 날씨로 설명되는데 설비 의심으로 잡은 건을 유형별로 냅니다. 예상치 계산의 계수를 그 결과로 조정합니다.
계측 자료를 받아 매일 돌고, 같은 발전소가 사흘 연속 예상에 못 미치면 담당자에게 알립니다. 아침에 목록을 여는 대신 알림으로 먼저 봅니다.
설비 담당자가 날짜를 고르면 발전소별 예상치가 계산되고, 덜 만든 곳이 근거 값과 같이 보입니다.
일사량이 비거나 발전량이 0 이거나 등록되지 않은 발전소 코드가 섞인 자료 30종을 올려도 화면이 죽지 않고, 판정할 수 없는 날은 미판정으로 남습니다.
현장 원인 100건으로 판정 일치율을 냅니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며 실제 원인 적중률은 제스트의 실 발전 계측과 현장 점검 기록이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 일사량 결측·발전량 0·등록되지 않은 발전소 코드를 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
예상에 못 미쳤다는 계산이 곧 설비 고장을 뜻하지는 않습니다. 그늘과 오염과 계통 제한으로도 줄어들므로 판정을 결론으로 읽지 않게 근거 값을 항상 같이 보여줍니다.
실제 도입에서는 발전소마다 설치 각도와 노후도가 달라 효율 계수가 하나로 서지 않습니다. 계수가 늘어나면 규칙을 코드에서 빼 설정으로 옮겨야 하며, 그것은 도입 단계 과제로 분리합니다.
인버터를 원격으로 제어하거나 정지시키는 일은 안전 책임이 걸려 있어 이 포트폴리오의 범위 밖입니다. 여기서는 사람이 볼 판단 근거를 내는 데까지만 다룹니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
발전소별 일일 발전 실적과 환경 계측입니다. 계산의 입력이며 일사량 결측과 발전량 0, 등록되지 않은 발전소 코드를 의도적으로 포함합니다.
| record_no | measured_on | plant_code_raw | capacity_kw | irradiance_kwh_m2 | output_kwh | inverter_alarm | curtailed | note |
|---|---|---|---|---|---|---|---|---|
| PR-0817-001 | 2026-08-17 | PL-101 | 500 | 5.2 | 2,210 | none | false | — |
| PR-0817-002 | 2026-08-17 | PL-102 | 300 | 5.1 | 1,290 | none | false | — |
| PR-0817-003 | 2026-08-17 | PL-103 | 800 | 2.1 | 1,380 | none | false | 흐린 날 |
| PR-0817-004 | 2026-08-17 | PL-104 | 450 | 5.3 | 900 | fault | false | 인버터 경보 |
| PR-0817-005 | 2026-08-17 | PL-105 | 600 | — | 2,400 | none | false | 일사량 계측기 고장 |
아래 JSON Schema 에 맞는 일일 발전 실적 행을 더 만들어 주세요. {"type":"object","properties":{"record_no":{"type":"string"},"measured_on":{"type":"string"},"plant_code_raw":{"type":"string"},"capacity_kw":{"type":["number","null"]},"irradiance_kwh_m2":{"type":["number","null"]},"output_kwh":{"type":["number","null"]},"inverter_alarm":{"type":"string","enum":["none","warn","fault","unknown"]},"curtailed":{"type":["boolean","null"]},"note":{"type":["string","null"]}},"required":["record_no","measured_on","plant_code_raw","inverter_alarm"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) irradiance_kwh_m2 나 capacity_kw 가 null 인 행, (2) output_kwh 가 0 이거나 흐린 날처럼 일사량이 매우 낮은 행, (3) plant_code_raw 의 구분자와 대소문자가 흔들려 제원을 찾지 못하는 행, (4) 계통 출력 제한으로 실적이 낮은 행. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"record_no":{"type":"string"},"measured_on":{"type":"string"},"plant_code_raw":{"type":"string"},"capacity_kw":{"type":["number","null"]},"irradiance_kwh_m2":{"type":["number","null"]},"output_kwh":{"type":["number","null"]},"inverter_alarm":{"type":"string","enum":["none","warn","fault","unknown"]},"curtailed":{"type":["boolean","null"]},"note":{"type":["string","null"]}},"required":["record_no","measured_on","plant_code_raw","inverter_alarm"]}| Python | 계산 규칙과 집계를 맡는 언어입니다. 설비 용량과 일사량으로 예상치를 내는 식이 여기 있습니다. |
| JavaScript | 담당자가 보는 화면입니다. 발전소별 실적과 예상 막대를 한 화면에 둡니다. |
| Java | 사내 시스템이 자바 기반일 때를 대비해 판정 결과를 같은 형식으로 내보냅니다. |
| API | 3주차에 계측 자료를 받는 접수 창구입니다. |
| LLM | 판정이 끝난 뒤 실적이 예상치에 못 미친 사유를 한 문장으로 간추립니다. 차이는 용량과 일사량 계산이 냅니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 현장 확인 결과와 판정을 맞춰 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 매일 자동으로 돌고 연속 미달을 알리는 단계로 확장합니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
gap_code사유 라벨 · record_no + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
as_expected예상 범위low_irradiance일사량 부족equipment_suspect설비 의심grid_curtailed계통 제한record_missing계측 결측plant_unmapped발전소 미매핑발전소 하루치 판정입니다. 사유 코드와 실적·예상치를 함께 남깁니다.
{"type":"object","properties":{"gap_id":{"type":"string"},"record_no":{"type":"string"},"plant_code":{"type":["string","null"]},"gap_code":{"type":"string","enum":["as_expected","low_irradiance","equipment_suspect","grid_curtailed","record_missing","plant_unmapped"]},"output_gap_kwh":{"type":["number","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{"type":["string","number","boolean","null"]}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["gap_id","record_no","gap_code","evidence","summary"]}[
{
"gap_id": "og_0001",
"record_no": "PR-0817-001",
"plant_code": "PL-101",
"gap_code": "as_expected",
"output_gap_kwh": null,
"evidence": [
{
"field": "output_kwh",
"agg": null,
"value": 2210
},
{
"field": "irradiance_kwh_m2",
"agg": null,
"value": 5.2
}
],
"summary": "일사량 대비 발전량이 예상 범위 안에 들어옵니다.",
"hedge": null
},
{
"gap_id": "og_0002",
"record_no": "PR-0818-003",
"plant_code": "PL-103",
"gap_code": "as_expected",
"output_gap_kwh": null,
"evidence": [
{
"field": "output_kwh",
"agg": null,
"value": 3720
},
{
"field": "capacity_kw",
"agg": null,
"value": 800
}
],
"summary": "맑은 날 용량에 맞는 발전량이 나왔습니다.",
"hedge": null
},
{
"gap_id": "og_0003",
"record_no": "PR-0817-003",
"plant_code": "PL-103",
"gap_code": "low_irradiance",
"output_gap_kwh": null,
"evidence": [
{
"field": "irradiance_kwh_m2",
"agg": null,
"value": 2.1
},
{
"field": "inverter_alarm",
"agg": null,
"value": "none"
}
],
"summary": "일사량이 평소의 절반 이하라 발전량 감소가 날씨로 설명됩니다.",
"hedge": null
},
{
"gap_id": "og_0004",
"record_no": "PR-0817-004",
"plant_code": "PL-104",
"gap_code": "equipment_suspect",
"output_gap_kwh": 1013,
"evidence": [
{
"field": "output_kwh",
"agg": null,
"value": 900
},
{
"field": "output_kwh",
"agg": "expected",
"value": 1913
}
],
"summary": "일사량은 충분한데 예상보다 1,013kWh 적고 인버터 경보까지 있어 현장 확인이 필요합니다.",
"hedge": null
},
{
"gap_id": "og_0005",
"record_no": "PR-0817-006",
"plant_code": "PL-106",
"gap_code": "equipment_suspect",
"output_gap_kwh": 1003,
"evidence": [
{
"field": "output_kwh",
"agg": null,
"value": 0
},
{
"field": "output_kwh",
"agg": "expected",
"value": 1003
}
],
"summary": "종일 발전이 0 이라 예상치 전부가 빠졌고 인버터 정지가 원인으로 보입니다.",
"hedge": null
},
{
"gap_id": "og_0006",
"record_no": "PR-0817-007",
"plant_code": "PL-107",
"gap_code": "grid_curtailed",
"output_gap_kwh": null,
"evidence": [
{
"field": "curtailed",
"agg": null,
"value": true
},
{
"field": "inverter_alarm",
"agg": null,
"value": "none"
}
],
"summary": "계통 출력 제한이 걸린 날이라 설비 문제로 보지 않습니다.",
"hedge": "합성 기준 판정이라 제한 시간과 실제 감소량은 계통 기록과 맞춰 봐야 합니다."
},
{
"gap_id": "og_0007",
"record_no": "PR-0817-005",
"plant_code": "PL-105",
"gap_code": "record_missing",
"output_gap_kwh": null,
"evidence": [
{
"field": "irradiance_kwh_m2",
"agg": null,
"value": null
},
{
"field": "output_kwh",
"agg": null,
"value": 2400
}
],
"summary": "일사량 계측이 없어 예상치를 낼 수 없어 판정하지 않습니다.",
"hedge": null
},
{
"gap_id": "og_0008",
"record_no": "PR-0817-008",
"plant_code": null,
"gap_code": "plant_unmapped",
"evidence": [
{
"field": "plant_code_raw",
"agg": null,
"value": "pl 108"
},
{
"field": "capacity_kw",
"agg": null,
"value": null
}
],
"output_gap_kwh": null,
"summary": "제원 목록에 없는 발전소 코드라 용량을 몰라 계산하지 못합니다.",
"hedge": null
},
{
"gap_id": "og_0009",
"record_no": "PR-0818-002",
"plant_code": "PL-104",
"gap_code": "equipment_suspect",
"output_gap_kwh": 1000,
"evidence": [
{
"field": "output_kwh",
"agg": null,
"value": 870
},
{
"field": "output_kwh",
"agg": "expected",
"value": 1870
}
],
"summary": "같은 발전소가 이틀째 예상에 못 미쳐 현장 점검 순서를 앞으로 당겨야 합니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. gap_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. gap_id·record_no·gap_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. irradiance_kwh_m2 가 0 이상 10 이하이고 output_kwh 가 0 이상인지 확인합니다. 4. evidence 의 field 이름이 발전 실적 데이터에 실재하는 컬럼인지 대조합니다. 5. agg 가 없는 evidence 의 value 가 그 record_no 행의 값과 같은지 확인합니다. 6. output_gap_kwh 가 evidence 의 실적과 예상치의 차이와 같은지 다시 계산합니다. 일사량이나 용량이 비면 output_gap_kwh 도 null 인지 확인합니다. 7. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 현장에서 확인한 원인 100건과 규칙의 gap_code 를 비교해 일치율과 잘못 잡은 유형을 냅니다. [수동 검증 · 사람이 봅니다] 1. 계통 제한과 설비 문제가 같은 날 겹친 건을 어느 쪽으로 묶을지 표본 20건을 눈으로 확인합니다. 2. 흐린 날의 예상치를 어느 범위까지 정상으로 볼지는 운영 기준을 따라 담당자가 정합니다.
근거: 도면, 에너지, 규정, 태양광 등 복잡한 도메인 문제 해결