에이치에너지는 모햇·솔라온케어·솔라쉐어로 전국의 옥상·지붕에 태양광 발전소를 짓고 운영하는 회사이고, 이 자리는 개발·인허가·O&M·전력거래의 병목을 AX 과제로 바꾸는 AX팀 Tech Lead 입니다. 옥상·지붕 태양광은 지자체마다 인허가 요건과 서류가 다르고 프로젝트가 다수 동시에 도는데, 이 진행·서류 흐름은 에이치에너지가 실제로 돌리는 발전사업 파이프라인이 있어야 의미가 있고 다른 도메인 데이터로는 그대로 재현되지 않습니다. 다만 이 포트폴리오가 입증하는 것은 RAG 인용·상태머신 전이·서류 완결성 규칙 같은 기술이며, 인허가 법령 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
사업 현장에 직접 들어가 문제를 정의하고 AI 로 풀어 제품까지 끌고 가는 팀입니다. 인허가 병목처럼 규칙·서류가 많은 실무를 AX 과제로 바꿔 돌아가는 제품으로 만드는 것이 이 역할의 핵심입니다.
프로토타이핑에서 멈추지 않고 배포·모니터링·운영까지 끌고 가는 능력을 봅니다. 1주차 완결품을 GCP 로 배포하고 상태 변화 알림을 자동화하는 흐름으로 이 요구를 그대로 입증합니다.
우대사항이 LLM/에이전트 production 운영, RAG·Multi-Agent 입니다. 요건 지식베이스 검색(RAG)과 요건조회·서류검증·문서작성 에이전트 분리로 이 우대 역량을 제품 골조로 씁니다.
발전사업자가 태양광 발전소 프로젝트(부지·용량·지자체)를 등록하면, 지자체 요건 지식베이스에서 필요한 인허가 절차와 서류를 근거 문장과 함께 찾아 제시합니다. 제출한 서류를 필수 목록과 대조해 빠진 항목을 규칙으로 짚어 체크리스트를 만들고, 접수→보완요청→재접수→승인/반려 상태를 상태머신으로 추적해 다음 할 일을 안내하며, 보완요청 대응 초안을 LLM 이 근거를 붙여 작성합니다. 모햇·솔라쉐어처럼 옥상·지붕 태양광을 다수 진행하는 파이프라인에서 인허가 실무를 자동화하는 AX 산출물입니다. 근거는 채용공고 정렬이고, 데이터는 작성자가 만든 더미입니다.
에이치에너지 AX팀에서 개발·인허가 병목을 AI 로 바꾸는 Tech Lead. 프로젝트마다 지자체 요건을 일일이 찾아보고 제출 서류가 다 갖춰졌는지 손으로 대조하던 일을 끝내고, 어디까지 진행됐고 다음에 뭘 해야 하는지를 한 화면에서 보고 싶은 사람입니다.
지자체별 인허가 요건을 근거 청크 단위 지식베이스로 묶고 프로젝트별 제출 서류를 한 스키마로 관리하면, (a) 필요한 절차·서류를 인용과 함께 몇 초 안에 제시하고, (b) 제출 서류의 빠진 항목을 규칙으로 정확히 짚으며, (c) 상태머신으로 다음 절차를 안내하고 보완요청 대응 초안까지 근거를 붙여 만들 수 있습니다.
프로젝트를 등록하면 요건 지식베이스에서 필요한 인허가 절차·서류를 인용과 함께 제시하고, 제출 서류의 빠진 항목을 규칙으로 짚어 체크리스트를 만들며, 상태머신으로 다음 절차를 안내하는 동작하는 도구입니다. 요건 지식베이스와 서류는 작성자가 만든 더미로 시작합니다.
요건조회·서류검증·문서작성 에이전트를 분리하고, 제시한 근거가 실제 요건 문장과 일치하는지 인용 정확도를 검사하며, 보완요청 초안이 사람 검수와 얼마나 맞는지 일치도를 보여주는 단계입니다. GCP Cloud Run 으로 배포·모니터링합니다.
상태가 바뀌면 n8n 워크플로로 다음 절차 알림을 자동 발송하고, BigQuery 로 프로젝트 진행현황과 누락 패턴을 집계해, 인허가 파이프라인 전체를 한눈에 보는 대시보드로 확장하는 단계입니다.
프로젝트를 등록하면 필요한 절차·서류 목록과 빠진 항목 체크리스트, 다음 절차가 몇 초 안에 나오는 걸 시연합니다. 각 근거에는 어느 요건 문장에서 왔는지 chunk_id 가 붙습니다
제시한 근거의 청크 일치(인용한 문장이 실제 지식베이스에 존재)가 자동 검사에서 통과하고, 상태 전이 규칙 위반이 0건임을 보여줍니다
일부러 만든 결측·미등록 지자체·표기흔들림 입력 30종을 넣어도 출력 형식(스키마)이 한 번도 안 깨지고, 요건을 못 찾은 서류는 추측 대신 '미매핑'으로 표시합니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
위 수치는 전부 작성자가 만든 더미 요건·서류의 자가채점이며, 실제 인허가 정확도와 누락 판정 정밀도는 에이치에너지의 실제 지자체 요건 자료와 실 법무·인허가 담당 검수가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다
이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 '성능 증명'이 아닙니다. 면접에서는 '데모 조건 동작 + 실검증 준비 상태'로 솔직히 설명하는 편이 오히려 신뢰를 줍니다
정답을 작성자가 만들었으니 잘 맞는 게 당연합니다. 그래서 결측(서류 미제출)·미등록 지자체(요건 지식베이스에 없음)·표기흔들림(지자체명 원문/별칭)·경계값(서류 0건, 반려 상태) 같은 하드 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줘야 합니다
인허가 요건은 지자체·시기별로 다르고 법령 해석이 필요합니다. 이 포트폴리오가 입증하는 것은 RAG 인용·상태머신 전이·서류 완결성 규칙 같은 기술이며, 인허가 법령 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다. 정답은 규칙과 인용 청크 일치로 객관 채점하고, LLM 은 요약·문구 보조만 맡깁니다
실제 도입 시 달라지는 것을 명시합니다. 더미 요건 지식베이스는 실제 지자체 고시·법령 자료와 법무 검수로 교체해야 하고, 요건이 바뀌면 지식베이스를 갱신하는 체계가 필요합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
지자체×절차별 인허가 요건 지식베이스. RAG 검색과 필수 서류 대조의 진실원이며, 제시 근거의 인용 출처(chunk_id)가 됩니다. 지자체명 별칭·요건 결측·미등록 지자체를 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| chunk_id | region_raw | region_id | procedure | required_docs | body |
|---|---|---|---|---|---|
| kb_gangnam_biz_01 | 서울특별시 강남구 | r_seoul_gangnam | 발전사업허가(1MW 이하) | ["사업계획서","부지 임대차계약서","단선결선도","발전원 종류 및 설비용량 명세"] | 1MW 이하 태양광 발전사업허가는 시장·군수·구청장 소관으로, 사업계… |
| kb_gangnam_dev_01 | 강남구 | r_seoul_gangnam | 개발행위허가 | ["개발행위허가 신청서","토지 이용계획 확인서","구조안전확인서"] | 지붕·옥상 설치라도 구조 변경이 수반되면 개발행위 또는 구조안전 검토… |
| kb_seongnam_biz_01 | 경기도 성남시 | r_gg_seongnam | 발전사업허가(1MW 이하) | ["사업계획서","부지 임대차계약서","단선결선도","등기부등본"] | 성남시 1MW 이하 발전사업허가는 사업계획서와 임대차계약서, 단선결선… |
| kb_seongnam_grid_01 | 성남 | r_gg_seongnam | 계통연계 신청 | ["계통연계 신청서","단선결선도","설비용량 명세"] | 계통연계는 한전 배전 접속 신청으로, 단선결선도와 설비용량 명세를 제… |
| kb_cheonan_biz_01 | 충청남도 천안시 | r_cn_cheonan | 발전사업허가(1MW 이하) | ["사업계획서","부지 임대차계약서","단선결선도"] | 천안시 1MW 이하 발전사업허가 기본 제출 서류입니다. 지붕 임대형은… |
아래 JSON Schema 에 맞는 지자체별 태양광 인허가 요건 지식베이스 청크 40개를 JSON 배열로 생성하세요. 지자체 6~8곳 × 절차(발전사업허가·개발행위허가·계통연계·안전관리자 선임)를 조합하고, body 는 실제 검색 근거로 쓸 3~5문장으로 씁니다.
{"type":"object","properties":{"chunk_id":{"type":"string"},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"required_docs":{"type":"array","items":{"type":"string"}},"body":{"type":"string"}},"required":["chunk_id","region_raw","procedure","body"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞으세요: (1) 같은 지자체의 region_raw 표기 흔들림(예: '서울특별시 강남구'와 '강남구'가 같은 region_id 로 정규화돼야 함), (2) region_id=null 이고 required_docs 가 빈 배열인 '요건 미확정' 지역 1~2건(미매핑으로 처리돼야 함), (3) 같은 지자체라도 절차마다 required_docs 가 다르게. JSON 배열만 출력하세요.{"type":"object","properties":{"chunk_id":{"type":"string"},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"required_docs":{"type":"array","items":{"type":"string"}},"body":{"type":"string"}},"required":["chunk_id","region_raw","procedure","body"]}프로젝트별 제출 서류 현황과 정답(필요 절차·누락 서류·상태). 서류 결측·미등록 지자체(orphan)·표기흔들림·경계값(서류 0건, 반려 상태)을 일부러 섞어, 규칙 검사와 상태머신이 하드 케이스에서도 안 깨지는지 보여줍니다.
| project_id | plant_type | region_raw | region_id | procedure | submitted_docs | state | gold_missing_docs | gold_next_action |
|---|---|---|---|---|---|---|---|---|
| prj_0001 | 옥상태양광 | 서울특별시 강남구 | r_seoul_gangnam | 발전사업허가(1MW 이하) | ["사업계획서","부지 임대차계약서","단선결선도"] | 접수 | ["발전원 종류 및 설비용량 명세"] | 설비용량 명세를 보완 제출하도록 보완요청으로 전환 |
| prj_0002 | 지붕태양광 | 강남구 | r_seoul_gangnam | 발전사업허가(1MW 이하) | ["사업계획서","부지 임대차계약서","단선결선도","발전원 종류 및 설비용량 명세"] | 접수 | [] | 필수 서류 충족, 심사 진행 |
| prj_0003 | 옥상태양광 | 경기도 성남시 | r_gg_seongnam | 발전사업허가(1MW 이하) | ["사업계획서","단선결선도"] | 보완요청 | ["부지 임대차계약서","등기부등본"] | 임대차계약서와 등기부등본 보완 안내 |
| prj_0004 | 지붕태양광 | 성남 | r_gg_seongnam | 계통연계 신청 | ["계통연계 신청서","단선결선도","설비용량 명세"] | 승인 | [] | 계통연계 승인 완료, 다음 절차(공사 착수) 안내 |
| prj_0005 | 옥상태양광 | 부산광역시 해운대구 | r_busan_haeundae | 발전사업허가(1MW 이하) | ["사업계획서","부지 임대차계약서","단선결선도"] | 접수 | ["안전관리자 선임 계획서"] | 해운대구 요건인 안전관리자 선임 계획서 보완요청 |
아래 JSON Schema 에 맞는 태양광 발전소 인허가 프로젝트 케이스 40행을 JSON 배열로 생성하세요. region_raw·procedure 는 permit_kb 의 지자체·절차와 매칭되게 하고, gold_missing_docs 는 해당 요건의 required_docs 와 submitted_docs 의 차집합으로 결정되게(정답이 규칙으로 재현되게) 만드세요.
{"type":"object","properties":{"project_id":{"type":"string"},"plant_type":{"type":"string","enum":["옥상태양광","지붕태양광","유휴부지태양광"]},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"submitted_docs":{"type":"array","items":{"type":"string"}},"state":{"type":"string","enum":["접수","보완요청","재접수","승인","반려"]},"gold_missing_docs":{"type":["array","null"],"items":{"type":"string"}},"gold_next_action":{"type":"string"}},"required":["project_id","plant_type","region_raw","procedure","submitted_docs","state","gold_next_action"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞으세요: (1) submitted_docs 가 빈 배열인 경계값 1~2건(전부 보완요청), (2) region_id=null 인 미등록 지자체 orphan 1~2건(gold_missing_docs=null, '미매핑' 처리), (3) region_raw 표기 흔들림(같은 지자체를 '경기도 성남시'와 '성남'으로), (4) state=반려 케이스(재접수 전이가 불가함을 상태머신이 걸러야 함), (5) 필수 서류를 모두 갖춘 gold_missing_docs=[] 케이스. JSON 배열만 출력하세요.{"type":"object","properties":{"project_id":{"type":"string"},"plant_type":{"type":"string","enum":["옥상태양광","지붕태양광","유휴부지태양광"]},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"submitted_docs":{"type":"array","items":{"type":"string"}},"state":{"type":"string","enum":["접수","보완요청","재접수","승인","반려"]},"gold_missing_docs":{"type":["array","null"],"items":{"type":"string"}},"gold_next_action":{"type":"string"}},"required":["project_id","plant_type","region_raw","procedure","submitted_docs","state","gold_next_action"]}| Python | 요건 지식베이스 인덱싱·RAG 검색, 서류 완결성 규칙 검사, 상태머신 전이 로직, 인용 청크 일치 자동 채점 스크립트 |
| TypeScript | 인허가 진행 콘솔(프로젝트별 필요 서류·누락 체크리스트·상태 보드) 프런트 |
| Next.js | 콘솔 웹앱 + 요건 근거 인용 카드·상태 타임라인 렌더링 |
| LLM(Claude Sonnet) | 보완요청 대응 초안 작성과 요건 요약 등 변환·문구 보조(정답 판정은 규칙·인용 일치가 담당) |
| RAG | 지자체별 요건 지식베이스에서 필요한 절차·서류 근거 청크를 검색하고 chunk_id 로 인용 |
| Multi-Agent | 요건조회·서류검증·문서작성 에이전트를 분리해 오케스트레이션 |
| GCP Cloud Run | 2주차부터 API·워커를 배포·운영 |
| Vertex AI | 요건 청크 임베딩과 검색 서빙(RAG 벡터 검색) |
| BigQuery | 프로젝트 진행현황·서류 누락 패턴 집계 |
| n8n | 상태 변화(보완요청·승인) 시 다음 절차 알림·트리거 워크플로 자동화 |
| PostgreSQL | 프로젝트·서류·상태·요건 참조의 단일 진실원 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우고 싶으면 2주차(인용 정확도 검증·에이전트 분리·사람 검수 일치)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(상태 변화 자동화·진행현황 집계 대시보드)로 진행합니다.
프로젝트별로 1) 필요한 인허가 절차·서류를 요건 청크 인용과 함께 제시, 2) 제출 서류의 빠진 항목을 근거와 함께 판정, 3) 상태머신으로 현재 상태·다음 액션·전이 정합성 확인, 4) 보완요청 대응 초안을 근거를 붙여 작성. 판정(누락·전이)은 규칙으로 결정하고 LLM 은 초안·요약만 맡습니다.
{"type":"object","properties":{"project_id":{"type":"string"},"region_id":{"type":["string","null"]},"required_procedures":{"type":"array","items":{"type":"object","properties":{"procedure":{"type":"string"},"requirement_chunk_id":{"type":"string"},"required_docs":{"type":"array","items":{"type":"string"}}},"required":["procedure","requirement_chunk_id","required_docs"]}},"missing_items":{"type":"array","items":{"type":"object","properties":{"doc_type":{"type":"string"},"status":{"type":"string","enum":["present","missing","unmapped"]},"evidence_chunk_id":{"type":["string","null"]}},"required":["doc_type","status"]}},"state":{"type":"object","properties":{"current":{"type":"string"},"next_action":{"type":"string"},"transition_valid":{"type":"boolean"}},"required":["current","next_action","transition_valid"]},"draft_reply":{"type":["string","null"]},"hedge":{"type":["string","null"]}},"required":["project_id","required_procedures","missing_items","state"]}[
{
"input_ref": "prj_0001 (강남구 옥상태양광, 발전사업허가, 상태=접수)",
"output": {
"project_id": "prj_0001",
"region_id": "r_seoul_gangnam",
"required_procedures": [
{
"procedure": "발전사업허가(1MW 이하)",
"requirement_chunk_id": "kb_gangnam_biz_01",
"required_docs": [
"사업계획서",
"부지 임대차계약서",
"단선결선도",
"발전원 종류 및 설비용량 명세"
]
}
],
"missing_items": [
{
"doc_type": "사업계획서",
"status": "present",
"evidence_chunk_id": "kb_gangnam_biz_01"
},
{
"doc_type": "부지 임대차계약서",
"status": "present",
"evidence_chunk_id": "kb_gangnam_biz_01"
},
{
"doc_type": "단선결선도",
"status": "present",
"evidence_chunk_id": "kb_gangnam_biz_01"
},
{
"doc_type": "발전원 종류 및 설비용량 명세",
"status": "missing",
"evidence_chunk_id": "kb_gangnam_biz_01"
}
],
"state": {
"current": "접수",
"next_action": "설비용량 명세 보완을 위해 보완요청으로 전환",
"transition_valid": true
},
"draft_reply": "접수하신 강남구 옥상태양광 발전사업허가 건은 사업계획서·임대차계약서·단선결선도가 확인되었습니다. 발전원 종류 및 설비용량 명세가 확인되지 않아 보완을 요청드립니다.",
"hedge": "필수 서류 목록은 작성자가 만든 더미 요건(kb_gangnam_biz_01) 기준이며, 실제 접수 시 지자체 최신 고시로 확인이 필요합니다."
}
},
{
"input_ref": "prj_0008 (원주시, 요건 지식베이스 미등록 지자체)",
"output": {
"project_id": "prj_0008",
"region_id": null,
"required_procedures": [],
"missing_items": [
{
"doc_type": "(요건 미확인)",
"status": "unmapped",
"evidence_chunk_id": null
}
],
"state": {
"current": "접수",
"next_action": "요건 지식베이스에 없는 지자체이므로 '미매핑'으로 표시하고 요건 확인 요청",
"transition_valid": true
},
"draft_reply": null,
"hedge": "원주시 요건이 지식베이스에 등록되지 않아 필수 서류를 판정하지 않았습니다. 추측 없이 미매핑으로 처리합니다."
}
},
{
"input_ref": "prj_0009 (미추홀구, 상태=반려에서 재접수 시도)",
"output": {
"project_id": "prj_0009",
"region_id": "r_incheon_michuhol",
"required_procedures": [
{
"procedure": "발전사업허가(1MW 이하)",
"requirement_chunk_id": "kb_incheon_biz_01",
"required_docs": [
"사업계획서",
"부지 임대차계약서",
"단선결선도"
]
}
],
"missing_items": [
{
"doc_type": "사업계획서",
"status": "present",
"evidence_chunk_id": "kb_incheon_biz_01"
},
{
"doc_type": "부지 임대차계약서",
"status": "present",
"evidence_chunk_id": "kb_incheon_biz_01"
},
{
"doc_type": "단선결선도",
"status": "present",
"evidence_chunk_id": "kb_incheon_biz_01"
}
],
"state": {
"current": "반려",
"next_action": "반려 건은 재접수로 바로 전이할 수 없어 신규 접수 절차를 안내",
"transition_valid": false
},
"draft_reply": "해당 건은 반려 상태로, 재접수가 아닌 신규 접수가 필요합니다. 반려 사유를 먼저 확인해 주시기 바랍니다.",
"hedge": "상태 전이 정합성은 작성자가 정의한 상태머신 규칙 기준입니다. 실제 지자체 절차의 재접수 허용 여부는 확인이 필요합니다."
}
}
][자동 검증] 1. JSON Schema 형식 통과: 출력이 스키마를 만족하는지(필드·enum·타입) 검사해 형식 깨짐을 거릅니다. 2. 인용 청크 일치: required_procedures·missing_items 의 chunk_id 가 permit_kb 에 실제 존재하고, required_docs 가 그 청크의 목록과 일치하는지 대조합니다(근거 없는 인용 차단). 3. 누락 판정 정확도: missing_items 의 missing 이 required_docs 와 submitted_docs 의 차집합과 일치하는지 규칙으로 채점합니다. 4. 상태 전이 정합성: state.transition_valid 가 상태머신 허용 전이(접수→보완요청→재접수→승인/반려)와 맞는지, 반려→재접수 같은 금지 전이를 걸러내는지 검사합니다. [수동 검증] 1. 보완요청 초안 검수: 외부 검수자 2명이 draft_reply 가 근거와 맞고 과장·단정이 없는지 라벨링하고, 판정이 얼마나 일치하는지 측정합니다(Cohen's κ: 두 사람 판정이 우연 이상으로 일치하는 정도, 0~1). 2. 미매핑 처리 점검: region_id=null·요건 미확정 케이스에서 추측 없이 unmapped 로 표시되는지 표본 점검합니다.