들어가며

가상 면접 사례로 배우는 생성형 AI 서비스 설계 책을 읽고, 1장 '생성형 AI 개요'에서 이해한 내용을 정리했습니다.

앞선 글 생성형 AI 개요에서는 생성형 AI가 무엇인지 정리했습니다. 이번 글은 그것으로 시스템을 어떻게 설계하는지에 대한 내용입니다.


1. 생성형 AI

생성형 AI 시스템을 구축하고 배포하는 과정은 단순히 모델을 학습시키는 것이 아닙니다. 모델은 전체 시스템의 일부이고, 다음과 같은 것들이 함께 있어야 합니다.

  1. 대규모 데이터셋을 다루고 전처리할 수 있는 데이터 파이프라인
  2. 생성된 결과가 쓸 만한지 판단할 수 있는 평가 메커니즘
  3. 생성형 콘텐츠를 대규모로 제공할 수 있는 인프라
  4. 일관된 성능을 유지하기 위한 모니터링

설계에 접근할 때 가장 중요한 것은 세 가지입니다. 문제에 접근하는 방식, 생성형 AI 개념에 대한 이해, 그리고 시스템을 그렇게 설계한 이유입니다.

설계에는 정답이 하나가 아니라서, 무엇을 골랐는지보다 왜 골랐고 무엇을 포기했는지를 말할 수 있어야 합니다.

2. 구조화된 프레임워크

생성형 AI 시스템 설계에서의 구조화된 프레임워크는 아래와 같습니다.

  1. 요구사항 구체화
  2. 머신러닝 관점으로 문제 정의
  3. 데이터 준비
  4. 모델 개발
  5. 평가
  6. 전체 머신러닝 시스템 설계
  7. 배포 및 모니터링

순서대로 한 번 하고 끝나지는 않습니다. 평가에서 성능이 안 나오면 데이터 준비로 돌아가고, 배포 후 지연시간이 문제가 되면 모델 개발로 돌아갑니다.

2-1 요구사항 구체화

특정 작업을 해결하는 머신러닝 시스템을 개발할 때 먼저 해야할 일은 요구사항을 명확히 하는 것입니다. 요구사항의 경우는 두가지로 나뉠 수 있습니다.

  1. FR(기능적 요구사항)
  2. NFR(비기능적 요구사항)

기능적 요구사항

기능적 요구사항은 시스템의 핵심 기능을 의미합니다. 시스템의 필수 요소와 기능의 개발 방향을 나타냅니다.

시스템이 무엇을 하는가입니다. "사용자가 문서를 올리면 핵심 내용을 요약해 돌려준다"처럼 있고 없고를 따질 수 있는 동작으로 씁니다.

비기능적 요구사항

비기능적 요구사항은 시스템이 얼마나 잘 작동하는지에 집중합니다. 같은 기능이라도 응답 속도, 처리량, 확장성, 비용, 안정성, 보안 같은 조건이 달라지면 설계가 완전히 달라집니다.

앞의 예를 이어보면 "요약은 3초 안에 돌아와야 하고, 동시 접속 1,000명을 견뎌야 하며, 요청당 비용은 얼마 이하여야 한다"가 비기능적 요구사항입니다.

비기능적 요구사항은 설계 초반에 눈에 잘 띄지 않지만, 시스템 개선처럼 설계의 후반 단계에서 큰 영향을 미칩니다. 그래서 당장 정하지 않더라도 미리 인지하고 이해해두는 것이 중요합니다.

특히 생성형 AI에서는 품질, 지연시간, 비용이 서로 맞물려 있습니다. 더 큰 모델을 쓰면 품질은 오르지만 느려지고 비싸집니다. 이 셋 중 무엇을 먼저 볼지 정해야 합니다.

