데이터에 구멍이 있으면 AI도 거짓말을 한다 — 빠진 등급을 채우고 챗봇 속도를 추적한 하루
📚 「AI 헬스케어 파이널 프로젝트」 연재 15편입니다. (14편: 건강 점수가 ‘왜’ 그렇게 나왔는지까지 설명하게 만들다)

📝 한줄 요약
모델을 시험하는 데이터에 특정 위험 등급(G3) 사례가 0건이라 그 등급은 검증 자체가 안 되고 있었습니다. 빠진 구간을 전체 데이터로 다시 학습해 채웠더니 161건이 자연스럽게 생겼습니다. 같은 날 챗봇이 느린 진짜 이유도 숫자로 추적해 잡았고, 챌린지를 그만둘 때 그날 기록까지 깔끔히 되돌리는 버그도 고쳤습니다. 지난 편에서 AI가 “왜 이 점수인지”까지 설명하게 만들었다면, 이번엔 그 설명이 거짓이 되지 않도록 데이터의 빈칸을 메운 하루였습니다.
바쁘시면 이것만 읽어도 돼요:
- 시험용 데이터에 한 등급이 통째로 비어 있으면, 그 등급은 “잘 맞힌다”는 평가가 거짓이 됨
- 빠진 구간은 일부만 쓰던 데이터를 전체로 늘려 재학습하니 자연히 채워짐(0건 → 161건)
- 챗봇이 느린 진짜 원인 = “답변이 길어서” + “첫 요청 때 모델이 처음 깨어나는 지연(콜드 스타트)”
- 해법은 단순했습니다 — 서비스 시작할 때 모델을 미리 한 번 깨워두기(워밍업)
- 챌린지를 그만두면 그날 적립까지 되돌리도록(롤백) 정리
- 팀원이 같은 환경에서 작업하도록 공용 자료를 구글 드라이브로 공유하는 체계 마련
🎯 이런 분들께 도움돼요
- AI 모델 성능을 “잘 나왔다”고 믿었는데, 데이터에 빈칸이 없는지 궁금한 분
- 서비스가 느린데 어디서 느린지 감이 안 잡히는 분
- 팀원과 똑같은 작업 환경을 맞추느라 고생해본 분
😫 문제 상황 (Before)
지난 편까지 우리 서비스는 콩팥병 위험을 등급으로 알려주고, “왜 그 등급인지”까지 설명할 수 있게 됐습니다. 그런데 한 가지가 계속 마음에 걸렸습니다. 중간 위험에 해당하는 G3 등급이 화면에 거의 안 나타나는 거였어요.
처음엔 연결이 잘못된 줄 알았습니다. 모델이 “이 사람 G3예요”라고 판정해도 화면까지 안 넘어오나, 하고요. 그런데 연결을 따라가 보니 코드는 멀쩡했습니다. 문제는 다른 데 있었습니다. 모델을 시험하는 데이터 안에 G3 사례가 단 한 건도 없었던 겁니다.
이게 왜 무서운 일이냐면요. AI 모델은 만든 뒤에 “시험 데이터”로 점수를 매깁니다. “이 정도면 잘 맞히네”를 확인하는 절차죠. 그런데 시험지에 G3 문제가 아예 없으면, “이 모델은 G3를 잘 맞힌다”는 평가는 거짓말이 됩니다. 맞힌 적도 틀린 적도 없는데 어떻게 평가하나요. 빈칸을 안 채우면 우리는 모르는 채로 “다 잘 된다”고 착각하게 됩니다.
🛠️ 사용한 도구
- 도구: Claude Code
- 모델: Claude Opus
- 특이사항: 빠진 데이터 구간을 재학습으로 채우고, 챗봇이 느린 지점을 숫자로 추적. 팀 협업용 공용 자료 공유 체계까지
🔧 작업 과정
시험지에 G3 문제가 없었다 — 빈칸을 데이터로 채우기
먼저 G3가 왜 안 보이는지부터 파고들었습니다. 연결 코드는 이미 제대로 만들어져 있었어요. 모델이 G3라고 판정만 하면 화면까지 잘 넘어가도록요. 그러니 진짜 원인은 모델이 애초에 G3 판정을 거의 안 내린다는 쪽이었습니다.
이유는 학습 방식에 있었습니다. 그동안 빠른 확인을 위해 데이터의 일부만 떼어 가볍게 학습시키고 있었거든요. 빠르긴 한데, 그렇게 학습한 모델은 점수를 좁은 범위에서만 내놓아서 G3 같은 중간 등급이 거의 안 나왔습니다. 시험 데이터에 G3가 0건이었던 것도 같은 뿌리였죠.
그래서 데이터를 전체로 늘려 처음부터 제대로 다시 학습시켰습니다. 시간은 더 걸렸지만 결과는 분명했습니다. 시험 데이터 안에 G3 사례가 161건 자연스럽게 생겼습니다. 이제야 “G3를 잘 맞히는지”를 실제로 따져볼 수 있게 된 거죠. 마지막으로 가상의 입력 셋을 넣어 확인했습니다 — 건강한 사람은 가장 안전한 등급, 고혈압·당뇨가 있는 사람은 중간, 콩팥 기능이 크게 떨어진 사람은 위험 등급. 의학적 상식대로 정확히 반응했습니다.
💡 “성능이 잘 나왔다”는 말은 “시험지에 모든 유형이 들어 있을 때”만 참입니다. 데이터에 빠진 구간이 있으면, 평가는 본 적 없는 문제를 잘 푼다고 우기는 셈이 됩니다. 빈칸부터 확인하세요.
챗봇이 느린 진짜 이유 — 추측 대신 측정
그리고 챗봇의 응답시간이 느린데 어느 부분에서 병목현상이 일어나는지 확인해줘
챗봇 답변이 굼떴습니다. 그런데 “느리다”는 느낌만으로는 고칠 수가 없어요. 어디서 느린지를 알아야 손을 댑니다. 그래서 답변이 만들어지는 길목마다 시간을 재는 장치를 붙였습니다. 자료를 찾는 데 몇 초, 답을 쓰는 데 몇 초, 이런 식으로요.
측정 결과는 흥미로웠습니다. 첫 요청에서는 자료를 찾는 단계가 4초쯤 걸렸는데, 두 번째 요청부터는 0.2초로 뚝 떨어졌어요. 같은 작업인데 첫 번만 유독 느렸던 겁니다. 이게 바로 콜드 스타트(서비스가 켜진 뒤 모델이 처음 한 번 깨어날 때 생기는 준비 지연)였습니다. 식당으로 치면 첫 손님 주문이 늦는 이유가, 그제야 불을 켜고 팬을 데우기 때문인 것과 같죠.
그리고 진짜 병목은 따로 있었습니다 — 답변을 쓰는 시간 자체였어요. 답이 길수록 시간도 길어졌습니다(676자에 약 8.9초). 자료 검색은 0.015초로 결백했고요. 막연히 “검색이 느린가 보다” 했다면 엉뚱한 데를 고칠 뻔했습니다.
generate 단축이라는 건 출력 결과물을 간소화 한다는 건가?
저도 헷갈려서 물었습니다. “답변 시간을 줄인다”는 게 “답을 짧게 깎는다”는 뜻이냐고요. 아니었습니다. 답의 내용을 줄이는 게 아니라, 첫 요청의 콜드 스타트만 없애는 방향이었어요. 그래서 서비스가 켜질 때 모델을 미리 한 번 가볍게 깨워두는 워밍업을 넣었습니다. 손님이 오기 전에 미리 불을 켜두는 거죠. 그랬더니 첫 요청에서도 검색이 0.15초로, 처음부터 빨랐습니다.
💡 “느리다”는 느낌이 아니라 숫자입니다. 길목마다 시간을 재면, 고쳐야 할 한 곳이 또렷이 보입니다. 추측으로 손대면 멀쩡한 데를 건드리게 됩니다.
그만뒀는데 점수가 남아 있다 — 깔끔한 되돌리기
챌린지에는 작은 빈틈이 있었습니다. 사용자가 챌린지를 그만두면, 그날 찍었던 출석 체크와 거기서 받은 적립이 어정쩡하게 남는 문제였어요. 그만뒀는데 그날치 보상은 그대로면 앞뒤가 안 맞죠.
그래서 참여를 취소하면 그날 받은 것만 깔끔히 되돌리도록(롤백) 정리했습니다. 롤백은 “방금 한 작업을 없던 일로 되감는” 것을 말합니다. 중요한 건 범위였어요. 과거에 정당하게 쌓은 보상은 건드리지 않고, 오늘 분량만 회수했습니다. 마침 출석 체크를 취소하는 기능에도 똑같은 되돌리기 로직이 필요했기에, 두 곳이 같은 장치 하나를 나눠 쓰도록 묶었습니다. 같은 일을 두 군데에 따로 짜두면 한쪽만 고치다 사고가 나니까요.
💡 되돌릴 때는 “어디까지” 되돌릴지를 정하는 게 핵심입니다. 오늘 것만 회수하고 과거는 보존하는 선을 명확히 그어야, 사용자가 손해 보지도 이득 보지도 않습니다.
팀원이 같은 환경에서 일하게 — 공용 자료 공유
지금 문제가 지금 최신의 깃허브 버전을 pull해서 로컬에 설치하면 코드는 있지만 원본 파일이라던지 gitignore로 제외된 파일 때문에 제대로 작동이 되지 않는것 같아
협업을 위해서 이러한 경우 깃허브에 오르지 않는 파일이나 환경 설정등을 공유할수 있는 방법이 뭐지?
팀원이 최신 코드를 내려받아도 서비스가 안 돌아가는 일이 있었습니다. 원인은 단순했어요. 코드 저장소(깃허브)에는 올리지 않는 파일들이 있거든요. 비밀번호 같은 민감한 설정, 그리고 수 기가바이트짜리 무거운 모델 파일. 이런 것들은 일부러 저장소에서 빼두는데, 그러다 보니 코드만으로는 시동이 안 걸린 거죠.
AI와 함께 자료를 세 종류로 나눴습니다. 코드로 다시 만들 수 있는 것, 비밀로 지켜야 하는 것(열쇠·비밀번호), 너무 무거운 것(모델 파일). 둘째와 셋째는 저장소가 아닌 다른 통로로 안전하게 건네야 했습니다.
내 구글드라이브에 접근할수 있나?? 아니면 finder에도 연결되어 있는데
마침 제 구글 드라이브가 컴퓨터에 폴더처럼 연결돼 있었습니다. 그래서 거기에 팀 공용 폴더를 만들고, 필요한 자료를 한 묶음으로 담았습니다 — 비밀 설정값, 검색용 자료 보관본, 그리고 무거운 모델 파일까지요.
apply.sh 1번 이라는게 무슨 뜻이야 따로 작동을 시켜야됨?
여기서 작은 오해도 풀었습니다. 팀원이 일일이 손으로 설정하지 않도록, 한 번만 실행하면 알아서 환경을 맞춰주는 자동 설정을 같이 넣어뒀거든요. 팀원은 폴더를 받아 그걸 딱 한 번 돌리면 끝입니다. 비밀 설정 적용, 모델 내려받기, 자료 복원, 서비스 기동까지 순서대로 알아서 됩니다.
만약에 아마존 S3를 사용했다면 완전 자동화가 가능한가?
내친김에 더 큰 그림도 그려봤습니다. 지금은 제가 자료를 묶어 올려두면 팀원이 받아 쓰는 반자동 방식인데, 클라우드 저장소(아마존 S3 같은)를 쓰면 원본 데이터가 들어오는 순간부터 전처리·학습·배포까지 완전 자동으로 흐르게 만들 수 있다는 걸 확인했습니다. 이번엔 아이디어만 메모해두고, 본격 구축은 다음 과제로 남겼습니다.
💡 협업이 막히는 건 보통 코드가 아니라 “코드 밖의 것들” 때문입니다. 비밀 설정과 무거운 파일을 어떻게 안전하게 나눌지, 그리고 받는 사람이 한 번에 끝내게 할지를 챙기면 팀 전체가 빨라집니다.
✅ 결과 (After)
Before vs After
| 항목 | Before | After |
|---|---|---|
| G3 등급 검증 | 시험 데이터에 0건 (검증 불가) | 전체 재학습으로 161건 자연 발생, 검증 가능 |
| 챗봇 속도 진단 | ”느리다”는 느낌뿐 | 길목별 시간 측정 → 콜드 스타트 + 답변 길이로 특정 |
| 챗봇 첫 응답 | 첫 요청만 4초대(콜드 스타트) | 미리 깨워두기로 처음부터 0.15초 |
| 챌린지 취소 | 그날 적립이 어정쩡하게 남음 | 오늘 분량만 깔끔히 되돌리기 |
| 팀 협업 | 코드만으론 시동 안 걸림 | 공용 자료 + 한 번 실행 자동 설정 |
결과물
- G3 등급까지 검증 가능한 예측 모델(전체 데이터 재학습)
- 챗봇 응답 길목별 측정 장치 + 첫 요청 콜드 스타트 제거
- 챌린지 참여 취소 시 당일 적립 되돌리기(과거 보상은 보존)
- 구글 드라이브 팀 공용 자료 묶음 + 한 번에 환경을 맞추는 자동 설정
💬 이 과정에서 배운 AI 활용 팁
효과적이었던 것
- 데이터의 빈칸부터 의심하기: 성능이 좋아 보여도, 시험 데이터에 모든 유형이 들어 있는지 먼저 확인
- 느림을 숫자로 쪼개기: “어디서” 느린지 길목마다 시간을 재면 고칠 한 곳이 보임
- 되돌리기의 범위를 못 박기: 오늘 것만 회수, 과거는 보존 — 선을 분명히
이렇게 하면 안 돼요
- 점수만 보고 안심하기: 빠진 구간이 있으면 그 등급 점수는 의미 없음
- 추측으로 성능 손대기: “검색이 느리겠지” 하고 엉뚱한 데 고치는 일
- 무거운 파일·비밀 설정을 코드 저장소에 욱여넣기: 통로를 따로 둬야 안전하고 깔끔
🌍 다른 업무에 적용한다면?
“데이터에 구멍이 있으면 평가가 거짓이 된다”는 교훈은 AI 밖에서도 통합니다. 설문 결과를 분석할 때 특정 연령대 응답이 0건이면 “전 연령에서 만족도가 높다”는 결론은 거짓이죠. 보고서를 검토할 때도 빠진 사례가 없는지부터 봐야 합니다. 그리고 “느리다·안 된다”를 막연히 두지 말고 어느 단계에서 그런지 숫자로 쪼개는 습관, 협업할 때 결과물만이 아니라 만드는 데 필요한 모든 것을 함께 건네는 습관 — 코드가 아니어도 똑같이 통합니다.
🚀 앞으로의 계획
이번에 챗봇의 첫 응답 지연(콜드 스타트)을 잡았더니, 더 큰 답답함 하나가 눈에 들어왔습니다. 바로 건강 리포트를 여는 속도예요. 리포트를 열 때마다 매번 처음부터 무거운 분석을 다시 돌리느라 무려 25초나 걸렸거든요. 다음 편에서는 이걸 어떻게 잡았는지 풀어볼게요. 핵심은 단순합니다 — 사용자가 리포트를 열기 전에 미리 만들어두는 것. 25초가 7밀리초로 줄어든 이야기, 다음 막에서 이어갑니다.
📋 재사용 가능한 프롬프트
프롬프트 1: 데이터 빈칸 점검
[내 모델/데이터]가 성능이 잘 나온다고 나오는데, 시험용 데이터에 빠진 구간이 없는지 확인해줘. 특정 등급이나 유형이 0건이면, 그 부분 평가는 의미가 없잖아.
프롬프트 2: 느린 지점 숫자로 찾기
[내 서비스]가 느린데 어디서 느린지 모르겠어. 단계마다 걸리는 시간을 재서, 진짜 병목이 어딘지 숫자로 짚어줘. 추측 말고 측정으로.
프롬프트 3: 협업용 자료 나누기
코드는 저장소에 있는데, 비밀 설정이나 무거운 파일 때문에 팀원이 받아도 안 돌아가. 어떤 걸 어떻게 따로 공유하면 되는지, 받는 사람이 한 번에 환경을 맞출 방법까지 정리해줘.
📌 「AI 헬스케어 파이널 프로젝트」 연재 15편입니다. 다음 막에서 또 이어집니다.