본문 바로가기

AI Agent, LLM/AI Agent 이론

[AI Agent 이론] 1. LLM을 위한 사전 지식

본 게시물은 러닝 스푼즈의 '내 서비스에 딱맞는 AI 에이전트 만들기 : RAG, LangGraph, LLM 파인튜닝' 현장 강의를 듣고 요약 및 재구성한 게시물임을 알려드립니다.

- 강의 관련 url : https://learningspoons.com/course/detail/ai-agent-master/

 

내 서비스에 딱맞는 AI 에이전트 만들기 : RAG, LangGraph, LLM 파인튜닝

나에게 딱 맞는 AI 에이전트를 구현하고 싶다면? 대기업에서 LLM 파인튜닝으로 에이전트 개발을 하고 있는 연구원의 실무 노하우가 가득 담긴 강의!

learningspoons.com


본 강의에서 다룰 키워드

- 오픈소스 LLM 및 API로 이용 가능한 LLM

- rag를 위한 전처리, chunking, vectorDB, 프롬프트 엔지니어링

- rag를 위한 langchain

- LLM 이용 에이전트

SUMMARY

언어모델

- 거대하게는 잘 안만드는데 생성을 예측하는 모델로 언어 모델 정의 자체에 따르면 딥 러닝이어야 할 필요도 없으며, 단지 요즘은 딥 러닝으로 구현할 뿐.

 

LLM

- 트랜스포머 아키텍처를 주로 쓰고 거대한 딥러닝 모델

2017년에 구글이 트랜스포머(인코더-디코더)를 제안
인코더 : 이해능력에 강하고 생성에는 거의 쓰지 못함
디코더 : 생성능력에 강하고 이해 능력이 상대적으로 인코더보다 떨어짐
-> 2017년에 인코더랑 디코더를 연결시켜서 인코더-디코더 모델을 번역기로 제안

그후에 인코더만으로 방대한 데이터로 학습한 모델 : BERT -> 인코더라서 생성에는 잘 안쓰며, 분류/추출/임베딩에는 잘쓰임
디코더만 갖고 방대한 데이터로 학습한 모델 : GPT -> 디코더라서 생성O, 동크기의 인보더보다는 이해능력 저하

트랜스포머 아키텍처데이터만 충분하다면 크기가 커질수록(층이 많음) 성능이 좋아진다는 특징이 있음
• 요즘의 LLM은 디코더를 쓰되 크기가 굉장히 커대해져서 이해,생성 능력에 모두 뛰어남
인코더를 거대하게는 잘 안만드는데 생성을 못하니까 사용성 제한

더보기

[트랜스포머 히스토리]

 

과거
- 인코더-디코더 구조 유지하면서 방대한 텍스트 데이터를 아키텍처가 트랜스포머 이전 시대 모델인 RNN

- 디코더는 단어를 순차적으로 생성하므로 언어 모델이다.

- 인코더: 입력 문장을 이해하여 디코더에게 전달하는 역할 (이해가 핵심)
- 디코더: 인코더가 전달한 문장을 바탕으로 새로운 문장을 생성 (생성이 핵심)
-------------------------------------------------------------------------------------
2015년
- RNN 언어 모델(디코더)에 방대한 텍스트 데이터를 부어서 추가적인 문제를 추가 학습 시키면 성능이 좋아진다.
- 아무 것도 학습하지 않은 RNN보다는 방대한 텍스트 데이터를 읽은 RNN이 다른 문제를 풀 때도 성능이 더 좋다.
-------------------------------------------------------------------------------------
2017년
트랜스포머번역이 목적. 인코더-디코더 구조
 - RNN보다 성능이 더 좋은 아키텍처를 발견.
 - 디코더는 단어를 순차적으로 생성하므로 언어 모델이다.

인코더: 입력 문장을 이해하여 디코더에게 전달하는 역할 (이해가 핵심)
디코더: 인코더가 전달한 문장을 바탕으로 새로운 문장을 생성 (생성이 핵심)
-------------------------------------------------------------------------------------
2018년

- 아무 것도 학습하지 않은 트랜스포머보다는 방대한 텍스트 데이터를 읽은 트랜스포머가 다른 문제를 풀 때도 성능이 더 좋다.

 

