How I Built a Carbon Footprint Tracker with Django + NVIDIA NIM
개요
Django와 NVIDIA NIM을 활용하여 개발된 Carbon.Ledger는 사용자가 활동을 기록하고 CO₂ 배출량을 추적하며 AI 기반 절감 팁을 받을 수 있는 풀스택 웹 애플리케이션이다.
주요 내용
* 애플리케이션 구조: Django 5 백엔드, Tailwind CSS, htmx, Chart.js 프론트엔드, NVIDIA NIM (mistralai/mistral-large-3-675b-instruct-2512) LLM, SQLite/PostgreSQL 데이터베이스, Redis 캐시를 사용하며 Render.com에 배포되었다.
* 핵심 기능 (세 가지 기둥):
* 이해 (Understand): 사용자는 CO₂e, Scope 1/2/3, Net Zero 등 관련 용어를 학습하고 LLM 기반 Q&A를 통해 기후 관련 질문을 할 수 있다 (일일 10회 제한).
* 추적 (Track): 교통, 에너지, 음식, 상품 등 활동 로그를 작성하면 데이터베이스에 저장된 배출 계수를 사용하여 CO₂ 영향이 자동으로 계산된다. 대시보드는 Chart.js 도넛 차트로 30일간의 배출량 내역과 월별 목표 진행 상황을 보여준다.
* 감소 (Reduce): 규칙 기반 인사이트는 사용자의 총 배출량을 국가 평균 벤치마크와 비교하며, 가장 높은 배출 카테고리에 대한 맞춤형 권장 사항을 제공한다. LLM은 일일 1회 개인화된 절감 팁을 생성하며, 이는 24시간 동안 사용자별로 캐시된다.
* LLM 환각(Hallucination) 방지: LLM이 부정확한 수치를 생성하는 문제를 해결하기 위해, LLM 응답에서 추출된 모든 숫자가 제공된 컨텍스트(사용자 데이터)에 존재하는지 확인하는 _contains_hallucinated_numbers 함수를 구현했다. LLM은 계산에 사용되지 않고, 모든 수학 연산은 Python/DB에서 처리된다. LLM 호출에 타임아웃 및 재시도 횟수를 설정하여 Gunicorn 워커 스레드 중단을 방지한다.
* htmx 활용: 활동 기록 양식에서 카테고리 선택 시 관련 배출 계수를 동적으로 로드하는 종속 드롭다운에 htmx를 사용하여 별도의 JavaScript 파일 없이 구현했다. 서버는 필터링된 계수가 포함된 HTML 스니펫을 반환한다.
* Render.com 배포: TLS 종료가 프록시 수준에서 이루어지므로 Django 설정에서 SECURE_PROXY_SSL_HEADER를 필수적으로 사용해야 하며, 관리자 URL은 보안을 위해 환경 변수로 무작위화하는 것이 권장된다.
* 개선 사항: LLM 호출의 비동기 처리를 위해 Celery와 Redis를 통한 백그라운드 작업 구현, 공신력 있는 배출 계수 데이터셋 통합, 이메일 인증 기능 추가 등을 고려할 수 있다.
시사점
NVIDIA NIM LLM을 Django 애플리케이션과 통합할 때, LLM의 환각 현상을 방지하기 위한 가드 패턴은 실질적인 데이터 기반 애플리케이션 개발에 있어 중요한 설계 원칙을 제시하며, htmx는 JavaScript 없이 동적인 웹 UI를 효율적으로 구축하는 방법을 보여준다.
댓글
GitHub Discussions