위 요구사항들은 주로 아래의 질문을 참고해 시작해 볼 수 있습니다.

  1. 비즈니스 목표 : 이 시스템의 주요한 목표는 무엇인가, 운영하는 구체적인 목적이 무엇인가?
  2. 시스템 기능 : 시스템이 지원해야하는 기능은 무엇인가?
  3. 데이터 : 데이터의 출처는 어디인가? 데이터 세트의 규모는? 데이터는 레이블링이 되어 있는가?
  4. 제약 조건 : 사용 가능한 연산 자원은 어느정도인가? 시스템은 클라우드나 디바이스 중 어디에서 동작하는가?
  5. 시스템 규모 : 시스템 사용자 규모는 어느정도로 예상하는가?
  6. 성능 : 콘텐츠 생성 속도는? 실시간 생성을 지원해야하는가? 품질과 생성 속도 중 어느쪽에 우선순위가 있는가?

2-2 머신러닝 관점으로 문제 정의하기

AI를 이용한 서비스를 만들 때 단순히 AI를 사용해서 요약하는 동작을 만들겠다라고 답할 수 없습니다. AI 기술이 그 문제를 해결 할 수 있도록 문제를 정의해야합니다.

문제를 해결하기 위해서 가장 먼저 머신러닝이 반드시 필요한지 판단해야 합니다. 다음 조건에 하나라도 해당하지 않는다면 규칙 기반으로 푸는 편이 더 쌉니다.

  • 규칙으로 일일이 적기 어려울 만큼 패턴이 복잡한가
  • 그 패턴을 담고 있는 데이터가 충분한가
  • 가끔 틀려도 괜찮은 문제인가

세 번째가 특히 중요합니다. 머신러닝은 확률적으로 답하기 때문에, 반드시 정확해야 하는 계산에는 맞지 않습니다.

머신러닝 관점으로 문제를 정의할 때 유용한 두 단계는 다음과 같습니다.

  1. 시스템의 입력과 출력으로 구체화하기

    문제를 정의하려면 가장 먼저 시스템의 입력과 출력을 정의해야합니다. 이는 입력 데이터의 형태와 기대하는 출력이 무엇인지 확인하는 과정입니다.

    여기를 두루뭉술하게 두면 뒤의 단계가 계속 흔들립니다. "문서를 요약한다"보다 "PDF 한 건을 받아 300자 이내의 한국어 요약문 하나를 돌려준다"처럼 적어야 평가 기준도 같이 정해집니다.

  2. 적절한 머신러닝 방식 선택하기

    시스템의 입력과 출력을 정의한 다음에는 가장 적합한 머신러닝 방식을 선택해야합니다. 이는 구체적인 요구사항에 부합하는 알고리즘을 선택하는 일입니다. 선택할 수 있는 수많은 머신러닝 알고리즘이 있고 각기 다른 장단점이 있습니다. 이들을 비교하고 절충안을 논의하여 작업에 가장 잘 맞는 알고리즘을 선택하는 것이 중요합니다.

    1. 판별형 vs 생성형

      새로운 콘텐츠를 만들어야 하는지, 아니면 분류하거나 점수를 매기면 되는지를 먼저 가릅니다. 생성이 필요 없는 문제에 생성형 모델을 쓰면 비용만 커집니다.

    2. 작업 유형 확인하기

      입력과 출력의 형태로 작업을 분류합니다. 텍스트에서 텍스트, 텍스트에서 이미지, 이미지에서 텍스트처럼 나누면 후보 모델군이 좁혀집니다.

    3. 적절한 알고리즘 선택하기

      좁혀진 후보 중에서 요구사항에 맞는 것을 고릅니다. 이때 품질만 보지 않고 앞서 정한 지연시간과 비용 조건을 함께 놓고 비교합니다.

2-3 데이터 준비

머신러닝 모델은 데이터로 학습하기 때문에 고품질의 데이터가 중요합니다. 이제 다양한 데이터의 종류와 머신러닝을 위한 데이터 준비 시 필수적인 고려 사항에 대해 알아보겠습니다.

데이터 종류