> GPT-1 (트랜스포머 디코더 기반 언어모델)
- 트랜스포머 언어 모델(디코더)에 방대한 텍스트 데이터를 부어서 추가적인 문제를 추가 학습 시키면 성능이 좋아진다.

> BERT (트랜스포머 인코더 기반 언어모델)
- 디코더가 아니라서 다음 단어를 생성하는 모델이 아니다보니 글쓰기가 불가능한 생성 문제는 못푸는 모델.
- 텍스트 분류, 키워드 추출
-----------------------------------------------------------------------------------------
BERT와 GPT는 동일한 사이즈 내에서는 텍스트 분류, 키워드 추출, 임베딩 등이 BERT가 우세
BERT와 10배 큰 GPT가 있다면 텍스트 분류, 키워드 추출, 임베딩 등이 GPT가 우세
- 간단한 텍스트 분류가 있는데 LLM으로 하면 잘 하긴 하는데 리소스 낭비가 너무 심한 것 같다.
-----------------------------------------------------------------------------------------
T5
- 인코더-디코더 구조 유지하면서 방대한 텍스트 데이터를 부어서 학습.

#1. LLM 기초

1. 언어모델

- 언어모델이랑 가장 자연스러운 다음 단어(Token)을 예측하는 모델이며

- 따라서 딥러닝이 아니어도 되며, 단지 요즘 딥러닝으로 구현할 뿐

- LLM = Large Language Model : 즉 대규모 언어 모델

2. Transformer(2017, 구글)

- 물론 언어모델의 아키텍처는 트랜스포머일 필요도 딥러닝일 필요도 없지만 최근 자연어 처리를 지배하는 언어 모델은 기본적으로 transformer 아키텍처를 갖고 있음

- 구글이 2017년에 번역기를 만들기 위해서 트랜스포머라는 모델을 제안했고, 번역하고자 하는 문장을 입력하면, 번역 문장이 출력된다.

- 인코더(문장 받아준 후 처리 / 생성 거의 못함)-디코더(처리문장 기반으로 생성 / 이해 어느정도 함)로 구성된다.

- 인코더와 디코더 층이 N개 존재

- 초기 제안될 당시 각 6개의 층으로 구성

2-1) 인코더와 디코더

- 인코더 : 문장 이해 역할이며, 자연어 이해 및 NLU(Natural Language Understanding)에 강하다고 표현

- 디코더 : 최종 번역 문장을 생성하는 역할을 담당하며, 자연어 생성 및 NLG(Natural Language Generation)에 강하다고 표현

- 트랜스포머에서 인코더와 디코더가 하는 역할은 다르며, 트랜스포머로부터 BERT, GPT, BART, T5가 파생

2-2) BERT, GPT, BART, T5

- 초기 트랜스포머는 인코더-디코더로 구성되었는데, 여기서부터 총 세 가지 분류로 나뉘게 됨

 

BERT(이해강점)

- 트랜스포머의 인코더를 분리 후 방대한 데이터로 pre-training

- RAG에서 임베딩 모델로 가장 많이 쓰임

 

GPT(생성 강점)

- 트랜스포머의 디코더만 분리한 후 방대한 데이터로 pre-training

 

BART, T5 (이해와 생성에 강점)

- 트랜스포머의 인코더-디코더 아키텍처를 그대로 사용하면서 pre-training 

2-3) Transformer(2017)의 Inference

- 실제 번역기나 챗봇이 구동될 때에는 디코더가 단어를 1개씩 생성해내야함

- 트랜스포머의 디코더는 기본적으로 '언어모델'

#2. BERT (구글)

구글이 2017년에 제안한 트랜스포머(인코더-디코더) 구조에서 이해에 강점이 있던 인코더를 별도로 분리하여 구글이 ‘BERT’라는 모델을 개발.

- BERT-BASE : 논문 기준 트랜스포머의 인코더만을 사용하고 12층 적재 

- BERT-LARGE : 논문 기준 트랜스포머의 인코더만을 사용하고 24층을 적재

   → 2017년 트랜스포머가 인코더-디코더 구조이며 각각 6층인 것과는 대비

