Prompt Engineering, PEFT, RAG – LLM이 외부 정보를 사용하는 세 가지 방법

This entry is part 11 of 13 in the series Language Model

1. 들어가며

최근의 LLM은 정말 대단한데요. 대표적으로 chatGPT를 사용하다보면 현재 사람이 하고 있는 일 중에서 AI가 하지 못할 일이 있을까? 라는 의문이 자연스럽게 들곤 합니다. 그럼 현재 AI의 대표격인 LLM은 만능일까요? 무엇이든지 할 수 있고 약점은 없을까요?

현재의 LLM에도 약점은 있습니다. 어찌되었든 데이터를 바탕으로 다음 단어를 예측하도록 학습한 모델이기에, 학습 데이터에 없는 내용에 대해서는 대답 정확도가 크게 떨어진다는 점이죠. 예를 들어 볼게요. 전기차 영업점에서 특정 전기차 모델의 판매량을 예측하고 싶다고 가정해보겠습니다. 그래서 chatGPT에게 다음달 EV6 모델의 판매량을 예측해달라고 요청해봤습니다.

그림1. chatGPT로 EV6 판매량 예측하기
그림1. chatGPT로 EV6 판매량 예측하기

위 그림은 GPT3.5 모델에게 다음달 EV6 판매량을 예측해달라고 요청한 실제 모습인데요. GPT3.5 모델은 22년 1월 데이터까지만 알고 있기에 정확한 예측은 할 수 없다고 대답하는 모습입니다.

물론 GPT4 모델은 더욱 최신 정보까지 학습되어 있습니다. 하지만 최신 정보를 더 많이 아는것과, 다음달 EV6 판매량을 ‘예측’ 하는 것은 다른 문제이죠. 아무리 최신 정보를 많이 알아도, 그 정보들을 바탕으로 학습 데이터에 없는 내용을 ‘예측’ 해야 하는 일 이니까요.

chatGPT를 사용하여 특정 전기차 판매량을 예측하기 위해서는 ‘외부 지식’을 사용해야 합니다. 과거 전기차 판매량 뿐만 아니라, 전기차 판매량을 예측하기 위한 다양한 노하우, 지식들을 활용해야 하죠. 이렇게 LLM이 외부 지식, 정보를 사용하는 방법은 크게 세 가지가 있습니다. Prompt Engineering, PEFT, RAG가 그것인데요. 이번 글에서는 이 세 가지 방법에 대해 살펴보려고 합니다. 각 기술이 무엇인지 살펴볼거구요. 어떠한 연구들이 진행되고 있는지, 대표적인 방법은 무엇인지 살펴보겠습니다.

2. Prompt Engineering

처음으로 살펴볼 방법은 Prompt Engineering 입니다. Prompt는 LLM의 입력 또는 질문이라고 이해하시면 됩니다. LLM은 질문을 어떻게 구성하는지에 따라 그 대답이 크게 달라지는데요. 이러한 포인트에 착안하여 Prompt를 잘 구성하여 좋은 대답을 얻어내기 위한 연구 분야를 Prompt Engineering이라고 합니다. Prompt Engineering은 LLM의 성능을 개선하기 위한 대표적인 방법 중 하나이며, LLM의 탄생과 그 시작을 같이 한다고 해도 과언이 아니죠.

Prompt Engineering은 LLM에게 ‘좋은 질문’을 만들어 주는 모든 방법을 말하는데요. 이러한 Prompt Engineering을 어떻게 활용하면 LLM에게 외부 정보를 활용하게 만들어줄 수 있을까요? 한 마디로 말해서 외부 지식, 정보를 활용하여 Prompt를 잘 구성해주는겁니다.

그림2. Prompt Engineering 방법
그림2. Prompt Engineering 방법

위 그림은 이렇게 외부 정보, 지식을 활용하여 Prompt를 구성하는 방법을 표현하고 있습니다. 다시 EV6 전기차 판매량을 예측하는 상황으로 돌아가볼게요. 처음에는 질문으로 곧바로 EV6 전기차의 다음달 판매량을 예측해달라고 Prompt를 입력했는데요. 이렇게 질문해서는 외부 정보를 활용할 수 없습니다. chatGPT에게 아무 정보도 주지 않았으니까요.

