소개
고 전적인 머신러닝과 생성형 AI 워크플로를 광범위하게 비교해 보면, 일반적인 워크플로 단계는 둘 다 비슷하다는 것을 알 수 있습니다. 둘 다 데이터 수집, 피처 엔지니어링, 모델 최적화, 배포, 평가 등을 필요로 하지만 실행 세부 정보와 시간 할당은 근본적으로 다릅니다. 가장 중요한 것은 생성형 AI는 제대로 관리하지 않으면 빠르게 누적될 수 있는 기술 부채의 고유한 원인을 야기한다는 것입니다. 여기에는 다음이 포함됩니다.
- 툴 스프롤 - 급증하는 에이전트 툴을 관리하고 선택하는 데 따르는 어려움
- 프롬프트 스터핑 - 유지 관리가 불가능해질 정도로 지나치게 복잡한 프롬프트
- 불투명한 파이프라인 - 적절한 추적 기능이 없어 디버깅이 어렵습니다
- 부적절한 피드백 시스템 - 인간의 피드백을 효과적으로 수집하고 활용하지 못함
- 이해관계자 참여 부족 - 최종 사용자와 정기적으로 소통하지 않음
이 블로그에서는 기술 부채의 각 형태를 차례로 살펴보겠습니다. 궁극적으로, 클래식 ML에서 생성형 AI로 전환하는 팀은 클래식 ML 프로젝트에서 주를 이루었던 데이터 정제 및 피처 엔지니어링보다는 평가, 이해관계자 관리, 주관적인 품질 모니터링, 계측에 더 많은 시간을 할애하여 새로운 부채 원인을 인식하고 그에 따라 개발 관행을 조정해야 합니다.
고전적 머신러닝(ML)과 생성형 인공지능(AI) 워크플로는 어떻게 다른가요?
이 분야가 현재 어느 수준에 있는지 이해하려면, 생성형 AI 워크플로를 고전적인 machine learning 문제에 사용하는 워크플로와 비교해 보는 것이 도움이 됩니다. 다음은 개략적인 개요입니다. 이 비교에서 알 수 있듯이 광범위한 워크플로 단계는 동일하게 유지되지만, 실행 세부 정보의 차이로 인해 강조되는 단계가 달라집니다. 앞으로 살펴보겠지만 생성형 AI는 새로운 형태의 기술 부채를 도입하기도 하며, 이는 프로덕션 환경에서 시스템을 유지 관리하는 방식에 영향을 미칩니다.
| 워크플로 단계 | 클래식 ML | 생성형 AI |
|---|
| 데이터 수집 | 수집된 데이터는 소매 판매 또는 장비 고장과 같은 현실 세계의 사건을 나타냅니다.
CSV 및 JSON과 같은 구조화된 형식은 자주 사용됩니다. | 수집된 데이터는 언어 모델이 관련성 있는 답변을 제공하는 데 도움이 되는 맥락적 지식을 나타냅니다.
정형 데이터(종종 실시간 테이블 형태)와 비정형 데이터(이미지, 동영상, 텍스트 파일)를 모두 사용할 수 있습니다. |
피처 엔지니어링/ 데이터 변환 | 데이터 변환 단계는 문제 공간을 더 잘 반영하기 위해 새로운 특성을 생성하거나(예: 타임스탬프 데이터에서 주중 및 주말 특성 생성) 모델이 데이터에 더 잘 맞도록 통계적 변환을 수행하는 것(예: k-평균 클러스터링을 위해 연속 변수를 표준화하고 편향된 데이터에 로그 변환을 적용하여 정규 분포를 따르게 하는 것)을 포함합니다. | 비정형 데이터의 경우 변환에는 청킹, 임베딩 표현 생성, (경우에 따라) 청크에 제목 및 태그와 같은 메타데이터 추가가 포함됩니다.
정형 데이터의 경우 대규모 언어 모델(LLM)이 테이블 조인을 고려할 필요가 없도록 테이블을 비정규화하는 작업이 포함될 수 있습니다. 테이블 및 열 메타데이터 설명을 추가하는 것도 중요합니다. |
| 모델 파이프라인 설계 | 보통 세 단계로 구성된 기본 파이프라인으로 처리됩니다. - 전처리 (표준화, 정규화, 원핫 인코딩과 같은 통계적 열 변환)
- 모델 예측(전처리된 데이터를 모델에 전달하여 출력을 생성하는 것)
- 후처리 (일반적으로 비즈니스 로직 필터인 추가 정보로 모델 출력 보강)
| 일반적으로 쿼리 재작성 단계, 일종의 정보 검색, 도구 호출 가능성, 그리고 마지막으로 안전 확인이 포함됩니다.
파이프라인은 훨씬 더 복잡하며, 데이터베이스 및 API 통합과 같은 더 복잡한 인프라를 포함하고, 때로는 그래프와 유사한 구조로 처리됩니다. |
| 모델 최적화 | 모델 최적화는 교차 검증, 그리드 검색, 무작위 검색과 같은 방법을 사용한 하이퍼파라미터 튜닝을 포함합니다. | temperature, top-k, top-p와 같은 일부 하이퍼파라미터는 변경될 수 있지만, 대부분의 노력은 모델 동작을 유도하기 위해 프롬프트를 조정하는 데 사용됩니다.
LLM 체인은 여러 단계를 포함할 수 있으므로 AI 엔지니어는 복잡한 작업을 더 작은 구성 요소로 분해하는 실험을 할 수도 있습니다. |
| 배포 | 모델은 LLM과 같은 파운데이션 모델보다 훨씬 작습니다. 전체 ML 애플리케이션은 GPU 없이도 CPU에서 호스팅할 수 있습니다.
모델 버전 관리, 모니터링, 리니지는 중요한 고려 사항입니다.
모델 예측은 복잡한 체인이나 그래프를 거의 필요로 하지 않으므로 트레이스는 일반적으로 사용되지 않습니다. | 파운데이션 모델은 매우 크기 때문에 중앙 GPU에서 호스팅되고 여러 사용자 대상 AI 애플리케이션에 API로 노출될 수 있습니다. 이러한 애플리케이션은 파운데이션 모델 API 주위에서 '래퍼' 역할을 하며 더 작은 CPU에서 호스팅됩니다.
애플리케이션 버전 관리, 모니터링, 리니지는 중요한 고려 사항입니다.
또한 LLM 체인과 그래프는 복잡할 수 있으므로 쿼리 병목 현상과 버그를 식별하려면 적절한 추적이 필요합니다. |
| 평가 | 모델 성능을 위해 데이터 사이언티스트는 분류용 F1 점수나 회귀용 평균 제곱근 오차와 같은 정의된 정량적 측정항목을 사용할 수 있습니다. | LLM 출력의 정확성은 요약이나 번역의 품질과 같은 주관적인 판단에 따라 달라집니다. 따라서 응답 품질은 일반적으로 정량적 측정항목보다는 가이드라인으로 판단됩니다. |
GenAI 프로젝트에서 머신 러닝 개발자는 시간을 어떻게 다르게 할애하고 있을까요?
가격 예측 프로젝트와 도구 호출 에이전트 구축 프로젝트를 동시에 진행해 본 결과, 모델 개발 및 배포 단계에 몇 가지 주요한 차이점이 있다는 것을 알게 되었습니다.
모델 개발 루프
내부 개발 루프는 일반적으로 machine learning 개발자가 모델 파이프라인을 구축하고 개선할 때 거치는 반복적인 프로세스를 의미합니다. 보통 프로덕션 테스트 및 모델 배포 전에 발생합니다.
기존 ML 및 GenAI 전문가는 이 단계에서 시간을 다음과 같이 다르게 사용합니다.
고전적인 ML 모델 개발의 시간 낭비 요인
- 데이터 수집 및 특징 미세 조정: 고전적인 머신러닝 프로젝트에서는 대부분의 시간을 특징과 입력 데이터를 반복적으로 미세 조정하는 데 사용합니다. Databricks 특징점과 같이 피처를 관리하고 공유하는 도구는 관련된 팀이 많거나 수동으로 쉽게 관리하기에는 피처가 너무 많은 경우에 사용됩니다.
반면에 평가는 간단합니다. 모델을 실행하여 정량적 측정항목이 개선되었는지 확인한 후, 더 나은 데이터 수집과 특징으로 모델을 어떻게 향상시킬 수 있을지 다시 고민하는 과정을 거칩니다. 예를 들어, 저희 가격 예측 모델의 경우, 저희 팀은 대부분의 예측 오류가 데이터 이상치를 고려하지 못했기 때문에 발생했다는 것을 발견했습니다. 그래서 저희는 모델이 이러한 패턴을 식별할 수 있도록 이러한 이상치를 나타내는 특징을 포함하는 방법을 고려해야 했습니다.
생성형 AI 모델 및 파이프라인 개발 시간 소모 요인
- 평가: 생성형 AI 프로젝트에서는 데이터 수집 및 변환과 평가 간의 상대적인 시간 할당이 뒤바뀝니다. 데이터 수집은 일반적으로 모델에 대한 충분한 컨텍스트를 수집하는 것을 포함하며, 이는 비정형 지식 베이스 문서나 매뉴얼 형태일 수 있습니다. 이 데이터는 광범위한 정리가 필요하지 않습니다. 하지만 평가는 훨씬 더 주관적이고 복잡하며, 결과적으로 더 많은 시간이 소요됩니다. 모델 파이프라인뿐만 아니라 평가 세트도 반복해야 합니다. 그리고 기존 ML보다 엣지 케이스를 처리하는 데 더 많은 시간이 소요됩니다.
예를 들어, 초기 10개의 평가 질문 세트가 사용자가 지원 봇에게 할 수 있는 질문의 전체 범위를 다루지 못할 수 있으며, 이 경우 더 많은 평가를 수집해야 합니다. 또는 설정한 LLM 심사위원이 너무 엄격하여 관련성 있는 답변이 테스트에 실패하지 않도록 프롬프트를 수정해야 할 수도 있습니다. MLflow의 평가 데이터 세트 는 항상 올바르게 작동해야 하는 예제의 '골든 세트'를 버전 관리, 개발 및 감사하는 데 유용합니다. - 이해관계자 관리: 또한 응답 품질은 최종 사용자의 입력에 따라 달라지므로 엔지니어는 비즈니스 최종 사용자 및 제품 관리자와 만나 요구 사항을 수집하고 우선순위를 정하며 사용자 피드백을 반복하는 데 훨씬 더 많은 시간을 할애합니다. 역사적으로 고전적 ML은 최종 사용자를 광범위하게 대면하지 않는 경우가 많았습니다(예: 시계열 예측) 또는 비기술 사용자에게 덜 노출되었기 때문에 생성형 AI의 제품 관리 요구 사항이 훨씬 더 높습니다. Databricks Apps 에서 호스팅되고 MLflow 피드백 API 를 호출하는 간단한 UI를 통해 응답 품질 피드백을 수집할 수 있습니다. 그런 다음 피드백을 MLflow 추적 및 MLflow 평가 데이터 세트에 추가하여 피드백과 모델 개선 간의 선순환을 만들 수 있습니다.
다음 다이어그램은 기존 ML과 생성형 AI의 모델 개발 루프 시간 할당을 비교합니다.
모델 배포 루프
모델 개발 루프와 달리 모델 배포 루프는 모델 성능 최적화에 중점을 두지 않습니다. 대신 엔지니어는 프로덕션 환경에서의 체계적인 테스트, 배포, 모니터링에 중점을 둡니다.
여기서 개발자는 프로젝트 업데이트를 더 쉽게 하기 위해 구성을 YAML 파일로 옮길 수 있습니다. 또한 Pandas 대신 PySpark와 같은 더 강력한 프레임워크를 사용하여 정적 데이터 처리 파이프라인을 스트리밍 방식으로 실행되도록 리팩터링할 수 있습니다. 마지막으로 모델 품질을 유지하기 위해 테스트, 모니터링, 피드백 프로세스를 설정하는 방법을 고려해야 합니다.
이 시점에서는 자동화가 필수적이며, 지속적인 통합 및 제공은 필수 요구 사항입니다. Databricks에서 데이터 및 AI 프로젝트를 위한 CI/CD를 관리하는 데는 Databricks Asset Bundles 가 일반적으로 선택되는 도구입니다. 이를 통해 Databricks 리소스(예: 작업 및 파이프라인)를 소스 파일로 기 술하고, 프로젝트의 소스 파일과 함께 메타데이터를 포함할 수 있습니다.
모델 개발 단계에서와 마찬가지로, 이 단계에서 생성형 AI 프로젝트와 기존 ML 프로젝트 간에 가장 많은 시간이 소요되는 활동은 동일하지 않습니다.
기존 ML 모델 배포 시간 소모 요인
- 리팩터링: 기존 machine learning 프로젝트에서 노트북 코드는 상당히 지저분할 수 있습니다. 다양한 데이터 세트, 피처, 모델 조합을 지속적으로 테스트하고, 폐기하고, 재결합합니다. 결과적으로 노트북 코드를 더 견고하게 만들기 위해 리팩터링하는 데 상당한 노력을 기울여야 할 수 있습니다. 정해진 코드 리포지토리 폴더 구조(예: Databricks 자산 Bundles MLOps Stacks 템플릿)가 있으면 이 리팩터링 프로세스에 필요한 스캐폴딩을 제공할 수 있습니다.
리팩터링 활동의 몇 가지 예는 다음과 같습니다.- 헬퍼 코드를 함수로 추상화하기
- 유틸리티 함수를 여러 번 가져와서 재사용할 수 있도록 헬퍼 라이브러리 생성하기
- 노트북에서 YAML 파일로 구성 옮기기
- 더 빠르고 효율적으로 실행되는 더 효율적인 코드를 구현하기(예: 중첩된
for 루프 제거)
- 품질 모니터링: 데이터 오류는 다양한 형태로 나타날 수 있고 감지하기 어려워서 품질 모니터링은 시간을 많이 소모하는 또 다른 작업입니다. 특히 Shreya Shankar 등이 “Operationalizing Machine Learning: An Interview Study” 논문에서 언급했듯이, “데이터 포인트에 있는 몇 개의 null 값 특성과 같은 소프트 오류는 덜 해롭고 여전히 합리적인 예측을 생성할 수 있으므로 감지하고 정량화하기 어렵습니다.” 게다가 다양한 유형의 오류에는 각기 다른 대응이 필요하며, 적절한 대응을 결정하는 것이 항상 쉬운 것은 아닙니다.
또 다른 과제는 다양한 유형의 모델 드리프트(피처 드리프트, 데이터 드리프트, 레이블 드리프트 등)를 다양한 시간 단위(일별, 주별, 월별)에 걸쳐 측정해야 하므로 복잡성이 가중된다는 점입니다. 프로세스를 더 쉽게 만들기 위해 개발자는 Databricks Data Quality 모니터링 을 사용하여 전체적인 프레임워크 내에서 모델 품질 메트릭, 입력 데이터 품질, 모델 입력 및 예측의 잠재적 드리프트를 추적할 수 있습니다.
생성형 AI 모델 배포 시 시간이 많이 소요되는 부분
- 품질 모니터링: 생성형 AI의 경우 모니터링에도 상당한 시간이 소요되지만 그 이유는 다릅니다.
- 실시간 요구사항: 고객 이탈 예측, 가격 예측 또는 환자 재입원과 같은 작업을 위한 기존의 머신러닝 프로젝트는 하루, 일주일 또는 한 달에 한 번씩 실행되는 배치 모드로 예측을 제공할 수 있습니다. 하지만 많은 생성형 AI 프로젝트는 가상 지원 에이전트, 실시간 스크립트 작성 에이전트 또는 코딩 에이전트와 같은 실시간 애플리케이션입니다. 결과적으로 실시간 모니터링 도구를 구성해야 하며, 이는 실시간 endpoint 모니터링, 실시간 추론 분석 파이프라인, 실시간 알림을 의미합니다.
Databricks AI Gateway와 같은 API 게이트웨이를 설정하여 LLM API에 대한 가드레일 검사를 수행하면 안전 및 데이터 개인정보 보호 요구사항을 지원할 수 있습니다. 이는 오프라인 프로세스로 수행되는 기존 모델 모니터링과는 다른 접근 방식입니다. - 주관적인 평가: 앞서 언급했듯이 생성형 AI 애플리케이션에 대한 평가는 주관적입니다. 모델 배포 엔지니어는 추론 파이프라인에서 주관적인 피드백 수집을 운영하는 방법을 고려해야 합니다. 이는 모델 응답에 대해 실행되는 LLM 심사관 평가의 형태를 띠거나, 모델 응답의 일부를 선택하여 도메인 전문가에게 평가를 의뢰하는 형태일 수 있습니다. 독점 모델 제공업체는 시간이 지남에 따라 모델을 최적화하므로 이들의 “모델”은 실제로는 성능 저하가 발생하기 쉬운 서비스이며, 평가 기준은 자체 학습 모델에서처럼 모델 가중치가 고정되어 있지 않다는 사실을 고려해야 합니다.
자유 형식의 피드백과 주관적인 평가를 제공하는 기능이 가장 중요해집니다. Databricks Apps 및 MLflow Feedback API 와 같은 프레임워크는 이러한 피드백을 수집하여 특정 LLM 호출과 다시 연결할 수 있는 더 간단한 사용자 인터페이스를 지원합니다.
- 테스트: 생성형 AI 애플리케이션에서는 몇 가지 이유로 테스트에 시간이 더 많이 소요되는 경우가 많습니다.
- 아직 해결되지 않은 과제: 생성형 AI 애 플리케이션 자체는 점점 더 복잡해지고 있지만, 평가 및 테스트 프레임워크는 아직 이를 따라잡지 못하고 있습니다. 테스트를 어렵게 만드는 몇 가지 시나리오는 다음과 같습니다.
- 여러 턴으로 이루어진 긴 대화
- 기업의 조직적 맥락에 대한 중요한 세부 정보를 포착할 수도 있고 그렇지 않을 수도 있는 SQL 출력
- 체인에서 올바른 도구 사용을 관리하기
- 애플리케이션에서 여러 에이전트 평가하기
이러한 복잡성을 처리하는 첫 번째 단계는 일반적으로 에이전트 출력의 추적(도구 호출, 추론, 최종 응답의 실행 기록)을 가능한 한 정확하게 캡처하는 것입니다. 자동 추적 캡처와 수동 계측을 조합하면 에이전트 상호작용의 전체 범위를 포괄하는 데 필요한 유연성을 확보할 수 있습니다. 예를 들어 MLflow Traces trace 데코레이터 는 모든 함수에 사용하여 입력과 출력을 캡처할 수 있습니다. 동시에 특정 코드 블록 내에 사용자 지정 MLflow Traces 스팬을 생성하여 더 세분화된 작업을 기록할 수 있습니다. 계측을 사용하여 에이전트 출력에서 신뢰할 수 있는 진실의 원천을 집계한 후에야 개발자는 실패 모드를 식별하고 그에 따라 테스트를 설계할 수 있습니다.
- 사람의 피드백 통합: 품질을 평가할 때 이러한 입력을 통합하는 것이 중요합니다. 그러나 일부 활동은 시간이 많이 소요됩니다. 예를 들어, 다음과 같은 접근 방식이 있습니다.
- 주석 작성자가 따를 가이드라인으로 루브릭 설계하기
- 다양한 시나리오에 대해 다양한 측정항목과 평가 기준을 설계합니다(예: 출력이 안전한지 또는 유용한지).
에이전트가 어떻게 응답해야 하는지에 대한 공유된 평가 기준을 만들기 위해서는 보통 오프라인 토론 및 워크숍이 필요합니다. 인간 주석가의 의견이 일치된 후에야 MLflow의 make_judge API 또는 SIMBAAlignmentOptimizer와 같은 함수를 사용하여 그 평가를 LLM 기반 판정기에 안정적으로 통합할 수 있습니다.
AI 기술 부채
기술 부채는 개발자가 장기적인 유지 관리성을 희생하면서 임시방편의 솔루션을 구현할 때 쌓입니다.
기존 ML 기술 부채
Dan Sculley 등은 이러한 시스템이 축적할 수 있는 기술 부채의 유형에 대한 훌륭한 요약을 제공했습니다. 그들은 논문 '머신러닝: 기술 부채의 고금리 신용카드' 에서 이를 세 가지 광범위한 영역으로 나눕니다.
- 데이터 부채 문서화가 제대로 되어 있지 않거나, 설명되지 않거나, 조용히 변경되는 데이터 종속성
- 시스템 수준 부채 광범위한 글루 코드, 파이프라인 '정글', '데드' 하드코딩된 경로
- 외부 변경 사항 수정된 임계값(예: 정밀도-재현율 임계값) 또는 이전에 중요했던 상관관계 제거
생성형 AI는 새로운 형태의 기술 부채를 야기하며, 그중 다수는 명확하게 드러나지 않을 수 있습니다. 이 섹션에서는 이러한 숨겨진 기술 부채의 원인을 살펴봅니다.