진행 기간: 2026.05 (진행 중) AI 서비스 개발팀의 사내 LLM 워크플로 제품 Playground는 다양한 형식의 문서를 입력으로 받는다. 이 입력을 LLM이 다룰 수 있는 markdown으로 정규화하는 문서 파싱 서비스를 맡아 운영·개선했다. OCR 제품을 만드는 게 아니라, OCR을 활용해 문서를 markdown으로 변환하는 서비스다. - 스택...
진행 기간: 2026.05 ~ (진행 중)
AI 서비스 개발팀의 사내 LLM 워크플로 제품 Playground는 다양한 형식의 문서를 입력으로 받는다. 이 입력을 LLM이 다룰 수 있는 markdown으로 정규화하는 문서 파싱 서비스를 맡아 운영·개선했다. OCR 제품을 만드는 게 아니라, OCR을 활용해 문서를 markdown으로 변환하는 서비스다.
각 항목은 "무엇을 / 어떻게 바꿔 기여 / 결과" 순서로 정리했다.
문서 변환은 여러 워커에 나눠 처리한다. 작업이 어디에 얼마나 쌓이는지 정확히 봐야 "워커를 늘려야 하나"를 판단할 수 있어, 운영 그래프 화면(Grafana)에 작업 대기 현황 패널을 추가했다.
문서를 markdown으로 바꾸는 과정은 OCR 설정이나 라이브러리를 조금만 바꿔도 결과물이 달라지기 쉽다. 그래서 "바꾼 뒤에도 품질이 유지되는지, 혹은 더 좋아졌는지"를 자동으로 확인하는 검증 장치를 두 겹으로 쌓았다.
출력 검증(항목 5)을 운영에 영향 없이 돌리려면 운영과 똑같은 환경의 테스트 인스턴스가 필요하다.
문서 변환 워커의 실제 메모리 사용량(RSS)이 시간당 약 1.4GB씩 계속 늘어나는 문제가 있었다.
gc.collect()를 이미 부르고 있는데도 메모리가 안 줄었다. 진단해 보니 Python의 gc.collect()는 OS로 메모리를 돌려주는 동작이 아니고, 작은 메모리 조각들이 OS로 반환되지 않은 채 프로세스 메모리 영역에 흩어져 쌓이는(단편화) 것이 원인이었다.gc.collect() + OS 반환을 유도하는 malloc_trim) 흩어진 호출을 일괄 교체했다. 운영 중 즉시 끌 수 있게 환경변수로 토글 가능하게 뒀다.위 작업들을 빠르게 반복할 수 있었던 큰 이유는 Claude Code를 적극 활용하고, 자주 하는 작업을 재사용 가능한 skill로 만든 것이다.