머신러닝에서 데이터는 흔히 정형과 비정형 두 종류로 나뉩니다.

  1. 정형데이터 : 행과 열로 구성된 표로 정리 가능
    1. 범주형 : 값에 순서가 없는 분류 (지역, 성별)
    2. 수치형 : 크기를 재는 숫자 (가격, 나이)
    3. 순서형 : 순서가 있는 범주 (별점, 등급). 범주형의 한 갈래지만 순서를 쓸 수 있어 따로 둡니다.
  2. 비정형데이터 : 내제된 데이터 형식이나 구조가 없는 데이터
    1. 비디오, 이미지, 텍스트, 오디오 등

생성형 AI가 다루는 것은 대부분 비정형 데이터입니다. 그래서 아래 두 준비 방법이 갈립니다.

전통적인 머신러닝의 데이터 준비 방법

전통적인 모델 학습에서는 주로 정형 데이터를 다룹니다. 데이터 준비는 보통 다음 두 단계를 포함합니다.

  1. 데이터 엔지니어링

    데이터를 수집, 저장, 검색, 처리하는 시스템을 구축하고 운영하는 것을 의미합니다. 이 시스템의 핵심 요소는 ETL입니다. ETL은 다양한 원천으로부터 데이터를 추출하고 사용 가능한 형태로 변환한 뒤 데이터 웨어하우스 또는 다른 저장 시스템에 적재하는 과정을 뜻합니다.

  2. 피처 엔지니어링

    원시 데이터에서 예측 가능한 특성을 선택하고 추출한 뒤 머신러닝 모델에서 사용할 수 있는 형태로 변환하는 것을 의미합니다.

생성형 AI 시스템의 데이터 준비 방법

생성형 모델에 사용할 비정형 데이터를 준비할 때는 피처 엔지니어링이 아니라 방대한 양의 데이터 수집, 데이터의 높은 품질과 안정성 확보, 그리고 대규모 데이터를 효율적으로 저장하고 검색할 수 있는 도구 활용에 집중합니다.

피처 엔지니어링이 빠지는 이유는 어떤 특성을 볼지 사람이 고르는 대신 모델이 원시 데이터에서 직접 표현을 학습하기 때문입니다. 대신 데이터의 양과 품질을 관리하는 일이 늘어납니다.

데이터 준비를 위한 핵심 단계는 다음과 같습니다.

  1. 데이터 수집

    규모가 큰 모델이 복잡한 패턴을 익히기 위해서는 방대한 양의 학습 데이터가 필요합니다. 데이터 수집 과정에서는 다양한 출처로부터 텍스트를 긁어와 대규모 데이터 세트를 만듭니다.

    모델이 커질수록 AI로 생성한 콘텐츠를 활용해 학습 데이터를 보강하는 경향이 있습니다. 이런 합성 데이터 사용시 장점으로는 데이터 다양성 향상, 확장성이 있지만 단점으로 품질 우려, 표현 문제, 실세계 분포와의 차이가 있을 수 있습니다.

    합성 데이터의 비중이 커지면 모델이 자기 출력으로 다시 학습하면서 분포가 점점 좁아지는 문제도 알려져 있습니다. 그래서 무작정 늘릴 수는 없습니다.

  2. 데이터 정제

    인터넷에서 수집한 데이터는 대개 노이즈가 많아서 품질이 낮거나 적절하지 않은 콘텐츠를 포함할 수 있습니다. 모델의 성능에 영향을 미칠 수 있는 잘못된 정보나 유해한 내용을 피하기 위해 데이터를 정제해야합니다. 또한, 데이터가 대표성을 갖는 것도 중요하기에 중복된 콘텐츠를 제거하고 데이터의 다양성과 균형을 확보해야합니다.

    여기에 두 가지를 더 챙겨야 합니다. 하나는 개인정보 제거이고, 다른 하나는 평가용 데이터가 학습 데이터에 섞여 들어가지 않게 하는 것입니다. 후자가 섞이면 평가 점수만 올라가고 실제 성능은 그대로입니다.

  3. 데이터 효율성 확보

    대규모 데이터 세트를 관리할 때 저장, 검색 등을 위한 효율적인 도구와 기술이 필요합니다.

    1. 효율적인 저장 공간
    2. 효율적인 검색

      샤딩, 인덱싱, 사전 로딩 또는 캐싱

