story · how it was built
설명
무엇을 (문제·대상)
지역 현황을 묻는 일은 대개 「어느 동이 제일 취약한가」로 시작해서 「그 근거가 뭔가」로 끝납니다. 그 사이에 GIS 도구 사용법과 통계 처리라는 장벽이 있습니다. 이 코파일럿은 경상남도 행정동 약 305개(22개 시군구)의 의료·인구 접근성을 자연어로 물어보고 지도에서 확인하는 도구입니다.
주요 기능
- 자연어 질의 — 「생활인구 많은 동네」처럼 적으면 지도가 칠해지고 순위가 나옵니다.
- 분석 레지스트리 — 의료 취약, 고령 수요, 인구 증가 압력, 최근접 거리, 반경 접근성, 지역 비교 등을 도구 단위로 등록해 두고 조합합니다.
- 지도 — 행정동 경계 choropleth, 시설 마커·클러스터, 1·2·3km 접근 반경.
- 근거 표기 — 결과마다 산식과 기준월을 함께 보여 줍니다. 「한 줄 결론」 옆에 방법론이 붙습니다.
- 내보내기 — CSV · 보고서 · 한글 · 슬라이드로 그대로 뽑아냅니다.
- 키 없이도 동작 — 지도 키가 없으면 SVG 대체 지도로 전체 분석 흐름이 그대로 돕니다.
어떻게 만들었는가 (과정·도구 활용)
자연어 처리는 규칙 파서를 먼저 두고, 필요할 때만 LLM JSON 파서를 태우는 하이브리드입니다. 여기에 행정동 지명 사전을 붙여 「북상면」 같은 지명이 엉뚱한 곳으로 붙지 않게 했습니다. 데이터는 HIRA 병원정보와 주민인구를 병합해 Supabase 공개 스냅샷으로 캐시하고, cron 으로 동기화합니다.
구조·실행 (짧게)
Next.js 앱 + Supabase 스냅샷 + 동기화 스크립트. 환경변수가 비어 있는 상태가 정상적인 데모 모드이고, 키를 넣으면 실데이터 모드로 올라갑니다. 서비스 롤 키와 공공데이터 키는 브라우저에 노출하지 않습니다.
한계·다음
- 현재 배포본의 실데이터 모드는 시설이 실데이터이고 인구는 합성값입니다. 화면 표기와 별개로 이 점을 분명히 해 둡니다.
- 데이터 거버넌스 기준과 민간 격자 데이터의 비식별 기준이 아직 정리되지 않았습니다. 이게 정리돼야 인구 쪽도 실데이터로 올릴 수 있습니다.
journey · lessons
과정 · 배운 점
본문 = 무엇·기능·사용법. 여기 = 시간순 여정 + 다음에 남긴 교훈.
결과가 이상하면 로직보다 값의 범위를 먼저 봐야 합니다. 순위는 입력이 노이즈여도 언제나 그럴듯하게 나옵니다. 1위가 나온다는 사실 자체는 아무것도 보증하지 않습니다.
「실데이터 모드」라는 라벨이 모든 레이어가 실데이터라는 뜻은 아닙니다. 레이어마다 출처가 다르면 라벨도 레이어마다 달아야 합니다.
지명 사전 없이 문자열 매칭으로 행정동을 찾으면 부분일치가 엉뚱한 지역을 잡습니다. 어간으로 넓히는 것이 특히 위험합니다.
피드백 원함 · 개선 제안 · 질문 · 스택·도구 조언