장점) 이해에 강하다는 장점으로 인해 ‘분류’,(이 문장이 긍정/부정/중립인지(글쓰기X)) ‘추출’, ‘임베딩 모델’에 상대적으로 뛰어난 성능을 갖고 있으며

단점) 생성에 적합하지 않아서 일반적으로 LLM(디코더)처럼 글쓰기와 같은 용도로 쓰지 못한다. 
   → 요즘과 같이 RAG 시대에서는 임베딩 모델로 많이 사용되고 있다.                                                                                                      

#3.  GPT(Open AI) : Transformer Decoder

구글이 2017년에 제안한 트랜스포머(인코더-디코더) 구조에서생성에 강점이 있던 디코더를 별도로 분리하여 OpenAI가 ‘GPT’라는 모델을 개발.
장점)
- BERT와 같은 인코더 모델들과는 달리 생성이 가능하다는 특징이 있으므로 글쓰기와 같은 문제를 푸는 일에 사용된다. Ex) 요약, 생성, 보고서 작성 등…다음 단어를 생성하는 ‘언어 모델’의 정의에 부합하며
- 이러한 GPT와 같은 모델들이 크기가 거대해지고 학습 데이터의 양이 증가하면서 성능이 비약적으로 좋아지기 시작했고, 이를 거대 언어 모델(LLM)이라 명칭한다.

1. BERT VS GPT

BERT

- 양방향의 문맥을 반영하여 가운데 단어에 집중하는 방식으로 pre-training된 BERT

- BERT는 마치 가운데 단어 빈칸채우기 문제를 푸는것처럼 학습되어 양방향 문맥을 반영하는 특징 => 생성에는 적합하지 않음

 

GPT
- 이전 단어들로부터 다음 단어를 예측하도록 pre-training된 GPT => 생성에 적합함. (ex. 글쓰기 등)

2. GPT의 동작 방식 : 언어모델

- 언어모델이란, 이전 단어들로부어 다음 단어를 예측하는 모델을 의미 

3. 파라미터 수 이해하기 

딥러닝 언어 모델의 파라미터 개수를 말할 때는 10억(B)라는 표현을 사용함

- 파라미터 수가 클수록 보통 성능이 좋지만, 그만큼 더 많은 GPU를 필요로함

- GPT-3의 파라미터수는 175B, LLama-3의 파라미터 수는 70B
   -> url : https://huggingface.co/meta-llama/Meta-Llama-3-70B

4. GPT의 발전

- GPT-1, GPT-2, GPT-3는 사실 아키텍처 면에서 큰 차이가 없고, 차이는 학습한 데이터의 양과 모델의 크기

- GPT-3.5와 GPT-4는 구체적인 크기 등은 공개되지 않았음

#4. Pre-training in NLP

Pre-training

- 사전 학습 즉, 미리 학습되어진 모델이라는 의미로, 우리가 사용하고 있는 대부분의 LLM들은 사전학습된 모델들임

- 대기업 아니면 사실상 불가능

- 7B 모델 사전학습을 시도하면, 한 번에 성공하고 데이터도 다 준비되어져 있고 거의 확실하게 모든 하이퍼파라미터 세팅이 되어있어 한 번에 성공한다는 가정 하에 1억 내외 예상

- 하지만 요즘은 작은 모델(1~10B)에도 데이터를 붓는 게 추세이므로 데이터 양을 늘리고 조금 시행착오를 거친다면 수억, 수십억으로 금방 증가하게 됨

 

Fine-tuning

- 미리 학습되어진 모델들을 갖다가 우리의 데이터로 추가학습을 하는 것

#5. BART와 T5

1. BART (페이스북(메타))

1-1) BART, Bidirectional Auto-Regressive Transformer

- 트랜스포머 인코더 : MLM(Masked Language Model) 방식으로 가운데 단어 예측 => BERT / NLU에 강함

- 트랜스포머 디코더 : 이전 단어들로부터 다음 단어 예측 => GPT / NLG에 강함

- 기존의 트랜스포머는 인코더-디코더 구조였으며, 인코더-디코더 구조 자체를 다시 활용해보자

- 트랜스포머 인코더-디코더를 모두 사용하여 pre-training시키며, 입력 문장에 노이즈를 추가한다.(Masking)

