생성형 AI를 직접 만들 때 맞닥뜨릴 수 있는 어려움
일반적으로 생성형 AI라고 하면, 2가지 종류가 있다. 먼저, 사용자로부터 입력을 받지 않고, 임의의 생성을 해주는 모델이 있다. 그러나 이는 사용자가 원하는 생성을 할 수 없다는 특징 때문에 상대적으로 활용도가 떨어진다. 최근에는 사용자로부터 입력을 받고, 그 입력에 따라 적절한 콘텐츠를 생성해주는 걸 생성형 AI라고 많이 통칭하고 있는 것 같다.
우리가 생성형 AI를 직접 만드는 건 매우 어렵다.
why?
대규모 데이터와 컴퓨팅 자원이 필요하다. 생성형 AI는 학습하기 위한 데이터의 양이 굉장히 많은 편에 속한다. 또 생성형 AI 모델은 GPU 등 같은 고성능 하드웨어에서 오랜 시간 학습해야 한다. 즉, 데이터 수집 자체도 어려울 뿐더러, 컴퓨팅 자원의 한계가 바로 나타나게 된다.
모델 구조가 굉장히 복잡하다. 딥러닝 개념만 사용되는 게 아니고, 특정 도메인에 맞는 생성을 하기 위해서 도메인 지식(Domain Knowledge)가 반영된 코드, 강화학습 등 다른 인공지능 분류의 기법들이 많이 적용된다. 모델 아키텍처 설계 단계에서도 여러 층의 신경망과 다양한 메커니즘이 포함되고, 학습률, 배치 크기, 레이어 수 등 다양한 하이퍼파라미터를 적절히 조절해야 최적의 성능을 낼 수 있기 때문에 하이퍼파라미터 튜닝도 해야 한다.
훈련 과정에 대한 불안정성이 있다. 특정 패턴의 결과물만 만들어내거나, 혹은 학습이 되지 않는 등 다양한 문제가 발생한다. 모델 붕괴라고 하는 현상이 종종 나오게 된다. 균형 잡힌 학습, 우리는 균형잡힌 구조까지 작성해야 의미있는 생성형 모델을 만들 수 있을 것이다.
파인 튜닝의 필요
생성형 AI는 복잡성과 훈련의 어려움 때문에, Fine-Tuning을 통해 만들어내는 경우가 많다. 이미 사전에 연구가 잘 수행되고, 대규모 데이터셋에 대해 일반적 지식을 얻은 모델을 습득함으로써, 이 모델을 본인만의 목적을 위해 Fine-Tuning하는 작업을 준비할 수 있다.
사전 학습된 모델을 사용하면, 이미 방대한 데이터로 강력한 컴퓨팅 자원을 통해 충분히 안정적으로 학습이 된 형태로 모델이 제공되게 된다. 그래서 우리는 시간과 비용을 절감할 수 있다. 그리고 성능적으로도 훨씬 높은 성능을 얻을 수 있을 것이다.
생성형 AI를 직접 만들 때 고려해야 할 점
사전 학습된 모델을 먼저 찾아보자. 사전 학습된 모델을 활용해서 생성형 AI 만드는 게 더 효율적일 수 있다. 개인 컴퓨터에서 학습을 진행한다고 했을 때, 너무 오래 걸리거나 메모리적인 부분때문에 억지로 학습을 축소시켜야할 경우가 있을 수도 있다. 내가 좋은 모델을 디자인했다고 하더라도, 학습이 제대로 되지 않으면 당연히 인공지능은 원하는 결과를 얻을 수 없게 된다. 클라우드 서비스를 활용하면 좋은데, 당연히 비용적인 측면을 먼저 확인하고 진행하는 것이 좋다. 작은 프로젝트부터 시작해서, 천천히 조금씩 확장해나가면서 모델을 복잡하게 만들어나가자.
생성형 모델의 특징
생성형 AI에는 몇 가지 특징이 있다. 이 특징을 모르면, 우리는 처음에 해석하기 힘든 결과를 얻을 수도 있고, 왜 이런 결과가 나왔나 알기 힘들 것이다. 생성형 AI 의 특징 랜덤성(Randomness)과 조건성(Conditionality)이다.
랜덤성
생성형 모델을 동작시켜보면, 그때그때 생성되는 결과물이 약간씩 다르다. 이러한 현상은 랜덤성이라고 하는 특성때문이다. 생성형 모델이 다양한 결과를 생성할 수 있도록, 일반적으로 랜덤성을 넣어준다. 그렇기 때문에 우리가 같은 입력을 넣어도 다른 결과가 나오는 것이다. 확률 분포에 의해 새로운 데이터를 생성한다는 것은 생성형 AI의 굉장히 큰 장점이자 특징 중 하나다. 학습 데이터에서, 정해진 결과만 얻는 것이 아니라, 데이터의 분포를 학습함으로써, 새로운 데이터를 생성할 수 있는 것이다.
조건성
GPT나 이미지, 음성같은 경우를 보면, 우리가 특정 데이터를 전달한다. 입력 조건에 따라 새로운 데이터를 생성하는 생성형 모델을 조건형 모델이라고 한다. 조건이 주어지면, 모델은 그 조건에 맞춰 출력을 생성한다. 당연히 확률성이라고 하는 랜덤성도 반영돼서, 조건에 따라 최대한 맞춰 수행하지만, 그 결과에는 약간씩 랜덤성이 담겨 나온다.
텍스트 기반, 이미지 기반, 오디오 기반, 비디오 기반 생성형 모델은 모두 유사하게 동작한다. 그래서 우리는 조건성과 확률, 랜덤성이라는 측면을 알고 있으면, 생성형 모델을 조금 더 내가 원하는 방식대로 사용할 수 있을 것이다. 두 조건이 상호작용을 이루면서 사용자가 원하는 결과를 얻을 수 있도록 생성형 모델을 어느 정도 컨트롤할 수 있게 해준다.
OpenAI API 활용
첫 번째로 수행할 작업은 OpenAI 라이브러리 설치하기 이다. API에 대한 호출이 상당히 높은 레벨로 추상화가 돼있어서, 우리가 조금 더 ChatGPT API를 편하게 사용할 수 있을 것이다.
pip install openai
OpenAI 환경 변수라는 걸 설정해줘야 하는데, 서비스를 이용하려면 당연히 서비스에 대한 접근 권한이 있어야 한다. ChatGPT 의 경우, 홈페이지에서 로그인을 한 다음, 계정 단위로 키 라는 걸 발급받을 수 있다. 이 키를 발급받으면, 특정 서비스에 대한 인증이 되게 되고, 우리는 사용하는 만큼 비용이 과금된다.
import os
os.environ["OPENAI_API_KEY"] = "<your OpenAI API key>"
환경 변수라고 하는 것은, 운영체제나 프로세스 자체에서 사용되는 변수를 말한다. 그렇다보니 시스템의 설정이나 사용자 정보, 프로그램의 실행 환경 등을 저장할 수 있다. 키-값 쌍으로 이뤄져있고, OpenAI에서는 OPEN_API_KEY 라는 이름을 가진 환경 변수에 대해 값을 저장해놓으면, 해당 값을 자동으로 읽어와서, 코드상에 노출없이 API에 접근이 가능하게 된다. 이 코드는 파이썬 코드에서 환경 변수 자체를 설정하는 코드인데, 사실 추천하지는 않는다. API 키가 코드상에 포함된다는 것은 굉장히 위험하다. 키가 노출될 가능성이 있고, 다른 사람이 보게 될 가능성이 있다. 그래서 키 같은 것들은 별도의 설정 파일이나 환경 변수를 통해 관리하는 게 좋다. API 키 등 접근 권한이 있는 키에 대해서는, 반드시 코드상에 포함시키지 않아야 한다.
모델 서빙
모델 서빙은 머신러닝 모델, 딥러닝 모델, AI 모델을 실제 어플리케이션에서 사용할 수 있게 제공하는 것이다. 마이크로 서비스 아키텍처를 사용하거나, API 형태로 제공하거나, 함수 형태로 제공하는 등 다양한 방식이 있다. 서빙된 모델은 웹으로부터 입력 데이터를 받아 예측 혹은 분류를 수행하고, 그 결과를 응답으로 돌려주게 된다. 응답을 받으면 사용자는 모델에 대한 상세한 정보 없이도, 바로 모델을 활용한 서비스를 만들 수 있게 된다. API를 통해 모델을 서빙하는 게 대표적인 방법 중 하나다.
모델 서빙의 주요 개념
RESTful API는 간단하게 말하면, API 중에 REST 아키텍처를 따르는 형태를 말한다. 최근에 굉장히 많은 종류의 API가 RESTful 형태로 제공되고 있다. REST에는 몇 가지 기본 원칙이 있다.
1. 자원 : 자원은 시스템에서 URL로 고유하게 식별된다. 그래서 특정 사용자의 정보를 나타낸다면, 유저의 유저 아이디 식으로 URL 형태로 접근할 수 있어야 한다.
2. HTTP 메서드라는 개념 : RESTful 시스템은 HTTP 메서드를 활용해서 자원에 대한 작업을 수행한다. 각 메서드는 특정한 작업을 나타내기 때문에, 작업의 종류에 따라 적절한 HTTP 메서드 형태로 호출을 해줘야 한다.
3. 무상태성 : RESTful 시스템에서는 클라이언트와 서버 간의 모든 요청은 독립적이고, 서버는 각 요청을 별도로 처리한다. 이를 간단하게 말하면, 클라이언트의 상태를 서버가 기억하지 않는다고 할 수 있다. 클라이언트는 각 요청 시, 필요한 모든 정보를 포함시켜야 하고, 세션이나 상태 정보를 서버에 유지하지 않는다. 그래서 스트리밍 형식의 방식에는 다소간 제한이 있고, 스트리밍을 구현하기에는 조금 불편한 방식이다.
4. 표현 : 클라이언트가 자원을 요청할 때, 서버는 자원의 현재 상태를 표현한 데이터를 반환한다. 표현은 JSON, XML, HTML 등 다양한 포맷으로 제공될 수 있어서 우리가 편하게 활용할 수 있다.
이밖에도 여러 개념이 있다.
FastAPI는 API의 아키텍처가 아니라, 파이썬에서 RESTful API를 구축하는 데 매우 편한 패키지다. 그리고 이는 RESTful API 를 구축하기 때문에, 서버를 동작시키지는 않는다.
RESTful API 개요
- GET: 서버에서 데이터를 가져올 때 사용합니다.
- POST: 서버에 데이터를 보낼 때 사용합니다.
- PUT: 서버의 데이터를 업데이트할 때 사용합니다.
- DELETE: 서버의 데이터를 삭제할 때 사용합니다.
이들은 각각 데이터에 대해 어떤 작업을 수행하는 지가 명시돼있다. 그래서 특정 경로를 통해 리소스에 접근할 때, 경로에 포함된 매개변수를 통해 다양한 작업을 수행하는데, 어떤 작업을 수행할지는 HTTP 메서드를 통해 알 수 있다.