Skip to main content
이 문서는 대화형 노트북입니다. 로컬에서 실행하거나 다음 링크를 이용하세요.
적절한 구조와 문서, 테스트를 갖춘 고품질 코드를 생성하기란 쉽지 않습니다. 이 가이드는 LLM 기반 코드 생성 워크플로를 구축하고 그 품질을 체계적으로 측정하려는 개발자를 대상으로 합니다. 이 노트북에서는 Python 함수를 생성하고 이를 HumanEval 테스트 스위트로 평가하는 코드 생성 파이프라인을 만드는 방법을 알아봅니다. 이 파이프라인은 평가 비교와 추적에는 Weave를, 구조화된 출력 기반의 코드 생성에는 OpenAI의 GPT 모델을 사용합니다.
코드 생성 run을 비교하는 Weave 평가 대시보드

Weave를 사용하는 이유

이 튜토리얼에서는 Weave를 사용하여 코드 생성 파이프라인을 구현하고 평가합니다. 이 튜토리얼에서 배울 내용은 다음과 같습니다.
  • LLM 파이프라인 추적: 코드 생성 프로세스의 입력, 출력, 중간 단계를 로깅합니다.
  • LLM 출력 평가: 디버깅 도구와 시각화를 활용해 생성된 코드에 대한 평가를 만들고 비교합니다.

환경 설정

환경을 설정하고 필요한 라이브러리를 임포트하세요. 이러한 의존성은 파이프라인 전반에서 사용되는 서식 지정 도구, 데이터셋 로더, OpenAI 및 Weave 클라이언트를 제공합니다.
Weave는 입력, 출력, 메타데이터를 포함한 OpenAI API 호출을 자동으로 추적합니다. OpenAI와의 상호작용을 로깅하기 위해 별도의 코드를 추가할 필요가 없습니다. Weave가 백그라운드에서 모두 처리합니다.

구조화된 출력과 Pydantic 모델

이 코드 생성 파이프라인은 OpenAI의 구조화된 출력 모드와 Pydantic 모델을 사용하여 언어 모델에서 일관되고 형식이 잘 갖춰진 응답을 생성합니다. 이 방식에는 다음과 같은 이점이 있습니다.
  • 유형 안전성: 예상 출력에 맞는 Pydantic 모델을 정의하면 생성된 코드, 프로그램 러너, 단위 테스트에 엄격한 구조가 강제 적용됩니다.
  • 간편한 파싱: 구조화된 출력 모드는 모델의 응답을 사전 정의된 Pydantic 모델로 바로 파싱하므로 복잡한 후처리 작업이 줄어듭니다.
  • 안정성 향상: 원하는 형식을 정확히 지정하면 언어 모델이 예기치 않은 출력이나 잘못된 형식의 출력을 생성할 가능성이 줄어듭니다.
다음 예시에서는 Pydantic 모델을 정의하고 이를 OpenAI의 구조화된 출력과 함께 사용합니다.

코드 포매터 구현하기

일관되고 깔끔한 코드를 출력하려면 Weave 오퍼레이션을 사용해 CodeFormatter 클래스를 구현하세요. 이 포매터는 생성된 코드, 프로그램 러너, 단위 테스트에 린팅 및 스타일 규칙을 적용합니다.
이 CodeFormatter 클래스는 생성된 코드를 정리하고 포맷팅하는 여러 Weave 오퍼레이션을 제공합니다.
  • 이스케이프된 줄바꿈 문자를 실제 줄바꿈으로 바꿉니다.
  • 사용하지 않는 임포트와 변수를 제거합니다.
  • 임포트를 정렬합니다.
  • PEP 8 포맷팅을 적용합니다.
  • 누락된 임포트를 추가합니다.

CodeGenerationPipeline 정의하기