2-4 모델 개발

모델 개발은 아주 중요한 단계입니다. 적절한 구조를 선정하고, 모델을 학습하고, 학습한 모델로 새로운 데이터를 생성하는 과정을 포함합니다.

모델 구조

머신러닝 알고리즘마다 활용 가능한 구조가 몇가지 있습니다. 다양한 구조를 선택지로 제시하고 각각의 장단점을 비교하는 것이 중요합니다.

구조를 정했다면 세부적인 계층을 분석하고 입력이 출력으로 변환되는 과정을 알아보는 것이 좋습니다.

  1. 트랜스포머의 셀프 어텐션 구조

    입력의 각 토큰이 같은 입력 안의 다른 토큰들을 얼마나 참고할지 계산합니다. 순서대로 처리하지 않아도 되어서 병렬 학습이 가능합니다. 모델을 크게 키울 수 있게 된 것도 이 덕분입니다.

  2. 멀티 헤드 어텐션

    어텐션을 여러 갈래로 나눠 동시에 수행합니다. 갈래마다 다른 관계를 보게 되어, 한 번에 하나의 관계만 보는 것보다 풍부한 표현을 얻습니다.

모델 학습

모델 학습은 원하는 출력을 만들어 내기 위해 모델의 매개변수를 조정하는 과정입니다. 주요 논의사항은 다음과 같습니다.

  1. 학습 방법론

    모델의 학습은 각 모델의 구조와 학습 목적에 맞는 방식으로 이루어집니다. 또한, 많은 모델이 더 나은 성능에 도달하기 위해 여러 단계의 학습을 거칩니다. 다양한 생성형 AI 애플리케이션을 위한 학습 방법론에 대해 깊이 있게 이해하고 있어야 합니다.

    언어 모델을 예로 들면 보통 세 단계를 거칩니다. 대규모 원시 데이터로 다음 토큰을 맞추는 사전 학습, 지시와 모범 답변 쌍으로 형식을 익히는 지도 미세조정, 그리고 사람의 선호에 맞추는 정렬 단계입니다. 단계마다 쓰는 데이터도 목적도 다릅니다.

  2. 학습 데이터

    사용되는 데이터는 생성형 AI 애플리케이션의 종류에 따라 다르고, 단계별 학습 방식에 따라서도 다릅니다. 데이터가 어떻게 수집되었는지, 왜 모델의 학습에 유용한지, 효과적인 학습을 위해 규모는 어느정도가 좋을지 등 데이터 세트에 대한 논의도 중요합니다.

  3. 머신러닝의 목표와 손실함수

    머신러닝의 목표는 학습 과정에서 머신러닝 과제가 달성해야 할 바를 의미합니다. 손실함수는 모델의 예측이 원하는 결과와 얼마나 일치하는지를 측정하며, 손실값을 최소화하는 것을 목표로 하는 최적화 과정을 유도합니다. 손실 함수는 예측 오류를 정량화하고 최적화 알고리즘이 모델의 매개변수를 조정하여 성능을 개선할 수 있도록 하기 때문에 중요합니다.

    다만 손실 함수가 우리가 원하는 것을 그대로 담지는 못합니다. 손실이 낮아도 사람이 보기에 좋은 답이 아닐 수 있습니다. 뒤에 평가 단계가 따로 있는 이유입니다.

  4. 작업별 도전 과제와 해결방안

    작업마다 고유한 도전과제가 있고 특정한 해결 방안이 필요합니다. 대규모 모델에 사용할 수 있는 대표적인 기법은 아래와 같습니다.

    1. 기울기 체크 포인트

      중간 계산값을 전부 들고 있지 않고 필요할 때 다시 계산합니다. 메모리를 아끼는 대신 연산 시간이 늘어납니다.

    2. 혼합 정밀도 학습

      일부 연산을 낮은 정밀도로 수행해 메모리와 속도를 함께 얻습니다.

    3. 분산 학습

      여러 장비에 학습을 나눠 수행합니다.

    4. 병렬화 기법
      1. 데이터 병렬화

        같은 모델을 여러 장치에 복제하고 데이터를 나눠 처리합니다. 모델 하나가 장치 하나에 올라갈 때 쓸 수 있습니다.

        1. 동기
        2. 비동기
      2. 모델 병렬화

        모델 하나가 장치 하나에 안 들어갈 때, 모델 자체를 쪼개 나눠 올립니다.

        1. 파이프라인 병렬화
        2. 텐서 병렬화
      3. 하이브리드 병렬화

        위 방식을 함께 씁니다. 실제 대규모 학습은 대부분 여기에 해당합니다.

