| 이 책에서 다루는 내용 |
- LLM의 핵심인 트랜스포머 아키텍처
- 챗GPT를 만드는 방법: 지도 미세 조정과 RLHF
- 오픈소스 LLM을 나만의 데이터로 추가 학습하기
- LLM 애플리케이션 운영을 위한 모델 경량화
- 라마인덱스를 활용한 RAG 구현과 개선
- 이미지와 음성도 처리하는 멀티 모달 LLM
- LLM에 장기 기억과 도구를 결합한 에이전트 아키텍처
| 이 책의 대상 독자 |
- LLM을 활용해 AI 애플리케이션을 개발하려는 개발자
- LLM API의 단순한 활용보다는 모델의 원리와 기반 기술도 궁금한 개발자
- AI 엔지니어가 되고자 하는 학생 및 취업준비생
- 짧은 시간에 LLM과 관련된 논문과 기술을 정리하고 싶은 대학원생
| 깃허브 실습 코드 다운로드 |
실습 코드는 책의 깃허브 저장소(https://github.com/onlybooks/llm)에서 확인할 수 있습니다. 깃허브의 코드는 구글 코랩에서 두 가지 방법으로 활용할 수 있습니다.
1. 로컬에서 업로드하기: 깃허브의 코드를 로컬 환경에 클론하거나 압축 파일 형태로 내려받은 후 진행하려는 실습 폴더의 노트북 파일(ipynb)을 구글 코랩에서 열어 실
습을 진행할 수 있습니다.
2. 깃허브 URL로 열기: 구글 코랩에서 노트 열기(Ctrl+O)를 선택하면 다양한 노트 열기 방식 중 깃허브GitHub 탭에서 코드의 URL을 통해 실습 노트북을 열 수 있습니다.
| 이 책의 코드 실행 환경 |
이 책의 실습은 구글 코랩에서 실행한다. 구글 코랩은 구글에서 제공하는 노트북 실행 환경으로, 파이썬의 주피터 노트북과 유사한 UI로 브라우저에서 실행할 수 있다. 또 구글 코랩에서는 무료 T4 GPU(16GB)를 사용할 수 있도록 제공한다. 구글 코랩의 무료 버전은 12시간의 런타임 제한이 있으며, 장시간 사용하지 않으면 연결이 끊길 수 있다.
감수의 글
LLM 애플리케이션 개발을 논하기에 앞서, LLM 애플리케이션이 사람들의 관심을 끌 수밖에 없는 이유에 대해 생각해 볼 필요가 있다. 현재까지 수많은 기술들이 등장했다 사라져 갔는데, 오늘날에도 여전히 사용되고 있는 주요 기술은 개발이나 사용 패러다임을 크게 발전시켰다는 특징이 있다. 그렇다면 LLM 애플리케이션이 주력으로 자리 잡아 개발자 두뇌 속의 필수 공구상자에 들어갈지를 판단하기 위해, 우선 어떤 변화가 일어나고 있는지를 살펴보면 될 것 같다.
먼저 사용자 쪽의 변화부터 시작하자. 지금도 그렇지만 사람들이 뭔가 지식을 획득하기 위해서는 검색을 염두에 둬야 한다. 사용자가 검색 엔진에 키워드나 단어의 조합을 넣으면 마법처럼 해당하는 문서 목록이 나온다. 초기에는 사람들이 전화번호부처럼 한 땀 한 땀 구성해서 품질을 높였지만, 곧바로 정보의 홍수 시대가 도래하면서 필연적으로 자동화가 진행되었고, 가장 대표적인 알타비스타 계열의 검색 엔진은 검색 결과 목록 순위를 매기는 알고리즘이 뛰어나지 않았기에 수많은 목록을 직접 살펴봐야 했었다. 그러다가 우리가 지금도 크게 의존하고 있는 구글이 등장하면서 첫 페이지만 봐도 원하는 목록을 찾을 수 있도록 검색 품질을 크게 개선했다.
하지만 최근에는 검색이 아니라 질문으로 초점이 옮겨가고 있다. 급격하게 돌아가는 바쁜 현대사회에서 목록을 하나씩 열어보는 행위조차도 부담스러워지고 검색 엔진 최적화를 빙자한 오용 사례로 인해 검색 결과 품질도 과거에 비해 지속적으로 하락하는 경향이 있으므로, 차라리 질문을 던진 다음에 내가 원하는 대답을 얻고 싶어 하는 욕구와 맞아떨어졌다고 볼 수 있다. 챗GPT나 구글 제미나이의 경우를 보면 멀티 모달까지 지원하므로 이미지와 텍스트를 조합해서 원하는 질문을 주고받을 수 있게 됐다.
다음으로 머신러닝과 딥러닝의 변화를 살펴볼 필요가 있다. 생성형 AI와 초거대 언어 모델(이하 LLM)이 등장하기 전까지는 대다수 머신러닝이나 딥러닝 모델은 도메인 전용 모델이었다. 다시 말해, 해당 도메인에서 축적된 데이터를 활용해 예측을 하고 통찰을 할 수 있게 협소한 범위의 문제를 제대로 풀도록 연구 개발이 진행됐다. 물론 딥러닝 세상이 시작될 무렵에 이미 빅데이터, 클라우드, GPU 인프라는 있었지만 이를 범용 목적으로 확장할 기술적이고 경제적인 돌파구를 찾지는 못했던 것이다. 예를 들어, 이미지 분야에서는 MNIST 데이터셋을 활용한 숫자 판단과 CIFAR-10 데이터셋을 활용한 다양한 클래스 판단을 시작으로, 실시간으로 객체의 위치를 파악하고 클래스를 판단할 수 있는 YOLO에 이르기까지 다양한 딥러닝 모델이 등장했지만 모두 이미지 분류에 국한된다.
하지만 생성형 AI가 등장하면서 다양한 작업이 가능한 범용적인 모델로 발전하고 있다. 예를 들어 챗GPT는 일반적인 질문뿐만 아니라 의료나 법률 같은 전문적인 질문에도 상당히 잘 대답하며, 멀티 모달을 지원하는 GPT-4V나 4o 같은 고급 모델인 경우에는 표나 이미지에 대한 질문도 곧잘 대답한다. 또한 복잡한 계산이 필요하거나 그래프 출력이 필요한 경우에는 파이썬 코드를 실행 시점에서 만들어 격리된 환경에서 실행한 결과를 보여주기도 하므로 만능 일꾼처럼 여겨지기도 한다. 생성형 AI는 Q&A, 번역, 분류, 요약, 분석, 문체 변경, 감정 분석과 같이 다양한 사용 사례를 보여주고 있으며, 정보 지원과 의사결정 지원을 넘어서 자율적인 사리 판단을 내리는 수준으로 발전을 거듭하고 있다.
마지막으로, 개발자들이 가장 관심이 많을 법한 개발 자체의 변화를 빠뜨릴 수는 없다. 초창기 프로그래밍은 논리 중심으로 돌아갔다. LISP와 같은 함수형 프로그래밍 언어는 수학적 이론을 바탕으로 인간의 계산 능력에 도전했으며, 포트란을 거쳐 파스칼과 C 프로그래밍 언어로 오면서 절차적 방식이 도입됐고, C++를 거쳐 자바로 오면서 객체지향 기법이 도입됐다. 다른 한편, 데이터를 중심으로 발전이 일어났다. SQL은 구조적인 방법으로 테이블 형태의 정형 데이터를 손쉽게 다루게 만들었으며, 빅데이터 시대에 접어들 면서 정형 데이터뿐만 아니라 반정형과 비정형 데이터까지 폭넓게 다룰 수 있게 됐다.
그러던 중 최근에 생성형 AI가 등장하면서 또 다른 변화의 기류가 감지되고 있다. 컴퓨터에 밀접한 언어가 아니라 사람에 밀접한 언어를 활용해 비즈니스 로직을 구사하는 방법이 생긴 것이다! 프롬프트 엔지니어링이라고도 불리는 이런 새로운 기법은 원하는 결과를 얻기 위해 LLM의 입력을 조율하며, 출력 결과를 조정해서 원하는 결과로 유도하게 만든다. 프롬프트는 사람이 사용하는 언어에 가까우므로 적확성을 담보하기는 어렵지만 반대급부로 유연성과 확장성을 얻을 수 있으므로 기존에 상당히 까다롭던 비즈니스 로직을 손쉽게 구현할 수 있는 계기를 만들어 줬다.
이렇듯이 생성형 AI가 등장하면서 여러 가지 변화가 일어났으므로, 개발자들도 여기에 적응하기 위한 준비가 필요하다. 기존의 웹 브라우저(또는 앱) -WAS(웹 애플리케이션 서버)-데이터베이스(관계형 또는 NoSQL) 구조로 애플리케이션을 개발하고 있다면, 기업 요구사항에 따른 LLM의 사용 사례를 파악하고 아키텍처를 이에 맞춰 변경하는 작업이 필요하다. 특히 여기서 주목해야 하는 기술은 기업에서 최근 관심이 집중되고 있는 검색 증강 생성(이하 RAG)이다. RAG는 기업 내부의 다양한 문서와 데이터를 임베딩이라는 기술을 활용해 벡터 데이터베이스로 지식 기반을 구축한 다음에 사용자가 질문한 대답과 가장 관련이 있는 문서 조각을 지식 기반으로부터 뽑아내 LLM에게 요약 정리하게 만드는 방법으로 동작하는 애플리케이션이다.
기존의 TF/IDF나 BM25 같은 전통적인 알고리즘에 기반한 검색 방식은 희소 벡터(sparse vector)를 사용해 문장의 단어(키워드)를 인코딩한다면, RAG에서 사용하는 의미(semantic) 검색은 고밀도 벡터(dense vector)를 사용해 단어의 추상적인 의미와 관계를 인코딩하므로 언어 처리에 강점이 있는 LLM과 궁합이 무척 잘 맞는다고 볼 수 있다. RAG는 클로드 섀넌이 1950년대에 주창한 정보 엔트로피 개념을 본격적으로 현실화하는 좋은 사례로 볼 수 있으며, 다양한 의미를 포함하는 정보를 처리하기 위해 임베딩과 LLM이라는 양대 기 술을 적절하게 조합해 최고의 성능을 이끌어 내고 있으므로 개발자들은 이 기술 생태계 자체를 살펴보는 것만으로도 많은 영감을 얻을 수 있을 것이다.
이 책은 LLM의 기본 아키텍처에서 출발해 애플리케이션의 요구사항에 맞춰 LLM을 길들이고 제한된 컴퓨팅 환경에서 동작하게 경량화해서 원활하게 서빙하게끔 기초를 다진 다음에 RAG라는 LLM의 대표적인 애플리케이션을 만드는 방법을 차근차근 설명한다. 여기서 끝나지 않고 실제 운영 과정에서 부딪히는 어려움을 해소하는 방법과 멀티 모달과 더불어 에이전트 같은 고급 주제까지 다룬다. 즉 LLM 시대를 맞이하여 필수적으로 갖춰야 하는 개발 지식을 이론과 실무 양쪽 관점에서 설명하고 있으므로, 새로운 패러다임에 적응하고자 하는 개발자들에게 가뭄의 단비처럼 다가올 것이다. 오늘도 끊임없이 연구 개발에 정진하고 있는 모든 개발자에게 강력하게 추천한다.