- 인코더로부터 정보를 받아 디코더에서 원래 문장을 복원한다.

- 인코더-디코더 구조는 입,출력의 길이가 달라도되므로 유연한 masking이 가능

- auto-regressive transformer(디코더) : 앞 단어들로부터 다음 단어를 순차적으로 예측하는 방식으로, 현재 단어를 예측할 때 앞 단어까지만 참고하게 함

-> 즉, BART = Bidirectional(인코더) + auto-regressive(디코더) + Transformer = 트랜스포머의 인코더/디코더를 전부 사용

1-2) BART의 Pre-training

- 다양한 noise를 추가하는 방식을 사용

- Bert에 비해 다양한 사전학습을 NLU 성능도 높였으며, BERT와 달리 디코더도 있으므로 NLG 또한 가능

1-3) BART의 NLU 성능

- NLU 태스크에서도 강한 모습을 보임

- BERT보다 높으며, RoBERTa(BERT)의 개선버전)과 유사한 성능

1-4) BART의 구조 : 트랜스포머와 다를 바 없음 (즉, 인코더 + 디코더 구조)

2. T5(Google) 

Text-to-Text Framework

- 새로운 Fine-tuning 방식을 사용한다.

- BART와 같이 인코더-디코더 방식

- 모든 downstream task들을 하나의 방식(NLG)로 처리한다.

- 텍스트 분류에서도 클래스 인덱스 예측 방식은 No

- 별도의 새로운 layer 추가 필요 없이 기존 모델 그대로 fine-tuning 가능

더보기

T5를 쓰면 LLM 대비 효율도 좋은데 왜 요즘 LLM은 디코더로만 하게 되었을까?
• 신경쓸게 많아짐. 즉 토큰관리를 둘다 해야되는데 디코더만하면 디코더만 신경쓰면 된다.
• 예를들어 전체 토큰이 8000이라고 하면 디코더는 입력이 7000이면 출력이 1000이면 되는데
   인코더-디코더로하면 인코더가 입력이 4000이고 디코더 출력이 4000이라고하면 전체 토큰은 8000인데 인코더가 입력이 4000이고 디코더 출력이 4000이라고 하면 입력은 5000이나 6000을 못넣는다. 
• 크로스어텐션 부분이 학습 시 병목이다

#6. GPT-3와 LLMs

프롬프트 엔지니어링 : In-context Learning

- LLM에서는 별도의 fine-tuning 과정없이 예시 몇 가지만으로 학습한 효과를 낼 수 있음

- 예시없이(zero-shot), 예시 1개(one-shot), 예시 몇 개(few-shot)

- 이 때 파인튜닝의 경우 파라미터 업데이트는 없음

#7. LLM에서의 Tokenization

1. 딥러닝 Tokenizer (KoGPT-2)

- 입력 문장에 대해 의미 단위가 아닌 자체 알고리즘에 의해 토큰화

- open ai의 경우 한글을 예전에는 한글자씩 토크나이징해서 효율이 낮았으나 요즘은 개선되었음 

2. 토크나이저(Tokennizer)

2-1) 토크나이저란?

- 토크나이저 : 언어모델이 텍스트를 분할하기 위해 사용하는 도구 or 방식을 의미

- 언어 모델마다 동일한 텍스트라도 토큰 분리 방식이 다르며 효율도 다르다.

- 예를들어 Open AI의 GPT만 하여도 최근 GPT 토크나이저는 이전 GPT보다 한글을 더 효율적으로 분할한다.

2-2) 토크나이저 효율 : 동일 텍스트에 대해 더 적은양의 토큰으로 분할되는 것이 중요한 이유

① 언어 모델의 생성 속도에 영향을 미친다. (언어 모델은 토큰을 1개씩 생성하며 글을 완성)

② 일반적으로 사용한 토큰만큼 과금이 되는 구조

2-3) GPT-40 VS GPT-3.5-trubo VS CLOVA-X

- 동일한 텍스트 입력에 대해 토큰 효율 및 비용을 따져보면 네이버가 상대적으로 한글 효율이 좋다는 것을 알 수 있음

