FEMS #1 (셋업) / #2 (코퍼스 + 모델 비교) 에 이은 3편. 오늘은 Streamlit 대시보드 + 3-백엔드 질문 평가 까지.
Table of contents
Open Table of contents
세션 노트 — Claude Code 가 마음대로 streamlit 설치
오늘은 Streamlit 대시보드를 짤 거였는데, Claude Code 새 세션에서 작업을 시작했더니 자기 마음대로 streamlit 을 설치하고 코드 작성을 시작했다. 확인해보니 이 프로젝트에 CLAUDE.md 가 없다는 걸 발견했다.
→ 표준 지침을 만들어야겠다는 생각이 들었다. 일단 필요한 서브에이전트들부터 만들고, 그 다음 본 작업으로 넘어간다. (이건 별도 글로 정리)
1. Streamlit 비교 대시보드

좌측 사이드바 — Ollama (로컬) / Claude (API) / GPT (API) 체크박스. 우측 — 데이터 트랙 (합성 / 실) 선택 + 시간 범위 + 그래프 표시 + 질문 입력.
캡처에 보이는 건 합성 데이터 다. 이상치를 의도적으로 주입했기 때문에 그래프에서 바로 식별할 수 있다.
합성 데이터를 쓰는 이유는 #2 의 의문 그대로 — 실 데이터 기반 질문이 필요할 땐 별도로 만들어야 한다. 오늘은 두 종류의 질문을 다 던져본다.
Q1 — 합성 데이터: “5월 에어 컴프레셔 문제가 있었나?”
5월 한 달간 air_compressor 에 이상치가 있는 걸 그래프에서 확인하고, 동일한 질문을 던졌다.

| 백엔드 | 모델 | 지연 | 비용 | 응답 |
|---|---|---|---|---|
| Ollama | exaone3.5:7.8b | 23.3s | 로컬 $0 | ”자료에 없음” |
| Claude | claude-opus-4-8 | 12.3s | $0.0352 | 상세 추론 응답 |
| GPT | gpt-4o | 1.5s | $0.0056 | ”자료에 없음” |
Claude 의 추론 — raw 데이터 없이 요약치만으로

Claude 는 정확한 발생 시각·날짜별 로그가 데이터로 주어지지 않았는데도 합성 데이터의 평균치 / 최대치를 비교해서 “주말 시간대에 이상 징후가 있을 것” 으로 추측했다. 캡처에서 잘렸지만 그에 따른 권고 사항 도 같이 제시했다.
왜 이런 차이가 생겼나 — 설계 의도
원본 csv 는 시각화에만 쓰고, LLM 들에게는 csv 요약 정보만 보여준다. anomaly 신호는 보존하되, 직접 탐지하게는 하지 않는 의도된 설계다.
그 결과:
- exaone / gpt → “자료에 없음” 으로 소극적 대답 (안전한 선택, 환각 회피)
- Claude → 제한된 정보 내에서 성공적 추론 + “정확한 날짜·시각은 알 수 없다” 는 한계까지 정확히 고지
이 차이가 가장 인상적인 부분이다. 자료에 직접적인 답이 없을 때 “추론으로 채워볼 것인가, 보수적으로 보류할 것인가” 의 모델 성격 차이가 그대로 드러난다.
Q2 — 실 데이터: “1년치 제철소 패턴, 관리자 관점 절약 방안”
두 번째는 UCI Steel 데이터셋 기반 질문이다. 토큰 제한이 있어서 “핵심적인 내용을 추려달라” 고 명시했다.

| 백엔드 | 지연 | 비용 | 출력 토큰 |
|---|---|---|---|
| exaone3.5:7.8b | 46.2s | $0 | 480 |
| claude-opus-4-8 | 17.2s | $0.0423 | 1024 (상한) |
| gpt-4o | 4.8s | $0.0100 | 475 |
exaone 답변

데이터 기반 답변 + 여러 문서 참조는 OK 인데, 중간에 인덱스가 깨지면서 “4번 항목이 두 개” 가 되고 문단 분리가 어색해졌다. 캡처 위쪽의 “에너지 절약 방안 제시” 부분은 그냥 “노력해라” 수준의 일반론.
Claude 답변

Claude 는 다음을 전부 다뤘다:
- 데이터에서 확인된 패턴
- 관리자 관점 에서의 절약 방향
- 절감 성과를 어떻게 측정할지 — 산정·검증 절차
- 모니터링·시각화 방법
답변 질은 아주 좋았다. 출처도 제대로 들고 왔고 (fems_market_report_sample.pdf, fems_mv_guideline.pdf), 각 섹터 구분이 명확했다.
다만 — 출력 토큰 상한 (1024) 에 걸려서 마지막 유의사항 부분이 잘렸다:

설명할 게 많아 보였다. max_tokens 를 올렸다면 완성됐을 것이다.
GPT 답변 — 깔끔하지만 환각 발견

