모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-01 에 새 판으로 개정됐습니다. 산출물을 웹 화면에서 CLI로 좁히고, 사용자를 계약된 고객사 담당자로 바꿔 입력을 고객사 엑셀 추출본으로 옮겼습니다.최신 판 보기 →
경력에이치에너지 · AX 엔지니어 - Forward Deployed Engineer 비즈니스 문제를 AI로 직접

발전소 계측 기록에서 이상을 규칙으로 짚고 과거 조치 이력에서 맞는 절차를 찾아 작업지시 초안을 근거와 함께 만들어 주는 O&M 도구입니다.

에이치에너지 공고에서 뽑은 세 가지 시그널.

에이치에너지는 옥상과 지붕을 임대해 지은 태양광 발전소를 모햇으로 모으고 솔라온케어로 남의 소유 발전소까지 플랫폼에서 관리하는 구조라, 한 곳을 사람이 붙어서 보는 게 아니라 흩어진 다수를 원격 계측으로 살펴야 합니다. 소유주가 제각각이라 조치 하나를 보낼 때도 무엇을 근거로 판단했는지 남겨야 하고, 그래서 이상 판정과 조치 절차가 규칙으로 설명되어야 하는 요구가 에이치에너지의 제3자 소유 운영 구조에서 그대로 나옵니다. 이 포트폴리오가 입증하는 것은 계측 데이터를 기대값 규칙으로 판정하고 절차표와 이어 실행 가능한 지시로 바꾸는 기술이며, 태양광 발전 설비나 전력거래 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.

01

발전소 진단 알람·조치 자동화

발전소 진단 알람과 조치를 자동화하는 일을 빠른 빌드 과제로 직접 지목합니다.

발전소 진단 알람·조치 자동화프로세스·문서 자동화LLM 에이전트·RAG·워크플로 자동화
02

사업 프로세스를 에이전트로 재구성

개발·인허가·O&M·전력거래로 이어지는 사업 프로세스를 사람이 하던 반복 업무부터 자동화합니다.

사업 프로세스(개발·인허가·O&M·전력거래)를 AI 에이전트·자동화로 재구성사람이 하던 반복 업무를 자동화반복·병목 업무를 관찰하고, 풀만한 문제를 직접 정의
03

운영 품질까지 마감

빠르게 만든 시제품을 배포와 모니터링, 예외 처리까지 마감해 본 경험을 우대합니다.

빠른 PoC를 운영 품질로 마감해본 경험(배포·모니터링·예외 처리까지)실제 사용자에게 붙여 피드백으로 다듬고제3자소유 발전소를 SaaS로 연결하여, 플랫폼으로 운영, 관리

포트폴리오 요약

에이치에너지가 솔라온케어로 제3자 소유 발전소를 플랫폼에서 운영·관리하는 맥락에서, 발전소 계측 기록을 받아 기대 발전량에 못 미치는 구간과 인버터 고장 신호를 규칙으로 짚고 오류코드에 대응하는 조치 절차를 찾아 작업지시 초안을 근거와 함께 만들어 주는 O&M 도구입니다. 계측 기록과 조치 절차표는 실 데이터 대신 더미를 가정합니다.

고객 정의

전국에 흩어진 발전소 발전량 표를 아침마다 눈으로 훑어 어제보다 덜 나온 곳을 찾고, 인버터 오류코드를 다시 문서에서 뒤져 어떤 조치를 보낼지 정하던 O&M 담당자가, 이상 구간과 보낼 작업지시를 근거와 함께 받아보고 싶은 사람입니다.

고민 지점

일사량 대비 기대 발전량과 인버터 오류코드별 조치 절차를 규칙으로 두면, 발전소가 늘어도 사람이 표를 훑지 않고 이상 구간과 조치 초안을 근거와 함께 받을 수 있다는 가정입니다.

주차별 일정

1주차여기까지로 완성

이상 구간과 작업지시 초안이 근거와 함께 나옵니다

발전소 계측 기록 더미를 넣으면 일사량 대비 기대 발전량에 못 미치는 구간과 인버터 오류코드를 규칙으로 짚고, 오류코드에 대응하는 조치 절차를 찾아 작업지시 초안을 근거와 함께 내는 화면이 도는 완결품입니다. 현장 설비 연동은 계측 API를 가정하고 시작합니다.

  1. 1일 · 기대 발전량 계산식과 이상 임계, 오류코드별 조치 절차표를 정하고 결측·극단값·미등록 코드·표기 흔들림을 섞은 계측 더미를 만듭니다.
  2. 2-3일 · 일사량 대비 기대 발전량 하회와 오류코드를 판정하는 규칙 엔진을 구현합니다.
  3. 4-5일 · 판정 결과를 절차표에 매칭해 작업지시 초안을 만드는 생성과, 이상 구간·근거·지시를 함께 보여주는 화면을 붙입니다.
