Work
비식별화 챗봇 단독 개발
로컬 LLM 기반 csv 비식별화 챗봇 시연 완료 · 워커홀릭 상. gpt-oss 20B + RAG + LangGraph + 정규표현식 도구 호출을 결합해 약 3개월 사실상 단독으로 개발·발표한 서울아산 의료AI 직무교육 팀 프로젝트.
환자 데이터를 외부 모델에 올리기 전 단계의 비식별화 흐름을 챗봇으로 설계
결과
서울아산병원 의료AI 보건의료인 직무교육 고급과정의 팀 프로젝트에서 CSV 비식별화 챗봇을 기획, 개발, 발표했다.
구성은 로컬 LLM(gpt-oss 20B), RAG, LangGraph, 정규표현식 기반 도구 호출이었다. CSV를 업로드하면 챗봇이 파일을 읽고, 데이터 요약을 알려주고, 비식별화 수준을 사용자와 협의한 뒤, 정규표현식 도구를 호출해 식별자 패턴을 처리하는 흐름이었다.
프로젝트는 5인 팀이었지만 실질적인 기획·개발·발표는 거의 단독으로 맡았다. 팀장으로 발표와 시연을 마쳤고, Cursor 사용 토큰 기준 전체 참여자 중 1위로 워커홀릭 상을 받았다.
핵심 구조
문제는 “LLM이 비식별화를 잘할 수 있는가”가 아니었다. 병원 실무에서 더 중요한 문제는 환자 데이터를 외부 파운데이션 모델에 그대로 올리기 어렵다는 점이었다.
그래서 챗봇의 위치를 바꿨다. LLM이 직접 비식별화 판단을 모두 수행하는 도구가 아니라, 온라인 모델에 올리기 전 단계에서 CSV를 안전하게 다루도록 돕는 인터페이스로 보았다.
흐름은 이렇게 잡았다.
- 사용자가 CSV를 업로드한다
- 챗봇이 파일 구조와 컬럼을 요약한다
- RAG가 보건의료정보 활용 가이드라인, 관련 법령, DRB 규정, HIPAA 맥락을 제공한다
- 사용자가 내부 연구용 또는 외부 배포용 수준을 고른다
- LangGraph가 단계 흐름을 관리하고, 정규표현식 도구가 이름, 나이, 주소 같은 패턴을 처리한다
핵심은 “LLM이 답을 낸다”보다 “LLM이 도구 사용과 사용자 협의를 조직한다”에 가까웠다.
구현 선택
모델은 gpt-oss 20B를 로컬에서 띄웠다. 보건의료 데이터 관련 질문에는 RAG를 붙였고, 실제 비식별화 처리는 정규표현식 도구 호출로 분리했다.
예를 들어 이름은 마스킹하고, 나이는 1의자리 반올림 또는 랜덤값으로 처리하고, 주소는 시군구 수준까지 남기는 식으로 처리 강도를 조절했다. 챗봇은 사용자가 원하는 수준을 묻고, 그 답변에 따라 다른 도구 흐름을 탔다.
개발은 Cursor를 사용했고, 서울아산 GPU 서버에 SSH로 붙어 환경을 만들었다. UI는 webui로 구성했고, 발표용 시연 영상까지 촬영했다. 팀원에게는 RAG에 넣을 PDF 수집과 더미 환자 데이터 준비를 부탁했다.
이 프로젝트의 의미
이전까지 쌓인 것들이 한 프로젝트 안에서 동시에 작동한 첫 사례였다. 비식별화 도메인 이해, Python 작업 습관, LLM 실험 경험, RAG와 LangGraph 학습, 병원 데이터의 제약에 대한 감각이 한 자리에 모였다.
특별히 정교한 완성품이라기보다, “환자 데이터를 외부 모델에 그대로 올릴 수 없다”는 명백한 갭에 도구를 정확히 맞춘 작업이었다. 의료기관 AI 도입에서 중요한 것은 새 모델의 성능만이 아니라, 그 모델이 어디에 붙을 수 있고 어디부터 사람이 책임져야 하는지 보는 일이라는 점을 확인했다.