Generative AI & LLMs
이번 강의에서는 큰 틀을 설정해 보려고 합니다. 대규모 언어 모델(LLM), LLM의 사용 사례, 모델이 어떻게 작동하는지, 프롬프트 엔지니어링, 창의적인 텍스트 출력을 만드는 방법, 그리고 생성 AI 프로젝트의 생명주기를 개요화하는 것에 대해 이야기할 것입니다. 이 강의에 관심이 있다면, 아마도 이미 생성 AI 도구를 시도해 보았거나, 시도해 보고 싶다는 것을 의미할 것입니다. 챗봇이든 텍스트로부터 이미지를 생성하는 것이든, 코드 개발을 돕는 플러그인을 사용하는 것이든, 이 도구들에서 볼 수 있는 것은 인간의 능력을 모방하거나 근접하게 만들 수 있는 콘텐츠를 만드는 기계입니다.
생성 AI는 전통적인 기계 학습의 하위 집합입니다. 그리고 생성 AI를 뒷받침하는 기계 학습 모델들은 인간이 원래 생성한 방대한 콘텐츠 데이터 세트에서 통계적 패턴을 찾아 이러한 능력을 배웠습니다. 대규모 언어 모델들은 수 주와 수 개월 동안 수조의 단어를 학습했으며, 그 과정에서 방대한 양의 컴퓨팅 파워를 사용합니다. 이러한 기반이 되는 모델들은 수십억 개의 매개변수를 가지고 있으며, 언어 이상의 진화된 특성을 보여주며, 연구자들은 모델들이 복잡한 작업을 분해하고, 문제를 해결하고, 추론하는 능력을 발견하고 있습니다.
여기에는 기반 모델들이라고도 하는 일련의 기초 모델들과 그들의 상대적인 크기를 나타내는 매개변수들의 모음이 있습니다. 이 매개변수들에 대해 나중에 좀 더 자세히 다룰 예정입니다만, 지금은 그것들을 모델의 메모리라고 생각해 보세요. 그리고 모델이 가진 매개변수가 많을수록 더 많은 메모리를 가지게 되고, 결과적으로 더 복잡한 작업을 수행할 수 있게 됩니다.
이 강의를 통해 우리는 이러한 대규모 언어 모델을 보라색 원으로 표현하게 될 것이며, 실험실에서는 언어 작업을 수행하기 위해 특정 오픈소스 모델인 flan-T5를 사용하게 될 것입니다. 이러한 모델들을 그대로 사용하거나, 특정 사용 사례에 맞게 미세조정 기법을 적용하여 새로운 모델을 처음부터 훈련할 필요 없이 맞춤형 솔루션을 빠르게 구축할 수 있습니다.
이제, 생성 AI 모델들이 이미지, 비디오, 오디오, 음성 등 다양한 형태로 만들어지고 있지만, 이 강의에서는 대규모 언어 모델과 자연어 생성에 대한 그들의 용도에 집중할 것입니다. 그것들이 어떻게 만들어지고 훈련되는지, 어떻게 프롬프트라는 텍스트를 통해 모델과 상호 작용할 수 있는지, 어떻게 모델을 미세 조정하여 사용 사례와 데이터에 맞게 사용할 수 있는지, 그리고 어떻게 그들을 응용 프로그램과 함께 배포하여 비즈니스와 사회적 작업을 해결할 수 있는지에 대해 알아볼 것입니다.
언어 모델들과의 상호 작용 방식은 다른 기계 학습과 프로그래밍 패러다임과는 상당히 다릅니다. 이 경우, 라이브러리와 API와 상호 작용하기 위해 공식적인 문법으로 컴퓨터 코드를 작성합니다. 반면에, 대규모 언어 모델들은 자연어 또는 인간이 작성한 지시사항을 받아들이고, 그에 따라 작업을 수행할 수 있습니다. LLM에게 전달하는 텍스트를 프롬프트라고 합니다. 프롬프트에 사용 가능한 공간이나 메모리는 컨텍스트 윈도우라고 불리며, 이는 일반적으로 수천 단어를 수용할 만큼 크지만, 모델마다 다릅니다.
이 예제에서는 모델에게 Ganymede가 태양계에서 어디에 위치해 있는지 결정하도록 요청합니다. 프롬프트가 모델에게 전달되면, 모델은 다음 단어를 예측합니다. 그리고 프롬프트에 질문이 포함되어 있었기 때문에, 이 모델은 답을 생성합니다. 모델의 출력은 완성이라고 불리며, 모델을 사용하여 텍스트를 생성하는 행위는 추론이라고 합니다.
완성(Completion)은 원래 프롬프트에 포함된 텍스트와 생성된 텍스트로 구성됩니다. 이 모델이 질문에 잘 답하였음을 알 수 있습니다. 이는 Ganymede가 목성의 달이라는 사실을 정확히 인식하고, 달이 목성의 궤도 내에 위치해 있다고 답하는 합리적인 답을 생성했습니다.
LLM use cases and tasks
LLMs와 생성 AI가 대화 작업에 집중되어 있다고 생각하는 것은 용서받을 만한 일입니다. 결국, 챗봇은 매우 눈에 띄며 많은 관심을 받고 있습니다. 다음 단어 예측은 기본적인 챗봇부터 시작하여 여러 다른 기능의 기본 개념입니다. 그러나 이 개념적으로 간단한 기술을 텍스트 생성의 다양한 작업에 사용할 수 있습니다. 예를 들어, 프롬프트를 기반으로 에세이를 쓰라고 모델에 요청하거나, 대화의 요약을 요청할 때 대화의 일부를 프롬프트로 제공하고 모델은 이 데이터와 자연어 이해를 사용하여 요약을 생성할 수 있습니다.
모델은 두 가지 다른 언어, 예를 들어 프랑스어와 독일어, 또는 영어와 스페인어 사이의 전통적인 번역 작업부터 시작하여 다양한 번역 작업에 사용할 수 있습니다. 또는 자연어를 머신 코드로 번역하는 것도 가능합니다. 예를 들어, DataFrame의 모든 열의 평균을 반환하는 Python 코드를 작성하라고 모델에 요청하면, 모델은 해석기에 전달할 수 있는 코드를 생성합니다. LLMs를 사용하여 정보 검색과 같은 작은, 초점이 맞춰진 작업을 수행할 수 있습니다. 이 예에서는 모델에게 뉴스 기사에서 식별된 모든 사람과 장소를 식별하도록 요청합니다. 이것은 이름이 주어진 개체 인식, 단어 분류라고 알려져 있습니다. 모델의 매개변수에 인코딩된 지식의 이해는 이 작업을 정확하게 수행하고 요청한 정보를 반환할 수 있게 합니다.
마지막으로, 활발하게 개발되고 있는 분야는 외부 데이터 소스에 LLMs를 연결하거나 외부 API를 호출하는 것입니다. 이 기능을 사용하여 모델에게 사전 훈련에서 알 수 없는 정보를 제공하고, 모델이 실세계와의 상호작용을 지원할 수 있게 할 수 있습니다.
개발자들은 기초 모델의 규모가 수백만 개의 매개변수에서 수십억, 심지어 수백억으로 증가함에 따라 모델이 가진 언어 이해도가 증가한다는 것을 발견했습니다. 이 언어 이해는 모델의 매개변수에 저장되어 있으며, 이것이 당신이 제공하는 작업을 처리하고, 이유를 찾아내며, 최종적으로 해결하는 것입니다. 하지만 더 작은 모델도 특정한 초점이 맞춰진 작업에 잘 수행될 수 있도록 미세 조정될 수 있다는 것도 사실입니다.
LLMs가 지난 몇 년 동안 보여준 기능의 급속한 증가는 대부분 이들을 지원하는 아키텍처 덕분입니다.
Text generation before transformers
제너레이티브 알고리즘들이 새롭게 등장한 것은 아닙니다. 이전 세대의 언어 모델들은 반복 신경망(Recurrent Neural Networks, RNNs)이라는 아키텍처를 사용했습니다. RNNs는 당시에는 강력했지만, 제너레이티브 작업을 잘 수행하기 위해 필요한 계산 능력과 메모리 양에 제한을 받았습니다.
간단한 다음 단어 예측 제너레이티브 작업을 수행하는 RNN의 예를 살펴봅시다. 모델이 보는 이전 단어가 하나밖에 없다면 예측은 그리 좋지 않을 것입니다. 텍스트에서 선행하는 단어들을 더 많이 볼 수 있도록 RNN 구현을 확장하면, 모델이 사용하는 리소스도 상당히 확장해야 합니다. 그러나 예측에 대해서는, 모델이 실패했습니다. 모델을 확장하더라도, 여전히 좋은 예측을 내기 위해 충분한 입력을 본 것이 아닙니다. 다음 단어를 성공적으로 예측하기 위해서는, 모델이 이전 몇 단어보다 더 많은 것을 보아야 합니다. 모델은 전체 문장이나 심지어 전체 문서를 이해해야 합니다.
여기서 문제는 언어가 복잡하다는 것입니다. 많은 언어에서 하나의 단어는 여러 가지 의미를 가질 수 있습니다. 이것을 동음이의어라고 합니다. 이 경우, 우리는 문장의 맥락만으로 의도된 은행의 종류를 알 수 있습니다.
문장 구조 내의 단어들은 모호하거나 구문적 모호성을 가질 수 있습니다. 예를 들어 “The teacher taught the students with the book.”라는 문장을 봅시다. 선생님은 책을 사용해서 학생들을 가르쳤는지, 아니면 학생들이 책을 가지고 있었는지, 아니면 둘 다였는지 모호합니다. 우리조차 가끔 이해할 수 없는 인간의 언어를 알고리즘은 어떻게 이해할 수 있을까요?
그런데 2017년, Google과 토론토 대학의 “Attention is All You Need”라는 논문이 발표된 후, 모든 것이 바뀌었습니다. 트랜스포머 아키텍처가 등장했습니다. 이 새로운 접근법은 우리가 오늘날 볼 수 있는 제너레이티브 AI의 발전을 가능하게 했습니다.
트랜스포머는 멀티 코어 GPU를 효율적으로 활용할 수 있으며, 입력 데이터를 병렬 처리하여 훨씬 더 큰 규모의 훈련 데이터셋을 활용할 수 있습니다. 그리고 중요한 점은, 트랜스포머는 처리하는 단어의 의미에 주의를 기울이는 법을 배울 수 있다는 것입니다. “주의력”이 전부입니다. 제목에도 그렇게 써 있습니다.