모델 샘플링

모델을 학습했다면 그 다음은 샘플링 단계입니다. 샘플링은 학습된 생성형 모델을 통해 새로운 데이터나 출력값을 만들어내는 과정입니다. 생성형 AI 애플리케이션 마다 다양한 샘플링 기법들이 있는데 탐욕검색, 빔검색, Top-k 샘플링 등이 있습니다.

같은 모델이라도 샘플링 방법에 따라 결과가 크게 달라집니다.

  1. 탐욕 검색

    매번 확률이 가장 높은 토큰을 고릅니다. 빠르고 안정적이지만 문장이 단조로워지고 같은 말을 반복하기 쉽습니다.

  2. 빔 검색

    여러 후보 경로를 동시에 유지하며 전체 확률이 높은 것을 고릅니다. 번역처럼 정답이 거의 정해진 작업에 맞습니다. 자유로운 생성에서는 무난한 문장만 나옵니다.

  3. Top-k 샘플링

    확률 상위 k개 중에서 뽑습니다. 무작위성이 들어가 표현이 다양해집니다.

  4. Top-p(뉴클리어스) 샘플링

    개수 대신 누적 확률 p까지의 후보 중에서 뽑습니다. 상황에 따라 후보 수가 달라져 Top-k보다 유연합니다.

여기에 온도를 함께 조절합니다. 낮추면 확률이 높은 쪽으로 쏠려 보수적이 되고, 높이면 분포가 평평해져 다양해집니다.

2-5 평가

모델을 개발 한 후 다음으로 중요한 단계는 평가입니다. 머신러닝 모델의 성능을 평가하기 위해서 다양한 지표를 사용하는데 크게 오프라인 평가와 온라인 평가를 알아보겠습니다.

오프라인 평가

오프라인 평가는 모델이나 시스템을 실시간 환경에 배포하지 않고 사전에 수집된 데이터를 활용해 성능을 평가하는 과정입니다. 이 방법은 사용자가 모델을 사용하기 전에 그 효과를 확인할 수 있어 중요합니다.

판별형 모델의 경우는 평가 세트에 대해 예측하는 것이므로 예측한 것과 정답을 비교하여 평가하는 정량적 평가가 가능하지만 생성형 모델의 경우에서는 복잡합니다.

고정된 정답과 예측한 내용을 비교하는 것이 아니라, 텍스트나 이미지 같은 새로운 콘텐츠를 만들어 내기 때문입니다. 이러한 콘텐츠가 사람의 기대치나 벤치마크와 잘 맞는지 평가할 때는 주관적 판단이나 사람의 피드백을 포함하는 방법이 필요합니다.