대신 Prompt를 이렇게 구성해보는거에요. 먼저 직업과 할일을 정해주는겁니다. 그리고 활용할 수 있는 정보, 예를 들면 과거 EV6 판매량을 알려주고요. 전기차 판매량은 월 별로 어떠한 특성을 갖는지 설명해주는겁니다. 이러한 정보는 실제 전기차 판매량을 예측하는 일을 하는 전문가들이 활용하는 지식과 노하우들에 해당할텐데요. Prompt에 이렇게 외부 지식과 정보를 추가해줌으로써 LLM은 단순한 언어 모델을 넘어 실제 전기차 판매량 예측 전문가처럼 예측을 할 수 있게 됩니다.

위에서 언급한 사례는 사실 Prompt Engineering의 아주 기초적인 방법이라고 할 수 있는데요. LLM의 부상과 함께 다양한 Prompt Engineering 방법론들이 연구되고 있습니다.

그림3. 다양한 Prompt Engineering 연구들
그림3. 다양한 Prompt Engineering 연구들 [7]

위 그림은 방법에 따른 다양한 Prompt Engineering 연구를 보여주고 있습니다. 이번 글에서는 이 중 가장 대표적인 방식인 Chain of Thought (CoT) 방식에 대해 간단하게 살펴보겠습니다.

CoT는 가장 초창기 Prompt Engineering을 대표하는 방식 중 하나인데요. LLM이 기본적인 대화는 잘 하지만 산수 추론, 상식 추론, 기호 추론 등 특정 분야에서는 능력이 매우 떨어진다는 문제점을 제기했습니다.

그림4. Few Shot Learning
그림4. Few Shot Learning 예시

GPT3에서는 Few Shot Learning 방법을 사용하면 LLM의 성능이 크게 향상된다는 점을 밝혔죠. 하지만 위 그림과 같이 산수 추론 문제 등에서는 이러한 Few Shot Learning 방식이 크게 효과가 없는 모습을 볼 수 있습니다. 애초에 산수 원리를 이해하지 못한 아이에게 단순히 정답을 몇개 외우게 해 봤자 큰 의미가 없는거죠. Chain of Thought에서는 그래서 아얘 LLM에게 산수의 원리를 가르쳐주자고 주장합니다. 산수의 원리는 조금 거창하고요, ‘문제 풀이’ 를 가르쳐 주자는거죠. 최소한 이런 문제는 이렇게 생각해서 이러한 순서를 따라가며 더하고 빼주는 정도만 하면 되는거야, 라고 가르쳐주는거에요.

그림5. Chain of Thought Prompting 예시
그림5. Chain of Thought Prompting 예시

위 그림은 동일한 문제에 대한 Chain of Thought Prompting 예시인데요. 그림을 보면 Few Shot 샘플로 단순히 문제에 대한 정답만 알려주지 않습니다. ‘풀이 과정’을 알려주고 있죠. 이렇게 ‘풀이 과정’을 알려줬더니 이번에는 비슷한 문제에 대해 제법 그럴듯한 문제 풀이 과정을 거쳐서 정답에 도달하는 모습을 보여줍니다. 이렇게 ‘풀이 과정’이라는 외부 지식을 Prompt에 녹여주는 방법을 통해 Chain of Thought는 당시 LLM의 약점이라고 손꼽혔던 산수 추론, 상식 추론, 기호 추론 문제 등에서 큰 성능 향상을 보였습니다.

3. PEFT

이렇게 Prompt를 잘 구성해주면 분명 LLM에게 외부 지식을 활용할 수 있게 만들 수 있습니다. 하지만 뭔가 아쉽다는 느낌이 드는데요. 우선 매번 이렇게 Prompt를 구성해준다면 입력 토큰이 매우 길어지겠죠. 이에 따른 Inference 비용이 만만치 않을 겁니다. 물론 한번 물어보고 말거라면 큰 문제가 없겠지만, 어떠한 시스템을 구축하여 지속적으로 Inference 해야 하는 상황이라면 얘기가 다르죠. 이때는 Inference 비용을 최소화하기 위해 다른 방법을 구상해야 합니다.