2주차선택 성장

판정이 맞았는지 확인하고 운영 품질로 마감합니다

1주차 판정 위에 정답을 붙인 계측 표본으로 이상 판정 일치율과 오탐 비율을 재고, 배포한 서비스에 실패 알림과 예외 처리, 재시도를 붙여 계측이 끊겨도 멈추지 않게 만듭니다.

  1. 8-9일 · 정답을 붙인 계측 표본으로 이상 판정 일치율과 오탐 비율을 잽니다.
  2. 10일 · 배포한 서비스에 실패 알림과 예외 처리, 재시도를 붙여 계측 두절에도 멈추지 않게 만듭니다.
3주차선택 성장

알람이 쏟아져도 사람이 볼 만하게 만듭니다

2주차 판정 위에 같은 원인에서 나온 알람을 하나로 묶고 조치 결과를 다시 받아 절차표를 갱신하는 되먹임을 붙여, 발전소 수를 늘려도 사람이 처리할 양으로 유지되게 합니다.

  1. 12-13일 · 같은 원인에서 나온 알람을 하나로 묶는 중복 억제를 구현합니다.
  2. 14일 · 조치 결과를 다시 받아 절차표를 갱신하는 되먹임 흐름을 완성합니다.

데모 · 측정 지표

01

발전소 계측 더미를 넣으면 이상 구간 판정부터 근거 계측값, 절차 매칭, 작업지시 초안까지 한 화면에 나오는 과정을 시연합니다.

02

작업지시에 담긴 조치가 절차표에 실제로 있는 항목인지 건별로 대조해 절차 밖 조치가 섞이지 않음을 보여주되, 계측과 절차표를 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.

03

일사량 결측·계측 두절·발전량 0·미등록 오류코드·설비명 표기 흔들림 30종을 넣어도 도구가 멈추지 않고 판정이나 사유를 내는 강건성을 보여줍니다.

04

같은 원인에서 쏟아진 알람을 묶었을 때 담당자에게 전달되는 건수가 얼마나 줄어드는지 묶기 전후로 보여줍니다.

정직 경계선

진짜 성능 검증은 여기서 멈춥니다

위 수치는 더미데이터 자가채점이며, 실제 이상 판정 정확도와 조치 적절성은 에이치에너지의 실 발전소 계측과 실 O&M 담당자가 있어야 측정 가능합니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.

미리 알아둬야 할 것들

수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.

정답을 작성자가 만들었으니 잘 맞는 게 당연하므로, 일사량 결측·계측 두절·발전량 0·미등록 오류코드 같은 경계 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.

이 포트폴리오가 입증하는 것은 계측을 기대값 규칙으로 판정하고 절차표와 이어 실행 가능한 지시로 바꾸는 기술이며, 태양광 발전 설비나 전력거래 도메인 전문성은 주장하지 않습니다. 판정과 조치 선택은 규칙이 하고 LLM은 지시 문장만 씁니다.

발전량이 낮다고 모두 고장인 것은 아니어서 구름과 그림자, 계절 각도가 함께 움직이므로, 일사량을 함께 보지 않고 발전량만으로 이상을 단정하지 않습니다.

실제 도입 때는 제조사별 오류코드 체계와 소유주별 조치 권한이 달라 절차표가 갈리므로, 설비별 절차표 교체와 권한 분리를 도입 단계 과제로 둡니다.

더미 데이터

① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.

plant_telemetryTABLE· 12 rows

이상 판정 입력이 되는 발전소 계측 기록으로, 일사량 결측·계측 두절·발전량 0·미등록 오류코드 같은 하드 케이스를 일부러 섞어 규칙 판정이 제대로 도는지 확인합니다.