GPT 답변은 군더더기 없이 딱 관리자 입장에서 핵심 조치 사항만 알려줬다. 토큰 제한도 안 넘기고 내용도 좋았다.
그런데 함정이 있었다.
“역률 개선 장치의 예시로 커패시터를 들었는데 이건 내가 준 데이터가 아니다.”
일반적 지식으로 지어낸 정보 (환각) 였다. 시스템 프롬프트에 “지어내지 말 것” 이 있었는데 무시하고 지어냈다.
이게 보수적 vs 적극적 응답의 다른 측면이다. Q1 에서는 gpt 가 “자료 없음” 으로 보수적이더니, Q2 에서는 갑자기 자료에 없는 일반 지식을 끌어와 채워넣었다. 동일 모델이 질문 형식에 따라 다른 성향을 보인다.
채점 — 5축 평가

기준: ① 모델이 받은 steel 브리프와 사실 일치 ② 환각 ③ 출처 정확 귀속 ④ 한국어 일관성 ⑤ 관리자용 핵심 추리기.
| 축 | exaone | Claude | gpt-4o |
|---|---|---|---|
| 정답성 | 1 — 수치 정확하나 핵심 못 짚음 | 2 — 부하편중·역률저조·주말기저부하 정확 | 1 — 표면적, M&V 미활용 |
| 환각 | 2 — 지어냄 없음 | 2 — 전부 근거 확인됨 | 1 — “커패시터” 환각 |
| 출처 | 1 — 막연 인용 | 2 — M&V·시각화 정확 귀속 | 1 — mv_guideline 놓침 |
| 언어 | 2 | 2 | 2 |
| 유용성 | 1 — 인덱스 깨짐 | 1 — 1024 토큰 절단으로 미완 | 2 — 간결·구조 명확 |
| 총점 | 7/10 | 9/10 | 7/10 |
Claude 가 가장 성능이 좋다. 토큰 상한을 올렸다면 만점이었을 것이다.
가성비 관점
exaone, gpt 가 Claude 보다 저렴한 비용 으로 사용 가능하다 → 이 모델들을 어떻게 튜닝하면 Claude 수준에 근접시킬 수 있을지 가 다음 과제다. 해결한다면 경제적으로 매우 유리하다.
구체적으로:
- exaone — 인덱스 깨짐은 출력 형식 강제 (JSON / numbered list) 로 잡힐 가능성이 있다
- gpt — “지어내지 말 것” 을 시스템 프롬프트가 아니라 few-shot 예제 로 강제하면 환각이 줄지도 모른다
회고
오늘 학습 핵심 3가지:
- 추론 vs 보수의 분기 — Q1 에서 exaone/gpt 가 “자료 없음” 으로 보수적일 때 Claude 는 요약치만으로 추론 + 한계 고지. 모델 성격 차이가 그대로 드러난다.
- 동일 모델도 질문 형식에 따라 성향이 뒤집힌다 — gpt 는 Q1 (있는 사실 추론) 에선 보수적, Q2 (일반 추천) 에선 갑자기 환각. 단일 케이스 평가로 모델을 판단하면 위험하다.
- 출력 토큰 상한이 평가에 큰 영향 — Claude 9/10 의 1점 감점이 토큰 절단 때문이다. 운영 환경에선
max_tokens+ “핵심만” 프롬프트 + 응답 형식 제약 조합이 필요하다.
더 공부해볼 것
1. 동일 질문 다회 반복으로 분산 확인
- 오늘 평가는 각 질문에 대해 1회 응답
- 동일 질문 × 5~10회 반복해서 응답 분산 + 환각 빈도 측정
- “Claude 가 항상 9/10 인가, 평균이 9/10 인가” 는 다른 얘기
- 비결정성 (sampling temperature) 의 영향 시각화
2. 출력 토큰 절단 방지 패턴
max_tokens동적 조절 — 질문 복잡도에 비례해서- 응답 형식 제약 (JSON / 짧은 bullet) 으로 길이 강제
- 2-pass — 1차 짧은 요약 → 2차 상세 보강
- 토큰 절단 감지 + 자동 continuation 패턴
3. 환각 감지 자동화
- gpt 의 “커패시터” 같은 자료에 없는 키워드를 자동으로 잡아내는 평가기
- 응답 텍스트에서 명사구 추출 → 검색 청크에 존재 여부 검사
- LLM-as-judge 로 fact-checking
- RAGAS 의 Faithfulness 메트릭
4. 저비용 모델 튜닝 전략
- 시스템 프롬프트 정제 — Claude 가 잘하는 패턴을 명시적으로 가르치기
- Few-shot 예제 — exaone/gpt 에 “이런 형식으로 답해” 보여주기
- 출력 schema 강제 — JSON Mode / Structured Output
- 동일 코퍼스 + 평가셋으로 튜닝 전후 점수 비교
5. 실 데이터 RAG 와 합성 데이터 RAG 의 분리
- 오늘 Q1 (합성) 과 Q2 (실 데이터) 가 같은 벡터 DB
- 분리하면 검색 정확도 / 응답 품질이 어떻게 달라지는지
- 두 트랙을 동시에 운영 할 때 검색 라우팅 정책
- 실 데이터 기반 질문이 합성 데이터 청크를 가져오는 누수 방지
6. 평가셋 자동 구축
- 오늘은 질문을 손으로 작성
- 코퍼스 청크 → LLM 으로 질문 자동 생성 → 사람이 검수
- 평가셋이 커지면 신뢰할 수 있는 점수가 나온다
- RAG 데이터 준비 글 의 평가셋 구축 항목과 직결