이럴때는 자연스럽게 LLM을 Fine Tuning해서 내가 하고자 하는 과제에 특화된 LLM으로 만들자는 생각이 드는데요. 문제는 LLM을 Fine Tuning 하는 작업이 기존 딥러닝 모델들때처럼 간단하지가 않다는겁니다. 그 크기 때문인데요. LLM은 말 그대로 초 거대 모델이죠. 학습 파라미터가 매우 많습니다. Fine Tuning이라는 개념 자체가 모델을 처음부터 학습하는건 비효율적이니, 효율적으로 일부 데이터만 사용해서 학습하자는 개념인데요. 아무리 적은 데이터를 사용한다고 해도 LLM 자체가 워낙 크기 때문에 LLM을 학습한다는 개념 자체가 비효율적인것이죠.

이러한 문제 의식에서 등장한 개념이 바로 PEFT입니다. Parameter Efficient Fine Tuning의 약자인데요. 말 그대로 LLM에 특화된, 더 효율적으로 Fine Tuning을 하기 위한 방법인거죠. PEFT 과정은 다음과 같이 구성되어 있습니다.

그림6. PEFT 구조
그림6. PEFT 구조

먼저 Fine Tuning을 위해서는 질문과 대답이 매칭되어 있는 데이터셋이 필요합니다. LLM은 이렇게 구성되어 있는 Supervised Dataset을 사용하여 학습하게 되죠. 이때 Supervised Dataset을 만드는 과정에서 우리의 외부 정보와 지식이 사용되는데요. 무의미한 질문과 정답을 만드는게 아닌, 우리가 원하는 과제만을 수행하기 위한 질문과 대답을 만들어줘야 하고, 이를 위해서는 반드시 이에 특화된 지식과 정보가 필요하기 때문이죠.

이렇게 만들어진 Supervised Dataset은 이제 LLM을 Parameter Efficient하게 Fine Tuning하기 위해 사용되어야 하는데요. 생각해보면 LLM의 학습 파라미터를 건드리는건 위험합니다. 아주 많은 데이터셋으로 학습하며 일반적인 지식에 대한 능력을 크게 키운 LLM인데, 적은 데이터로 이러한 파라미터를 건드리면 일반적인 지식이 크게 손상될 수 있기 때문이죠. 이러한 이유로 PEFT에서는 일반적으로 LLM의 학습 파라미터는 고정해놓습니다. 대신 학습할 수 있는 추가적인 파라미터 (Additional Trainable Parameters)를 추가해주죠. 그리고 이렇게 추가된 파라미터들은 기존 LLM과 같이 연산되며 특정 Task에 특화되어 대답하도록 학습됩니다.

그림7. 다양한 PEFT 방법들
그림7. 다양한 PEFT 방법들 [8]

위 그림은 다양한 방식의 PEFT가 분화되어 발전되는 모습을 보여주고 있습니다. PEFT도 Prompt Engineering과 마찬가지로 LLM의 인기와 더불어 성장해온 모습을 볼 수 있습니다. LLM이 상업화되며 본격적으로 다양한 PEFT들이 연구, 발표되고 있다고 볼 수 있죠.

이번 글에서는 가장 대표적인 PEFT 방식인 LoRA에 대해 간략하게 살펴보겠습니다. LLM은 사실 거대한 Transformer 모델이라고 볼 수 있는데요. 모든 LLM들은 공통적으로 Transformer를 기반으로 설계되어 있죠. 그리고 이러한 Transformer의 핵심은 Self Attention Layer라고 할 수 있습니다. 따라서 LLM의 대답을 바꾸고 싶다면 어떤 식으로든 이 Self Attention 연산을 건드려야 하는데요. 문제는 이 Self Attention의 연산량이 어마어마 하다는 겁니다. Self Attention을 계산하기 위해서는 Query, Key, Value를 계산해야 하는데요. 이때 사용되는 Matrix의 크기가 매우 크기 때문입니다.