실제로는 여러 방법을 섞어서 씁니다.

  • 자동 지표 : 빠르고 비용이 적게 들지만, 좋은 답을 낮게 매기는 경우가 많습니다.
  • 모델을 심판으로 쓰는 평가 : 다른 모델에게 두 출력 중 무엇이 나은지 묻습니다. 사람보다 싸고 빠르지만 심판 모델이 가진 편향이 그대로 반영됩니다.
  • 사람 평가 : 가장 믿을 만하지만 느리고 비쌉니다. 그래서 전체가 아니라 표본에만 적용합니다.

어느 하나로 결론 내기 어려워서 자동 지표로 먼저 거르고 사람 평가로 확인합니다.

온라인 평가

온라인 평가는 모델의 성능을 실제 운영 환경(배포)에서 평가합니다. 모델의 효과를 평가하기 위해 비즈니스 목적에 맞는 다양한 지표들이 사용됩니다.

오프라인에서 좋았던 모델이 실제 사용자에게는 그렇지 않은 경우가 자주 생깁니다. 그래서 일부 사용자에게만 새 모델을 노출해 비교하는 A/B 테스트로, 재생성 요청 비율이나 이탈률 같은 실제 행동 지표를 확인합니다. 7725712D-F4D0-44C0-B0C4-3CD2DE164366.png

2-6 전체 머신러닝 시스템 설계

여러 파이프라인과 구성 요소가 모두 함께 동작해야합니다. 전체적으로 확인하기 위한 구성요소는 아래와 같습니다.

  1. 시스템 구성 요소

    각 파이프라인이 어떻게 연결되는지, 데이터가 어디서 들어와 어디로 나가는지를 그림으로 그려봅니다.

  2. 안전성 메커니즘

    유해하거나 부적절한 출력을 걸러냅니다. 입력과 출력 양쪽에 두는 것이 보통입니다.

  3. 사용자 피드백과 지속적인 학습

    사용자의 반응을 모아 다음 학습에 다시 씁니다.

  4. 확장성

    사용자가 늘어도 견딜 수 있는지 봅니다. 생성형 AI는 요청당 연산량이 커서 여기서 비용 문제가 바로 드러납니다.

  5. 편향

    학습 데이터에 있던 편향이 출력에 그대로 나타날 수 있어 미리 점검합니다.

  6. 강건성과 보안

    예상 못 한 입력에도 무너지지 않아야 하고, 프롬프트 주입처럼 의도적으로 시스템을 흔드는 시도에도 대응해야 합니다.

2-7 배포 및 모니터링

마지막 단계는 시스템을 배포하고 수백만 명의 사용자에게 기능을 제공하는것입니다. 시스템을 배포하고 나면 수많은 이유로 오류가 발생할 수 있습니다. 모니터링은 시스템 오류 발생을 탐지하고 가능한 빨리 해결하기 위한 추적, 측정, 다양한 지표의 기록 등의 작업을 의미합니다.

무엇을 볼지는 크게 두 가지입니다.

  1. 시스템 지표 : 지연시간, 처리량, 오류율, 그리고 비용
  2. 모델 지표 : 입력 데이터의 분포가 학습 때와 달라졌는지, 출력 품질이 떨어졌는지, 안전성 필터에 걸리는 비율이 늘었는지

배포도 한 번에 전부 바꾸지 않습니다. 일부 트래픽에만 새 버전을 먼저 태우고, 문제가 없으면 비중을 늘립니다. 언제든 되돌릴 수 있는 상태를 유지하기 위해서입니다.


정리하며

AI 서비스를 만드는 일은 모델을 개발하는 것으로 끝나지 않았습니다.

그 전에 세 가지를 먼저 생각해야 합니다. 문제에 접근하는 방식, 생성형 AI 개념에 대한 이해, 그리고 시스템을 그렇게 설계한 이유입니다.

그리고 이 생각을 막연히 하는 것이 아니라, 요구사항 구체화부터 배포와 모니터링까지 위의 7단계를 따라 체계적으로 분석해야 한다는 것을 알게 되었습니다.