Codegen이 더 이상 사용되지 않는 Pandas API를 제안할 때 — 교훈적인 이야기

발행: (2025년 12월 31일 오후 08:48 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

How the deprecated API slipped into production

나는 작은 ETL을 스캐폴드하기 위해 코드‑생성 모델을 사용했으며, 이 ETL은 CSV 파일들을 정규화하여 표준 DataFrame으로 변환한다. 모델은 간결한 코드를 생성했고, 나는 타이핑을 줄이기 위해 이를 활용했다—예상되는 컬럼, 변환 단계, 그리고 관용적인 것으로 보이는 몇 개의 원‑라인 코드를 생성했다. 나는 심지어 생성된 스니펫을 우리 레포에 연결하고 기존 유닛 테스트를 실행했으며, 모두 통과했다.

빠른 반복을 위해 나는 crompt.ai 를 개발 어시스턴트로 사용했고, 그 출력물을 합리적인 시작점으로 신뢰했다. 문제는 CI 이미지에서 의존성을 올린 뒤에 시작되었다. 여러 파일을 집계하는 하위 작업이 특정 입력에 대해 잘못된 행 선택을 만들기 시작했다. 이 문제는 .ix 라는 폐기된 인덱서와 pandas 버전마다 동작이 달라진 제거된 헬퍼를 사용한 작은 생성 코드 조각으로 거슬러 올라갔다.

로컬에서는 오래된 고정 pandas 버전으로 테스트가 통과했지만, CI에서는 최신 pandas 구현이 선택 의미를 달라지게 하여 집계 키가 손상되었다.

Why the model suggested the old API

모델은 훈련된 코퍼스를 반영한다: 오래된 예제, Stack Overflow 스니펫, 블로그 포스트 등. 이번 경우 생성기는 인덱스‑선택 블록에서 .ix 를 사용하고 pandas 1.x에서 제거된 오래된 롤링 헬퍼를 제안했다. 코드는 간결하고 실행되었기 때문에 안전해 보였다. 빠른 디버깅 세션 동안 나는 모델과 채팅 인터페이스에서 대체 선택 전략을 만들었지만, API 폐기 여부나 버전 호환성에 대해 명시적으로 물어보지는 않았다.

모델의 제안은 인덱스‑선택 관용구를 포함했는데, 이는 인덱스 타입에 따라 위치‑기반 또는 라벨‑기반 선택을 반환할 수 있다. 이 모호함은 입력 파일에 정수형 라벨이 포함된 경우에만 간헐적인 잘못된 선택을 일으켰으며, 우리의 픽스처에서는 그런 경우를 다루지 않았다.

Why it was subtle and easy to miss

버그가 초기 리뷰를 통과한 데는 세 가지 겹치는 이유가 있다:

  1. Linters와 타입 체커는 심볼이 환경에 아직 존재하면 런타임 시 폐기된 사용을 표시하지 않는다.
  2. 유닛 테스트는 형태와 몇몇 값만 검증했으며, 혼합 인덱스 타입 아래에서의 선택 의미는 검증하지 않았다.
  3. Codegen은 API의 역사적 컨텍스트를 주석으로 달지 않는다: “pandas 0.20부터 폐기됨”이라고 명시적으로 물어보지 않으면 알려주지 않는다.

나중에 문서를 깊이 조사하면서 정확한 동작을 확인했을 때, 버전 노트에 호환성 문제가 명시돼 있었다. 이러한 작은 동작들이 합쳐져서: 모델이 간결하고 오래된 관용구를 선호 + 버전 메타데이터 누락 + 희박한 테스트 = 깨지기 쉬운 파이프라인이 된 것이다. 생성된 변경이 아주 작은 헬퍼 함수에만 영향을 미쳤기 때문에 리뷰어들은 위험이 낮다고 판단했고, 변경이 코드 리뷰를 통과했다.

Practical mitigations and lessons

  • 모델 출력은 권위 있는 코드가 아니라 수정 가능한 초안으로 취급한다.
  • CI 작업을 추가하여 지원되는 pandas 버전 매트릭스 전반에 걸쳐 테스트 스위트를 실행한다.
  • 테스트를 확장하여 서로 다른 인덱스 타입과 dtype을 노출시키는 엣지 케이스를 포함한다.
  • 생성된 코드를 받아들일 때, 명시적으로 물어보거나 (또는 찾아보고) 제안된 API가 폐기되었는지, 어떤 pandas 버전에서 동작이 바뀌었는지 확인한다.
  • 폐기된 심볼을 자동으로 검색하고, 의존성을 고정하며, 선택 의미를 검증하는 작은 통합 테스트를 작성한다; 이렇게 하면 대부분의 문제를 초기에 잡을 수 있다.

더 넓은 교훈: 생성된 코드는 일상 작업을 가속화하지만 (훈련 데이터 연령 vs. 런타임 환경) 생태계 불일치를 증폭시킨다. 검증과 목표 테스트가 가장 저렴한 방어선이다.

Back to Blog

관련 글

더 보기 »