요약을 하자면 LLM의 대답을 바꾸고 싶다면 Self Attention 연산을 위한 Matrix를 바꿔야 하는데, 이 연산량이 너무 크다는것이 문제인데요. LoRA의 저자들은 ‘그럼 Self Attention Matrix는 과두고, 아주 적은양의 연산만 추가해서 이 과정을 조금 틀어주자’ 라고 얘기합니다.

그림8. LoRA 방법
그림8. LoRA 방법

위 그림은 Full Fine Tuning과 LoRA의 Self Attention 연산 과정을 비교하고 있는데요. d*d Matrix가 바로 Self Attention Matrix 입니다. d가 커지면 엄청나게 큰 사이즈의 Matrix가 되겠죠. LoRA에서는 그래서 이러한 Self Attention Matrix는 Freeze 한 채로 병렬 연산을 추가해준 모습을 볼 수 있습니다. 겨우 1*d와 d*1 Matrix를 사용해서 동일한 사이즈의 Output을 만들어내고 있죠. 이렇게 나온 새로운 Output은 기존 Output에 더해지게 됩니다. 결과적으로는 2d 사이즈의 파라미터만을 추가 학습하여 기존 연산 과정의 방향을 틀어준 셈이 되는 것이죠.

그림9. LoRA의 성능
그림9. LoRA의 성능 비교

이렇게 LoRA는 아주 적은 파라미터만을 추가 학습했음에도 불구하고 멋진 성능을 보여주는데요. 위 그림은 동일한 RoBERT LLM을 사용하여 다양한 Fine Tuning 방법을 사용한 성능을 비교하는 표 입니다. 재미있는건 Full Fine Tuning대비 0.1% 수준의 파라미터만을 Fine Tuning 했음에도 Full Fine Tuning 성능보다도 종종 좋은 성능을 보인다는 점입니다.

PEFT는 LoRA 이후에도 아주 많은 연구들이 발표되고 있습니다. 이에 따라 성능은 지속적으로 발전하고 있고요. 앞으로도 다양한 방법이 등장하여 LLM의 Fine Tuning을 더욱 효율적이고 효과적으로 만들어줄 것으로 기대됩니다.

4. RAG

여기까지 Prompt Engineering과 PEFT 방식을 살펴봤는데요. 그럼에도 아직 어딘가 찝찝한 기분을 지울 수가 없습니다. 어쨌든 위의 두 가지 방법은 외부 지식과 정보를 내가 직접 사용해줘야 하잖아요? 예를 들어 전기차 판매량을 예측하기 위해서는 내가 직접 전기차 판매량 노하우를 공부하고, 이를 Prompt에 잘 녹여줘야 하죠. 이러한 노하우를 잘 녹여줄 수록 LLM의 성능은 좋아지게 되고요. 이렇게 번거로운 작업 없이 외부 정보를 LLM이 알아서 잘 활용하도록 만들어줄 수는 없을까요?

이럴때 사용하기에 좋은 방법이 RAG인데요. RAG는 Retrieval Augmented Generation의 약자입니다. 이름에서 알 수 있듯 ‘검색’ 기능을 핵심으로 하는 방법인데요. 내 질문에 대해 외부 데이터로부터 적절한 정보를 ‘검색’해서 대답에 활용하는 것이 RAG의 골자입니다.

그림10. RAG의 구조
그림10. RAG의 구조

위 그림은 RAG 방식의 공통적인 Architecture를 표현하고 있습니다. 위에서 설명한 ‘내 질문에 대한 적절한 정보를 외부 데이터로부터 검색하여 대답에 활용한다.’ 는 문구를 잘 유념하며 그림을 보면 쉽게 그 구조를 이해할 수 있는데요. 먼저 가장 왼쪽 위에는 질문이 있습니다. 이 질문은 LLM이 Embedding으로 변환해주고요. 왼쪽 아래에는 외부 데이터가 있습니다. 마찬가지로 LLM을 사용하여 Embedding으로 변환해줍니다. 이렇게 변환된 외부 데이터 Embedding중에서는 질문에 대답하기 위해 필요한 정보가 존재할텐데요. 이 정보를 찾아내야 합니다. 이때 사용되는게 바로 ‘검색’ 이죠. 각 RAG 모델마다 이때 사용하는 검색 방법이 다르고, 이에 따라 다양한 특징을 보여줍니다. 이렇게 찾아낸 정보는 질문과 결합되어 최종적으로 대답으로 나오게 되는데요. 이때도 마찬가지로 LLM이 사용됩니다.