② plant_telemetry.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
reading_idplant_rawplant_idtscapacity_kwirradiance_wm2output_kwhinverter_codecomm_ok
R-001모햇 1호 옥상PL-0012026-07-20T12:00:00+09:0010085078.2—true
R-002모햇 1호 옥상PL-0012026-07-20T13:00:00+09:0010088041E-204true
R-003모햇1호옥상—2026-07-20T14:00:00+09:0010090080.1—true
R-004솔라온 3호 창고지붕PL-0032026-07-20T12:00:00+09:00250—120—true
R-005솔라온 3호 창고지붕PL-0032026-07-20T13:00:00+09:002509100E-101true
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
다음 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건은 데이터가 아니라 별도 목록으로 표시하세요.
schema (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"]}
remedy_playbookTABLE· 10 rows

오류코드와 이상 유형에 대응하는 조치 절차표로, 작업지시가 절차 밖으로 나가지 않게 하는 판정 기준이 됩니다.

② remedy_playbook.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 10)
codefault_typeseverityactionneeds_site_visitsla_hours
E-101inverter_faulthigh인버터 주회로 차단 후 절연 저항을 측정하고 제조사 기술지원을 요청합…true4
E-204output_dropmid스트링별 전류 편차를 확인하고 그늘·오염 여부를 점검한 뒤 세척 일정…true24
E-312inverter_faultlow인버터 팬 동작과 내부 온도를 원격으로 확인하고 이상이 지속되면 방문…false48
COMM-LOSTcomm_lostmid게이트웨이 전원과 통신 모뎀 상태를 원격으로 재시작하고 회복되지 않으…false12
DROP-30output_dropmid기대 발전량 대비 30% 이상 미달이 두 시간 연속이면 스트링 점검 …true24
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
다음 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건은 데이터가 아니라 별도 목록으로 표시하세요.
schema (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계측 기록과 작업지시의 모양을 강제해 필드 누락을 막고 더미 증강에 씁니다.
LLM 선택
model
Claude(작업지시 문장 생성) + 규칙 기반 이상 판정·절차 매칭
prompt
규칙이 확정한 이상 유형과 근거 계측값, 매칭된 조치 절차만 넣고 현장 작업지시 문장을 JSON으로 받는 스키마 강제 구조이며, 절차표에 없는 조치를 덧붙이지 말라고 못박습니다. 이상 여부와 조치 선택은 LLM이 아니라 규칙과 절차표가 정합니다.
rationale
이상 판정은 기대 발전량 대비 임계 비교로, 조치 선택은 오류코드와 절차표 대응으로 결정되는 결정론 계산이라 둘 다 자동 채점됩니다. LLM이 조치를 지어내면 현장에 잘못된 작업이 나가므로 문장 작성만 맡깁니다. 절차표는 내부 문서라 외부 지식 검색(RAG)이 필요 없습니다.
결정 게이트
1주차 끝일사량 결측·계측 두절·미등록 오류코드를 섞은 계측 더미를 넣어도 이상 구간이 근거 계측값과 함께 나오고 작업지시 초안이 절차표 범위 안에서만 만들어지는지 확인합니다.

✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차에서 판정 일치율을 재고 운영 품질로 마감합니다.

2주차 끝정답을 붙인 계측 표본에서 이상 판정 일치율과 오탐 비율이 나오고, 계측이 끊겨도 실패 알림과 재시도로 서비스가 이어지는지 확인합니다.

✓ pass → 여기서 멈춰도 검증된 완결입니다. 더 키우려면 3주차에서 알람 묶음과 조치 되먹임을 다룹니다.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 기대값 대비 실측 하회를 임계로 판정하는 이상 탐지 규칙 엔진
  • 오류코드를 절차표에 대응시켜 조치 항목을 채우는 매칭기
  • 확정된 판정과 절차만 넣어 지시 문장을 만드는 스키마 강제 프롬프트
  • 같은 원인에서 나온 알람을 하나로 묶는 중복 억제 처리
  • 계측 결측과 통신 끊김을 예외로 처리하고 재시도하는 수집 흐름
  • 결측·극단값·미등록 코드·표기 흔들림을 섞는 더미 계측 생성기
domain (교체 대상)
  • 기대 발전량 계산식과 임계 규칙은 설비 종류별로 갈아끼웁니다
  • 오류코드 체계와 조치 절차표는 제조사·설비별로 갈아끼웁니다
  • 이상 유형 enum(발전 저하·통신 두절·기기 고장)은 도메인별로 갈아끼웁니다
출력 스키마 · work_order_draft

이상 판정 한 건을 작업지시 초안으로 내보내면서 판정 근거와 인용한 절차를 함께 담아, 절차표에 없는 조치가 현장으로 나가지 않게 합니다.

schema (JSON Schema)
{"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"]}
모범 출력 (4)
[
  {
    "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": "코드가 절차표에 없어 조치를 지정하지 않았으므로 담당자가 코드 의미를 확인해야 합니다."
  }
]
검증 노트 (자동 vs 수동)

[자동 검증] 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자 소유 발전소에서 소유주 통지 시점과 범위를 담당자가 정합니다.