코드 생성 파이프라인 run의 Weave 트레이스
포매터가 준비되었으니, 이제 프롬프트, LLM Call, 포매터를 하나로 연결하는 핵심 코드 생성 로직을 구현합니다. 이 예제에서는 weave.Model을 사용하므로 모델이 변경될 때마다 버전이 자동으로 관리됩니다. model_name을 속성으로 두면 값을 바꿔 가며 실험하고 Weave에서 차이를 확인하고 비교할 수 있습니다. 함수 호출은 @weave.op으로 추적되며, 입력과 출력이 로깅되므로 오류 추적과 디버깅에 유용합니다.
이 CodeGenerationPipeline 클래스는 코드 생성 로직을 Weave Model로 캡슐화하며, 다음과 같은 이점을 제공합니다.
  • 자동 실험 추적: Weave는 모델의 각 run마다 입력, 출력, 매개변수를 캡처합니다.
  • 버전 관리: 모델의 속성이나 코드가 변경되면 자동으로 버전이 관리되므로, 코드 생성 파이프라인이 시간이 지남에 따라 어떻게 발전해 왔는지 이력으로 남습니다.
  • 재현성: 버전 관리와 추적 기능 덕분에 코드 생성 파이프라인의 이전 결과나 설정을 언제든지 재현할 수 있습니다.
  • 하이퍼파라미터 관리: 모델 속성(예: model_name)이 정의되고 여러 run에 걸쳐 추적되므로 실험을 더 쉽게 진행할 수 있습니다.
  • Weave 생태계와의 인테그레이션: weave.Model을 사용하면 파이프라인을 평가, 서빙 기능 등 다른 Weave 도구와 연결할 수 있습니다.

평가 메트릭 구현하기

생성된 코드의 품질을 평가하려면 weave.Scorer 서브클래스로 평가 메트릭을 구현하세요. 이 서브클래스는 데이터셋의 모든 model_output에 대해 score를 실행합니다. model_output은 weave.Model의 predict 함수가 반환한 출력이고, prompt는 human-eval 데이터셋에서 가져옵니다.
이 평가 함수들은 생성된 코드를 실행한 뒤, 코드가 데이터셋에서 제공한 테스트를 통과했는지를 나타내는 불리언 값을 반환합니다.
생성된 코드를 평가하는 HumanEval Scorer의 Weave 트레이스

Weave 데이터셋 생성 및 평가 실행

파이프라인과 Scorer를 정의했으니, 마지막 단계로 평가 데이터셋을 구성하고 전체 과정을 엔드 투 엔드로 실행합니다. 파이프라인을 평가하려면 다음과 같이 Weave 데이터셋을 생성하고 평가를 실행하세요.
이 코드는 샘플 프롬프트로 데이터셋을 생성하고, HumanEval 테스트 Scorer를 정의한 다음, 코드 생성 파이프라인을 평가합니다. 평가가 완료되면 Weights & Biases UI에서 결과를 확인하고 여러 run의 결과를 비교할 수 있습니다.
HumanEval Scorer 결과를 보여주는 Weave 평가 대시보드

결론

이 예제에서는 Weave와 OpenAI의 언어 모델을 사용하여 코드 생성 파이프라인을 구현하는 방법을 살펴보았습니다. 이 예제를 통해 다음 방법을 배웠습니다.
  • 코드 생성 프로세스의 각 단계에 대한 Weave 오퍼레이션을 생성합니다.
  • 파이프라인을 Weave Model로 래핑하여 추적과 평가를 간소화합니다.
  • Weave 오퍼레이션을 사용하여 맞춤형 평가 메트릭을 구현합니다.
  • 데이터셋을 생성하고 파이프라인 평가를 실행합니다.
Weave는 코드 생성 프로세스 전반에 걸쳐 입력, 출력, 중간 단계를 추적하므로 LLM 애플리케이션을 더 쉽게 디버그하고 최적화하고 평가할 수 있습니다. Weave와 Weave의 기능에 대한 자세한 내용은 Weave 문서를 참조하세요. 이 예제를 확장하여 더 큰 데이터셋을 처리하거나, 더 정교한 평가 메트릭을 구현하거나, 다른 LLM 워크플로와 통합할 수도 있습니다.
마지막 수정일 2026년 9월 30일