요약해보면 이렇습니다. RAG라는 구조는 거의 대부분 공통적으로 세 가지의 LLM을 필요로 합니다. 첫 번째는 질문을 Embedding으로 변환하기 위한 LLM이고요. 두 번째는 외부 정보를 적절히 나누어 각각 Embedding으로 변환하기 위한 LLM입니다. 마지막으로 세 번째는 질문과 외부 정보를 결합한 Embedding을 입력으로 받아 원하는 대답을 출력하기 위한 LLM이죠. 각각의 RAG 모델들은 사용하는 LLM이 다르고, 어떠한 LLM은 Freeze하고, 학습할지에 대한 전략이 다릅니다. 그리고 또 한가지 결정적으로 ‘검색’ 하는 방법도 다르죠.

그림11. 다양한 RAG 방법들
그림11. 다양한 RAG 방법들 [9]

RAG 또한 LLM의 발전과 함께 다양한 연구들이 발표되고 있습니다. 가장 아래쪽 가운데에 RAG라는 모델이 위치해 있는데요. 지금까지 RAG라고 불렀던 이 기술은 사실 2020년도에 발표된 RAG라는 논문의 제목이었습니다. 이후 ‘검색’을 사용하여 외부 데이터를 LLM에게 학습하는 방법을 RAG라고 총칭하게 되었죠.

이번 글에서는 RAG의 대표적인 방법인 RAG에 대해 간단하게 살펴볼건데요.

그림12. RAG Architecture
그림12. RAG Architecture

위 그림은 2020년 NeurIPS에 발표된 RAG의 Architecture를 표현하고 있습니다. 지금까지 설명한 RAG의 공통 구성에서 크게 벗어나지 않은 모습을 볼 수 있습니다. 질문과 외부 정보를 Embedding으로 변환하기 위해서는 BERT LLM을 사용하고 있고요. 검색을 위해서는 Nearest Neighbor 알고리즘을 사용하고 있는 모습입니다. 최종적으로 대답을 출력할때는 BART LLM을 사용하고 있습니다. 이때 외부 정보를 변환하는 LLM은 고정한 채, 나머지 LLM들만 학습해주는 모습을 볼 수 있습니다.

RAG도 앞서 살펴본 Prompt Engineering, PEFT와 마찬가지로 지금 이순간에도 계속해서 혁식적인 논문들이 발표되고 있습니다. 이에 따라 앞으로도 지속적으로 개선될것으로 기대할 수 있습니다.

5. 마치며

지금까지 LLM이 외부 정보를 활용하기 위한 세 가지 방법에 대해 살펴봤습니다.

가장 먼저 Prompt Engineering 에 대해 살펴봤는데요. Prompt Engineering은 가장 간단하게 LLM에게 외부 정보를 녹여줄 수 있는 방법이라고 할 수 있습니다. 이건 오히려 ‘AI’의 영역이라기 보다는 ‘글쓰기’ 를 통한 ‘Engineering’ 영역에 가깝다고 할 수 있습니다. 별다른 AI 지식이 필요하지 않고, 오히려 문제를 잘 이해하고, 많은 노하우를 갖고 있고, 설명을 잘 하는 능력이 필요하기 때문이죠. 때문에 AI 개발자가 아니어도, 누구나 시도해볼 수 있는 접근이라고 할 수 있습니다. AI 전문가보다는 오히려 해당 문제를 잘 푸는 전문가가 훨씬 잘 활용할 수 있는 방법이라고 정리할 수 있겠습니다.

