개발 slecs

리뷰 루프 함수에 모델 선택 인자를 추가해 유연성 확보

목차

리뷰 루프의 rewrite_post 함수에 model 인자를 추가했다. 기본값은 여전히 Sonnet으로 유지했는데, 이 작은 변경이 생각보다 고민이 많이 들어간 결정이었다.

초기 설계의 한계

처음 코드를 짤 때는 마크다운 생성 로직이 특정 모델(Sonnet)에 고정되어 있었을 것 같다. 그건 초기 프로토타입으로는 충분했지만, 시간이 지나면서 여러 시나리오가 생겨났다.

  • 비용 최적화: 어떤 작업은 Haiku로 충분한데 Sonnet을 쓰는 게 낭비
  • 품질 실험: 특정 케이스에서는 Opus가 더 좋은 결과를 주는지 테스트하고 싶음
  • 토큰 비용 추적: 모델별로 호출을 분석할 때 어떤 모델이 얼마나 쓰였는지 알아야 함
  • 점진적 마이그레이션: 새 모델이 나왔을 때 일부 호출만 먼저 바꾸고 싶음

하드코딩된 모델로는 이런 시나리오들을 처리하기 어려웠다.

파라미터화 결정

그래서 rewrite_post(text, model="claude-3-5-sonnet-20241022")처럼 함수 시그니처를 확장했다. 핵심 선택지들:

선택지 장점 단점
필수 매개변수로 만들기 의도 명확, 실수 방지 기존 호출문 모두 수정 필요
선택 매개변수 (기본값 Sonnet) 기존 코드 동작 유지, 점진적 전환 명시성 약해짐
환경변수로 제어 배포 시 동적 변경 가능 함수 시그니처는 여전히 고정

선택 매개변수가 가장 실용적이었다.

기본값을 Sonnet으로 유지한 이유

여기가 가장 고민이 많이 들어간 부분이다.

호환성: 코드 리뷰를 하면서 기존 호출문 rewrite_post(some_text)가 깨지지 않아야 한다. 팀이 점진적으로 모델을 지정하도록 마이그레이션할 시간을 줄 수 있다.

예측 가능성: 누군가 명시하지 않은 호출을 봤을 때, "Sonnet을 쓴다"는 게 명확해진다. 모델 비용과 품질 프로파일이 일관된다.

테스트 안정성: CI/CD에서 돌리는 자동화된 리뷰가 있다면, 예측 가능한 모델이 중요하다.

만약 팀이 "기본은 Haiku로" 결정했다면, 기존 호출문들이 더 저렴해지겠지만 대신 품질 회귀 위험이 있다. 기본값은 "일반적으로 안전한 선택"이 되도록 했다.

def rewrite_post(text: str, model: str = "claude-3-5-sonnet-20241022") -> str:
    """
    포스트를 LLM으로 다시 작성.

    Args:
        text: 원본 마크다운 텍스트
        model: 사용할 Claude 모델 (기본: Sonnet)

    Returns:
        리뷰된 마크다운
    """
    # 실제 API 호출에서 model을 지정
    ...

이런 류 변경에서 놓치기 쉬운 것들

  • 문서화: 함수 docstring에 model 파라미터의 의미와 기본값을 명확히 적는 것
  • 타입 힌팅: IDE와 타입 체커가 호출자를 도와줄 수 있도록 model: str 정도는 당연
  • 마이그레이션 계획: "언제까지 기본값을 Sonnet으로 유지할 건가?" 팀과 공유
  • 테스트: 특정 모델이 지정됐을 때 올바르게 호출되는지 테스트

한 함수의 파라미터를 하나 추가하는 것처럼 보이지만, 실은 리뷰 루프 전체의 유연성을 높이는 결정이다. 하위호환성을 유지하면서도 향후 실험과 최적화의 문이 열린다.

이런 리팩터링들이 쌓이면, 나중에 "아, 이 부분 다른 모델로 바꾸면 더 좋겠다"는 요청이 와도 함수 시그니처 변경 없이 한두 줄만 수정하면 된다. 그게 설계 빚을 줄이는 방식이라고 본다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.