[ "한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다." ]
올리비에 케일린(Olivier Caelen): 결제 기술의 선도 기업인 월드라인(Worldline)에서 머신러닝 연구자, 브뤼셀 자유대학교(Universite libre de Bruxelles)에서 머신러닝 개론과 심화 딥러닝 과목을 가르치고 있음, 통계학과 컴퓨터 과학으로 석사 학위를 받고 머신러닝으로 박사 학위 - https://www.linkedin.com/in/oliviercaelen
마리 알리스 블레트(Marie-Alice Blete): 코모도 헬스(Komodo Health)에서 AI 엔지니어, LLM 관련 커뮤니티 & 강연 활발 - https://www.linkedin.com/in/mblete/
책 이름이 "앱 개발" 보다는 "다양한 응용프로그램(application) 개발" 이 한국어 번역에 더 익숙하지 않을까? 라는 생각이 든다. "앱" 이라는 의미가 유독 국내에서는 "모바일앱" 으로 인식되는 것 같아서 오해가 될 가능성도 있을 것 같다.
난이도는 python 기본 문법과 관심만 있으면 바로 시도할 수 있을 정도로 평이하다. 만약 모델 내부의 로직의 상세한 step 이나, 대중적으로 알려진 LLM 활용 그 이상을 바란다면 이 책이 너무 얕게 느껴질 수 있을 것 같다.
거시적인 관점에서 LLM 을 살펴볼 수 있고, 특히 GPT 기반으로 다양한 application 의 정말 다양한 활용과 예제를 볼 수 있다. 실습 기반이다 보니, 책엔 코드가 절반 정도 차지한다. 그 깊이는 당연하게 얕지만 진짜 제너럴하게 대부분의 기능을 맛볼 수 있다. (심지어 OpenAI 의 웹 인터페이스(playground)에서 설명도 말이다 ㅎㅎ, 거의 OpenAI 홍보 너낌)
오히려 "프롬프트 엔지니어링" 에 많은 인사이트를 얻을 수 있었다. 그리고 function & tools
와 같이 진짜 누가 말 안해줬으면 절대 몰랐을 것 같은 꿀팁도 있었다. (물론 Official Docs 에는 있다.ㅎㅎㅎ)
400p 이지만 하루만에 완독 가능한 수준이고, 컴퓨터와 깃허브 예제와 함께 한 호흡으로 쭉 따라기 좋게 구성되어 있다. 만약 현업에서 당장 LLM 을 활용한 프로젝트를 실행하거나 R&D 가 필요한 부분이 있다면, 가장 먼저 읽어보면 그 다음 힌트를 찾을때 많은 도움이 되는 책이라고 생각이 든다.
(PS. 그 외에도 LLM 에 조금이라도 관심을 가지는게 좋다고 생각하며, 적어도 이 정도 책은 읽는게 앞으로 많은 도움이 되지 않을까 생각한다.)
책 보러가기 >> GPT API를 활용한 인공지능 앱 개발(2판)
GPT는 "옴니 모달" 부터 다양한 유형 인풋(시각, 청각 등)을 하나의 모델로 처리하고 있다. 그리고 가볍게 AI, ML, Deep Learning, Transformer, LLM (foundation model) 까지의 관계를 보여준다.
LLM의 핵심 로직은 "다음 단어가 될 가능성이 큰 단어 예측" 하는 것이다. [ 엔그램 -> RNN -> LSTM ]
순서로 발전된 자연어 처리에서 "트랜스포머" 아키텍처가 "혁명"을 가져왔다고 평가한다.
RNN의 긴 시퀀스 context 잊어버리는 치명적인 이슈가 있었다. (파괴적망각), 이를 위해 "트랜스포머"는 "어텐션 메커니즘" 을 활용한다.
모든 단어를 똑같이 중요하게 평가하지 않고, 작업 각 단계에서 관련성이 높은 부분에 "주의" 한다는 것
트랜스포머는 "교차 어텐션" 과 "셀프 어텐션" 을 활용하며, 순환하는 형태가 아니라 "동시 처리 가능" 해서 병렬 작업 가능하며 이에 GPU 와 완벽한 궁합이 맞게 되었다. 그에 따라 더 큰 데이터셋으로 훈련이 가능했고, LLM 의 기반이 되었다. (아래는 어텐션 개념에 중요한 맥락이 되는 논문)
Bahdanau Attnetion - Paper : Neural Machine Translation by Jointly Learning to Align and Translate
Luong Attention - Effective Approaches to Attention-based Neural Machine Translation
트랜스 포머는 인코더와 디코더라는 중요 두 구성 요소가 있고 모두 어텐션 매커니즘 의존한다. "인코더" 의 임무는 입력 텍스트 처리, 중요한 특징 식별 (주의), 의미 있는 표현 생성하는 것 이라고 한다(임베딩). "디코더" 는 그 임베딩을 활용해 출력을 생성하는 부분을 의미한다.
GPT 는 genrative pre-trained transformer, 디코더를 활용하는 모델이며 GPT 는 인코더가 없고, GPT 는 셀프 어텐션 메커니즘에만 의존, BERT 와 반대된다.(BERT는 인코더 전용)
짧게 GPT의 자연어 처리 흐름을 보자면 아래와 같다.
가장 핵심적으로 GPT 3 이후 "인간 피드백 강화 학습 - RLHF" 를 통해 성능을 개선 했고, 인스트럭트GPT-3 가 등장했다고 한다. 그리고 이를 위한 크게 아래 2가지 방법을 소개한다.
보상 모델(RM, Reward Model)
을 활용하여 학습을 진행그리고 RLHF
를 통해 GPT-4o 가 1년도 안되는 시기에 전작 4 에 비해 압도적 성능 강화 성공했고, 이제는 다양한 파운데이션 모델 하며 앞으로는 "최적화와 활용" 의 시대가 열렸다고 한다.
(PS. GPT-4o mini 경우 128,000 토큰 입력 컨텍스트 처리 가능, 이는 종이책 300페이지)
이 장에서는 OpenAI의 API 사용법을 중심으로, OpenAI 홈페이지 활용법, 플레이그라운드(Playground) 사용법, API 키 발급 과정, 그리고 Python 기반 API 활용 방법 등을 다룬다.
특히, OpenAI의 핵심 파라미터인 temperature
와 top_p
의 개념을 상세히 설명한다.
temperature
temperature
값이 높을수록(예: 1.0 이상) 더 예측 불가능한 단어 선택이 이루어지며,top_p
top_p=0.9
로 설정하면 상위 90% 확률을 차지하는 후보들 중에서만 토큰을 선택한다.temperature
와 달리, 확률 분포 자체를 변화시키지는 않으며, 모델이 선택할 후보군을 사전 제한하는 방식이다.그리고 가장 간단하고 다양한 예제를 소개하는데, 특히 tools
와 function
은 재미있게 봤다. 아래는 SQL 쿼리를 실행하여 상품 목록을 찾는 기능을 함수 호출 방식으로 활용하는 예제이다.
def find_product(sql_query):
# 쿼리를 실행
results = [
{"name": "pen", "color": "blue", "price": 1.99},
{"name": "pen", "color": "red", "price": 1.78},
]
return results
function_find_product = {
"name": "find_product",
"description": "sql 쿼리에서 상품 목록을 찾습니다.",
"parameters": {
"type": "object",
"properties": {
"sql_query": {
"type": "string",
"description": "A SQL query",
}
},
"required": ["sql_query"],
},
}
전반적으로 대부분의 기능들에 대해 아주 기본적인 예제들 나열해 놓은 장이다.
여기서 부터는 실제 깃허브 코드 예제를 보는게 빠르다. 실제 애플리케이션 개발에 적용할 수 있는 LLM 활용 사례, 아키텍쳐와 구조에 대한 설명으로 이뤄져 있다.
뉴스 생성 솔루션 구축
유튜브 동영상 요약
의도 분류 서비스 (Redis 및 벡터라이징 활용)
개인 어시스턴트
문서 정리 및 감정 분석
logprobs
매개변수를 활용하여 응답 신뢰도를 평가 - 감정 분석 예제logprobs
라는 개념 자체를 아는 것이 필요할 것 같다.그 외 "비용 관리 및 쿼리 캐싱" 으로 API 호출 비용을 절감하기 위해 쿼리 결과를 캐싱하거나 자주 반복되는 요청에 대해 Redis 또는 DB 캐싱 활용하는 예제가 있다.
가장 재미있게 본 부분은 "프롬프트 압축" 인데, https://velog.io/@mmodestaa/LLMLingua-draft 글과 같이 "LLMLingua" 같은 방법이 있다. 실제 MS 에서 제공하는 활용가능한 라이브러리도 존재한다. (LLMLingua 깃허브)
참조할 만한 논문 LLMLingua-2: Data Distillation for Efficient and Faithful Task-Agnostic Prompt Compression
(개인적으로 가장 재미있게 본 챕터이다.) 이 장에서는 프롬프트 엔지니어링, 파인 튜닝, RAG(Retrieval-Augmented Generation) 기법 등을 다루며, GPT-4o와 챗GPT를 보다 효과적으로 활용하는 방법을 소개한다.
이전 장까지가 기본적인 API 활용과 애플리케이션 개발에 초점이 맞춰져 있었다면, 이 장에서는 성능 최적화, 모델 개선, 신뢰성 향상에 대한 보다 고급 기법을 중점적으로 다룬다.
프롬프트 엔지니어링은 LLM을 보다 정교하게 제어하여 원하는 결과를 얻는 기법이다. 이를 위해 역할(Role), 컨텍스트(Context), 작업(Task) 지정 방식이 중요하게 다뤄진다.
제로샷 러닝(Zero-shot Learning)
원샷 러닝(One-shot Learning)
퓨샷 러닝(Few-shot Learning)
Chain of Thought(CoT) & 단계적 추론
아래와 같이 프롬프트를 "피드백 통한 반복적 개선, reviewer
, questioner
, maker
루프를 구성한 아주 간단한 예시" application 도 재미있게 봤다. (개인적으로 여기에 다른 파운데이션 모델을 피드백 루프에 끼는 것이 좀 더 상향 평준화에 도움이 된다고 생각한다. )
프롬프트 체이닝 (Prompt Chaining)
네거티브 프롬프트 (Negative Prompting)
섀도 프롬프팅 (Shadow Prompting)
OpenAI 에서 자체 파인 튜닝 가능한 기능 제공 하지만 open ai 서버에 모델 저장된다. 그리고 학습 이후 API 호출로만 활용 가능하며 비용면에서 장기적으로 후달린...다!..
데이터셋 구성은 (1) prompt 와 completion key (프롬프트와 완료쌍)
방법과 (2) role 과 conents 딕셔너리로 구성된 데이터
방법이 있다. OpenAI는 후자를 권장한다고 한다. 후자 예시 데이터셋은 아래와 같다.
{
"messages": [
{"role": "system", "content": "당신은 고객 지원 챗봇입니다."},
{"role": "user", "content": "환불을 받고 싶어요."},
{"role": "assistant", "content": "환불 절차를 안내해 드리겠습니다. 주문 번호를 알려주세요."}
]
}
가상 문서 임베딩 - HyDE (Hypothetical Document Embedding)
KNN (k-최근접 이웃) 검색
ANN (근사 최근접 이웃) 검색
하이브리드 검색 (퓨전 검색)
사실 최근 RAG 관련 글을 너무 많이 읽어서 그런지, 이 부분이 엄청 와닿지는 않았다. (RAG R&D 고민만 반년 내내 하고 있으니 당연히 ㅠㅠ🥹) 그래도 가장 "심플하고 이상적인 아키텍처" 그림이 좋았다.
사실 이 RAG 에서는, 개인적으로, (모든 ML이 그렇겠지만) 저 vecotr 된 데이터가 9할, 후처리가 1할 하는 것 이라고 생각한다. 그리고 "평가" 방법에 대해 소개하며, 실제 OpenAI 가 사용하는 평가 방법을 참조하는 것이 좋다. Existing templates for evals
민감도와 비결정성 (Non-determinism)
할루시네이션 (Hallucination)
간단한 내용일 수 있지만, 해당 장의 마지막에 아래와 같은 flow-chart 형식의 접근법이 다시 나에게 초심을 찾게 하는데 도움이 되었다. (쩨발 RAG 부터 고민하지마!! 그만~~)
이 장에서는 LLM을 활용한 애플리케이션을 보다 체계적으로 개발할 수 있도록 도와주는 다양한 프레임워크를 다룬다. 특히, LangChain
과 LlamaIndex
를 중심으로 설명하며, RAG(검색 증강 생성) 파이프라인 구축 및 활용 사례를 소개한다.깊은 내용 보다는 기본적인 프레임워크 매커니즘과 실행에 대해서만 다룬다.
그리고 OpenAI GPT 앱(GPTs) 만드는 방법, GPT 의 어시스턴트 API 에 대한 간단한 소개가 포함되어 있다.
이 장에서는 LLM 기반 애플리케이션 개발의 전반적인 과정을 정리하고, 앞으로의 발전 방향 및 최적화 기법에 대한 고찰을 제공한다.
스트림릿(Streamlit) 같이 심플한 UI 만을 위한 라이브러리 소개와 o1 에 대한 (퍼포먼스 중심의) 소개가 있고, 단어 정리와 함께 끝난다.