다음으로 살펴본 방법은 PEFT 였습니다. LLM을 Fine Tuning 하는 방법인데요. Prompt Engineering과 유사한 개발 과정이 필요하지만, 특정 문제에 대한 질문과 대답을 만들어 아얘 LLM을 학습해주는 방법이죠. 이렇게 되면 특정 문제에 특화된 LLM을 만들어줄 수 있다는 장점이 있습니다. 반면 Prompt Engineering과 비교해보면 어떤식으로든 LLM을 Fine Tuning 해줘야 한다는 ‘기술적’인 과정이 필요하다는 특징이 있습니다. 이러한 기능은 분명 openAI 등 LLM을 활용하는 기업에서 쉽게 사용할 수 있도록 제공해줄 것으로 예상됩니다.

마지막으로 살펴본 방법은 RAG 였습니다. RAG는 앞선 두 가지 방법과는 차별화된 특징이 있는데요. 나의 노하우나 노력이 덜 필요하다는 점입니다. 그저 외부 지식을 제공해주고, 학습만 해주면 되죠. 그럼 LLM이 본인에게 필요한 외부 정보를 찾는 과정을 알아서 학습합니다. 따라서 사용자가 문제를 풀기 위한 노하우가 부족하고, 외부 데이터양이 많다면 활용하기에 적합한 방법이라고 할 수 있습니다. 물론 RAG는 효과적이지만, 학습 데이터를 정리하고 구축하는 데 상당한 노력과 시간이 필요하다는 점을 고려해야 합니다. 이 과정은 전문 지식과 데이터 처리 능력을 요구하며, 때로는 데이터 개인 정보 보호와 같은 윤리적 문제도 고려해야 합니다. 게다가, 학습에 필요한 데이터가 충분하지 않거나, 데이터가 편향되어 있으면, 결과적으로 LLM의 성능이 떨어질 수 있습니다.

이 세 가지 방법 모두 장단점이 있습니다. Prompt Engineering은 빠르고 간단하지만, 논리적 복잡성이나 깊이 있는 분석이 필요한 질문에는 한계가 있습니다. PEFT는 더 정교하고 특화된 결과를 제공하지만, 파라미터 튜닝과 데이터 준비에 더 많은 노력과 전문 지식이 필요합니다. 마지막으로 RAG는 매우 강력하고 유연하지만, 데이터 준비와 처리 과정이 복잡하고 시간이 많이 소요됩니다.

결국, LLM을 사용할 때는 이러한 방법들을 상황과 필요에 맞게 선택하고 조합하는 것이 중요합니다. 사용자의 목표, 사용 가능한 데이터, 그리고 기술적 능력에 따라 가장 적합한 접근 방식을 선택해야 합니다.

이상으로 LLM이 외부 정보를 활용하는 세 가지 주요 방법에 대해 알아보았습니다. 각각의 방법은 그 자체로 강력하지만, 이들을 현명하게 조합하고 적용한다면 더욱 효과적인 결과를 얻을 수 있을 것입니다. 앞으로도 LLM 기술의 발전과 함께 이 분야는 계속해서 진화할 것이며, 새로운 방법과 기술들이 등장할 것입니다. LLM을 사용하는 개발자, 연구자, 그리고 사용자들은 이러한 변화를 지속적으로 관찰하고 학습하여, 최신 기술을 최대한 활용할 필요가 있겠습니다.

6. 참고 자료

  1. GPT3 논문 리뷰
  2. BERT 논문 리뷰
  3. Chain of Thought 논문 리뷰
  4. LoRA 논문 리뷰
  5. RAG 논문 리뷰
  6. Transformer 논문 리뷰
  7. Sahoo, Pranab, et al. “A Systematic Survey of Prompt Engineering in Large Language Models: Techniques and Applications.” arXiv preprint arXiv:2402.07927 (2024).
  8. Xu, Lingling, et al. “Parameter-efficient fine-tuning methods for pretrained language models: A critical review and assessment.” arXiv preprint arXiv:2312.12148 (2023).
  9. Lewis, Patrick, et al. “Retrieval-augmented generation for knowledge-intensive nlp tasks.” Advances in Neural Information Processing Systems 33 (2020): 9459-9474.
Series Navigation<< [23′ ICLR] Self Consistence : SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS[22′ NeurIPS] LIFT: Language-Interfaced Fine-Tuning for Non-Language Machine Learning Tasks >>
5 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
Scroll to Top