- 물론, 토큰 효율과 LLM의 성능을 모두 고려하여 결정해야 함

- Open AI는 영어 데이터를 훨씬 많이 학습하여 영어가 훨씬 토큰 소모가 적음

  -> 이는 학습 시 훨씬 많이 관측한 단어일수록 토큰의 우선 순위가 높아지는 Byte Pair Encoding 방식 때문

- 따라서, 많은 호출을 요하는 경우, 프롬프트를 영어로 작성하는 게 과금 절약에 도움이 될 수 있음

- 특히, ChatGPT가 아닌 오픈 모델(라마3, Qwen, Gemma 등,...)에서는 영어 프롬프트가 성능에 영향을 줌

2-4) Tokenization -> Integer Encoding

- 토큰화를 수행했다면 각 토큰에 고유한 정수를 맵핑한다.

- 이 때, 각 토큰과 정수의 맵핑표를 단어 집합이라고 한다. (이 때, 중복은 허용되지 않음)

- LLM이 기본적으로 토큰으로 나누는 이유는 결국 정수 인코딩을 하기 위함이다.

- 전처리 순서 : 텍스트 -> 토큰화 -> 정수 인코딩

- LLM마다 아래와 같은 mapping 표가 존재함

2-5) LLM API 

- LLM API 가격을 정리해놓은 사이트 : https://llm-price.com/

#8. 오픈 LLM 살펴보기

1. LLM 리더보드

1-1) Ko-LLM-Leaderboard

- 공개된 LLM을 확인할 수 있는 곳으로 LLM 리더보드 등이 존재

- 많은 모델이 오염(테스트 데이터에 맞추어서 학습)되어져 있어서 참고만 하는 것이 필요

- url : https://huggingface.co/spaces/upstage/open-ko-llm-leaderboard

 

Open Ko-LLM Leaderboard - a Hugging Face Space by upstage

 

huggingface.co

1-2) Logickor

- 상대적으로 ko-llm-leaderboard보다 신뢰도가 높지만 올라와있는 모델 개수가 현저히 적음

- 오픈 LLM뿐만 아니라, API로만 제공되는 LLM들도 포함하여 평가되고 있음

- url : https://lk.instruct.kr/

 

LogicKor | 한국어 언어모델 다분야 사고력 벤치마크

LogicKor은 한국어 언어모델의 다분야 사고력을 측정하는 벤치마크입니다. 추론, 수학, 글쓰기, 코딩, 이해, 문법 등 다양한 분야의 사고력을 측정합니다.

lk.instruct.kr

2. 오픈 LLM 사용하기

2-1) 오픈 LLM 제공 사이트 : 허깅페이스

- 기본적으로 오픈 LLM은 웹사이트 허깅페이스에서 제공 (ex. 메타 공개 모델 LLama3)

- url : https://huggingface.co/

 

Hugging Face – The AI community building the future.

The Home of Machine Learning Create, discover and collaborate on ML better. We provide paid Compute and Enterprise solutions. We are building the foundation of ML tooling with the community.

huggingface.co

2-2)  오픈 LLM 확인하기

- 사용하고자 하는 모델을 찾았다면 files and versions 클릭

- 그 후 'config.json' 클릭

- 위에서 128,256개의 토큰 종류가 있다는 뜻은 mapping 표에 vocabulary가 128,256개 등록되어 있다는 뜻

- 그 후 'tokenizer.json' 클릭

- 위 사진에서 우측 그림이 단어 집합이다.

3. 토크나이저와 전처리 

- LLM이 아닌 PLM일 때와 LLM은 전처리의 접근 방식이 다소 다를 때가 많다.
- PLM = Pre-trained Language Model로 미리 학습된 모델이라는 뜻

- 요즘의 LLM은 위와 같은 PLM의 파라미터 크기가 많아지면서 특히 디코더 계열의모델을 의미한다.

- 의미적인 범주로는 PLM > LLM이지만, 전통적인 PLM과 현재의 LLM은 전처리가 다소 다르다. (chat_template 유무 등)

- (ChatGPT 5) 즉, PLM의 경우 태스크별 전처리가 필요했기에 태스크마다 입력 형식을 새로 정의해야 했음. 반면, LLM은 범용 대화형 모델이라, 대부분을 '프롬프트 + chat_template'로 통일해서 처리

