📝 TIL | 2026.04.06 (월)
오늘 학습한 내용
과목 3개 | Streamlit 심화, LLM 텍스트분석, 시스템환경
1. Streamlit 심화 — 레이아웃 & 멀티페이지 앱
핵심 개념
- Session State — Streamlit은 위젯 동작마다 코드를 처음부터 끝까지 재실행하므로, 일반 변수는 매번 초기화된다. st.session_state를 사용하면 재실행에도 값이 유지되는 개별 사용자 독립 저장소를 활용할 수 있다.
- Session State vs Cache Data — Session State는 개별 사용자 독립 데이터(새로고침 시 소멸), Cache Data(@st.cache_data)는 모든 사용자가 공유하는 데이터(새로고침에도 유지).
- Form — 입력 위젯마다 코드가 재실행되는 문제를 해결. st.form() + st.form_submit_button()으로 Submit 버튼 클릭 시에만 1번 재실행하여 성능 최적화.
레이아웃 컴포넌트 정리
컴포넌트 용도
| st.columns() | 화면 가로 분할, 비율 지정 가능 |
| st.tabs() | 같은 자리에 다른 정보 표시(탭 전환) |
| st.container() | 요소 논리적 그룹화, 높이 초과 시 스크롤 |
| st.expander() | 펼치기/접기, 덜 중요한 정보 숨김 |
| st.empty() | 자리 확보 후 동적 교체 |
| st.space() | 요소 사이 수직 간격 제어 |
| st.dialog() | 모달 팝업창 |
사이드바 & 필터링
- label_visibility 파라미터로 위젯 레이블 표시 방식 제어 — "visible"(기본), "hidden"(공간 유지), "collapsed"(공간 제거)
- 위젯에 key 설정 시 Streamlit이 자동으로 st.session_state에 값 저장. del st.session_state["key"] + st.rerun()으로 필터 초기화 구현.
멀티페이지 앱 핵심
- st.Page() + st.navigation() 조합으로 멀티페이지 앱 구성
- 페이지 간 상태 유지 규칙: 직접 선언한 Session State(st.session_state.xxx = 값)는 영구 유지 ✅ / 위젯 key로 생성된 Session State는 페이지 이동 시 자동 삭제 ❌
- 해결: 임시 키(_ 접두사) + on_change 콜백으로 영구 키에 복사하는 3단계 패턴
성능 최적화
- @st.cache_data — DataFrame, API 응답 캐싱 (복사본 반환, 안전)
- @st.cache_resource — DB 연결, ML 모델 캐싱 (원본 공유, 메모리 효율)
- @st.fragment — 전체 스크립트가 아닌 특정 영역만 부분 재실행하여 성능 향상
2. LLM 텍스트분석 — 구조화된 출력 실전 & 이미지(VLM) 처리
구조화된 출력(Structured Output) 복습
- Pydantic BaseModel을 상속받아 응답 형식 스키마를 설계하는 방법
- 중첩 구조(Nested Structure) — 메인 스키마 안에 하위 스키마를 list[]로 포함. 하나의 입력에서 여러 항목을 추출할 때 필수.
- 범주형 데이터는 반드시 Literal로 지정 — str로 하면 응답이 부정확해질 수 있음
- Output Validator — 여러 필드 간 논리적 관계 검증이 필요할 때 @agent.output_validator 설계
실습 내용
- 개인정보 마스킹 — 텍스트에서 이름, 전화번호, 이메일 등을 자동 탐지 + 규칙 기반 마스킹. 중첩 구조(PIIResult → list[PIIItem]) 활용.
- 설문조사 데이터 표준화 — 비정형 응답에서 인구통계정보 자동 추출 + 표준 범주 변환 + 품질 평가. Optional 필드와 나이 추정 처리 포함.
- 패션 이미지 분류 — VLM으로 상품 이미지에서 성별, 아이템 상세(카테고리/색상/패턴/소재), 전체 스타일, 계절 적합성 자동 추출.
- 영수증 OCR — 영수증 이미지에서 상점명, 상품 목록, 금액, 결제수단 등 정형화 추출.
- 쿠팡 선크림 리뷰 분석 — 층화 샘플링(StratifiedShuffleSplit)으로 비용 절감 + 측면별 감성 분석(ABSA)으로 품질/배송/가성비 등 각 측면 분리 평가.
VLM(Vision Language Model) 핵심
- VLM = 텍스트 + 이미지를 함께 입력받아 처리하는 모델. 별도 OCR 모델 없이 하나의 모델에서 종합적 이해 가능.
- Gemini가 이미지 처리에 강점 — Google의 풍부한 이미지/영상 데이터 기반
- 공식 문서 권장: 이미지 먼저 → 텍스트 뒤에 순서로 입력, 선명한 이미지 사용, 올바른 회전
층화 샘플링 & ABSA
- 층화 샘플링 — 원래 비율을 유지하면서 표본 추출 → 편향 방지 + 비용 절감
- ABSA(Aspect-Based Sentiment Analysis) — 하나의 리뷰에서 측면별 다른 감정을 분리 분석. 기존 ML 감성분석의 한계("품질은 좋은데 배송이 느렸어요" → 긍정? 부정?)를 해결.
3. 시스템환경 — 대용량 데이터 다운로드
문제 상황
- 구글 드라이브 폴더에서 대량 CSV 파일을 Python으로 다운로드해야 하는 상황
해결 과정 (단계별 진화)
- gdown 기초 — gdown.download_folder()로 폴더 전체 다운로드. download()와 반드시 구분!
- 에러 해결 — InvalidSchema(URL 오타), FileURLRetrievalError(Rate Limit) 대처. Traceback은 Bottom-up으로 읽기.
- 분할 정복 — 딕셔너리 + 반복문으로 설정과 로직 분리. try-except + time.sleep() + random.uniform()으로 에러 핸들링.
- Retry + 이어받기 — os.path.exists() 체크포인트 + 최대 3회 재시도 + error_log.txt 기록. "부분 성공" 함정 주의(하위 폴더 단위로 쪼개기).
- Google Drive API — 공식 API로 안정적 다운로드. 재귀 함수로 하위 폴더 자동 탐색. service.files().list(q=query) 쿼리 활용.
- OAuth 2.0 대안 — 조직 정책으로 서비스 계정 키 생성이 차단될 경우, pydrive2의 OAuth 인증으로 우회.
핵심 교훈
- credentials.json, client_secrets.json 등 인증 파일은 절대 GitHub에 올리지 말 것 (.gitignore 필수)
- 코드가 안 돌아갈 때 type(변수명) 찍어보기 — 리스트인지 딕셔너리인지 확인만으로 오류의 80%는 해결
오늘의 핵심 한 줄 요약
Streamlit 멀티페이지 앱의 상태 관리 패턴(임시 키 + on_change 콜백), LLM 구조화된 출력의 중첩 스키마 설계 + VLM 이미지 처리, 대용량 데이터 다운로드의 단계별 진화(gdown → API → OAuth) — 세 가지 축으로 실전 역량을 확장한 하루.
'[데이터분석] 부트캠프 TIL' 카테고리의 다른 글
| 20260403 TIL (0) | 2026.04.03 |
|---|---|
| 20260402 TIL (0) | 2026.04.02 |
| 20260401 TIL (0) | 2026.04.01 |
| 20260331 TIL (0) | 2026.03.31 |
| 20260330 TIL (0) | 2026.03.30 |