#9. RAG (Retrieval-Augmented Generation, 추후 상술)

- RAG : 사용자가 질문을 던지면 질문과 연관되어져 있는 문서들을 찾아냄 (즉, 검색기가 존재)

- 검색기가 문서들을 찾아내면 해당 문서들을 바탕으로 LLM에게 답변을 요구

- 이 경우, LLM은 검색된 문서들을 바탕으로 질문에 대한 답변을 하며, 기학습 지식이 아니고 외부 지식을 바탕으로 답변하게 되는 구조 

- 즉, 사용자가 질의를 하면 이와 미리 Vector DB에 임베딩된 문서들 중 유사도를 구해 이를 기반으로 LLM에 프롬프트와 함께 증강된 컨텍스트로 질의를 하며, LLM은 이를 바탕으로 답변을 보낸다.

- 참고자료 : https://www.slideshare.net/slideshow/2024-05-01-rag-rag/269542352#4

#10. 임베딩과 검색기

1. 임베딩(Embedding)

- 임베딩 : 텍스트를 벡터로 변환하는 과정으로, 텍스트를 임베딩 모델로 벡터 변환이 가능하다.

- 임베딩 모델은 직접 공개된 모델을 다운로드하여 사용하는 방법과 API로 제공받는 것 총 두가지 방식이 있음

- 공개된 모델을 다운로드하여 사용하는 경우 '보안', '직접 도메인에 맞게 학습하여 성능 최적화' 하는 등의 이유가 존재한다.

2. 임베딩 모델 (공개 모델 vs API로 사용)

- 텍스트를 임베딩하고 나면 텍스트끼리의 유사도 구하는 것이 가능함. 즉, 검색기를 만들 수 있음

3. 검색기의 구현

- 텍스트를 벡터로 변환한 후 임베딩 벡터 간의 유사도를 구할 수 있고 이를 이용하여 '검색기'를 구현할 수 있음

- 두 벡터의 유사도를 구하는 방법으로 대표적으로 코사인 유사도가 존재

4. RAG

- RAG : 검색으로 증강된 답변을 생성한다. 즉, LLM의 지식에 외부의 지식을 추가하여 답변한다.

   → R(retrieval) : 검색 / A(Augmented) : 증강되었다. / G(Generation) : 생성한다.

- RAG에서는 사용자가 질문을 던지면 질문과 연된되어져 있는 문서들을 찾아낸다. (즉, 검색기가 존재한다.)

- 검색 결과를 바탕으로 LLM에게 질문에 대한 답변을 요구

- 검색된 내용을 바탕으로 답변하므로 내 데이터만을 이용하여 답변하는 챗봇 구현이 가능하다.

- 챗봇이 거짓말하는 현상인 '할루시네이션'을 급감시킬 수 있는 효과

- 임베딩으로 검색기를 구현한다는 것은 기존 문서들의 임베딩을 보관할 장소가 필요하다는 것

- Vector DB : 기존 문서들의 임베딩을 보관

#11. 토큰 임베딩과 문서 임베딩의 차이

1. 문장/문서 임베딩 vs 토큰/단어 임베딩

- 앞에서 예시로 들었던 임베딩은 기본적으로 문장/문서 임베딩을 전제하여 설명했었음

- 하지만 문장/문서 임베딩과 토큰/단어 임베딩은 별개임 => 임베딩의 단위는 다르다는 것을 인지해야함

- 트랜스포머의 구조를 보면 각 토큰은 전부 임베딩이 되어 입력으로 사용되고 있음

2. 토큰 임베딩은 입력, 문장 임베딩은 출력

- BERT, GPT, LLM 할 것 없이 모든 텍스트는 전부 토큰화 된 후에 각 토큰은 토큰 임베딩이 되어 입력으로 사용

- 모델의 입력 단에서 텍스트가 토큰화된 후 토큰이 '임베딩'되어서 모델의 입력으로 사용되는 것과 임베딩 모델(BERT 등)을 통해서 문장이 모델의 출력으로 문장 임베딩을 얻는 것은 구분되어야 함

3. 토큰 임베딩의 과정