진로를 LLM과 NLP 쪽으로 설정해놓긴 했고, 또 관련 공부를 많이 하고 있지만 블로그에 정리를 제대로 안 하고 스윽 넘어가기만 했었다. 사실 포스팅을 한 번 쓰면 하루가 그냥 날아가버려서 시간도 모자라고, 그러다 보니 마음도 잘 안 잡혔기 때문이다.
그래서 너무 완벽한 포스팅을 쓰는 것보단 정말 간단하게 LLM 관련 이론들을 하나씩 정리해보고자 한다. 사실 정리하면서 확실히 개념을 잡고 싶은 생각이 더 크지만.
가장 먼저 아주 핫한 토픽들 중 하나인 RAG, Retrieval-Augmented Generation 에 대해 정리하려고 한다.
RAG와 Hallucination
https://www.youtube.com/watch?v=T-D1OfcDW1M&t=15s&ab_channel=IBMTechnology
RAG의 개념을 IBM의 엔지니어 한 분이 아주 쉽게 설명해주신다. 다른 영상들도 몇 개 봤는데 이 분의 설명이 가장 깔끔하면서 명확하다.
내가 돌아다니면서 본 RAG의 개념은, 'LLM을 외부 인터넷과 연결시켜 그 답변의 근거를 찾는 기술' 이다. 나는 2월부터 ChatGPT의 가장 큰 단점을 늦은 데이터베이스의 업데이트가 아닌 바로 '환각(Hallucination)' 문제라고 생각했다.
환각 현상을 가장 단적으로 보여주는 사진이다. GPT같은 트랜스포머 모델들은 기본적으로 질문과 가장 비슷한 개념을 데이터베이스에서 찾고, (벡터를 이용) 알맞은 대답을 꺼내 사람들에게 보여준다. 이 가장 비슷한 개념이 문제인데, 몰라서 못 알려준다라고 말해야 하는 부분마저도 그나마 가장 똑같은 답변 하나를 꺼내서 그럴듯하게 보여준다는 것이다.
환각을 정의하는 문장을 가져와봤다. 환각 : NLP의 컨텍스트에서 제공된 학습 데이터에 상관없이 믿을 수 없거나(unfaithful) 터무니 없는(non-sensical) 텍스트를 생성하는 현상이다.
이런 환각 현상을 포함해 많은 문제들은 LLM의 심각한 Challenge로 여겨졌으며, 이를 해결하기 위해 다방면으로 노력한 것으로 보인다. 그렇게 나온 해결법들 중 하나가 RAG 이다.
사실 RAG의 개념은 간단하다. 순서도로 설명하면,
1. LLM을 특별한 데이터 저장소(인터넷이 될 수도 있고, 회사 내에서 쓰인다면 회사 규정일 수도 있는)와 연결한다.
2. 유저가 프롬프트로 질문을 하면, LLM은 이 데이터 저장소를 먼저 쭉 찾아본다.
3. "유저가 이런 질문을 하는데, 이거에 대해서 아는 게 있나?"
4. 이때 저장소에서 유저의 질문과 유사한 부분이 있으면, 이에 맞게 대답을 해준다.
5. 없으면 학습될 때 사용된 정보들로 유저에게 알려준다. 혹은, 그냥 모른다고 대답한다.
즉, LLM을 Training 혹은 Fine-Tuning 시켰을 때의 데이터만 사용하는 것이 아닌, 추가적인 외부 데이터들도 사용하겠다는 의미이다. 이렇게 되면 다음과 같은 장점들이 발생한다.
1. 답변의 근거를 제시할 수 있어 유저가 더욱 믿을 수 있다.
2. 정보의 업데이트가 필요하지 않으며, 최신 정보에도 잘 대답할 수 있다.
3. 데이터 저장소에 회사 규정을 적어놓으면, 관련 질문을 받았을 때 데이터 유출을 방지할 수 있다.
4. 이용 가능한 정보의 양이 어마무시하게 많아진다. Train된 정보 외의 정보들도 사용 가능하기 때문이다.
가장 매력적으로 느껴지는 부분은 환각 해결과 비용 부분이다. 초거대 모델들을 새로 학습시키거나 파인튜닝하는 데에는 어마어마한 돈과 시간이 든다.(전기세) 하지만 RAG를 활용하면 그저 데이터 저장소를 슬쩍 바꿔주기만 하면 되니 실로 어마어마한 이익을 얻을 수 있는 것이다.
RAG를 직접 구현해본 적은 없지만 Meta의 연구진들에 의하면 겨우 5줄의 코드만으로 LLM에서 RAG를 구현하는 것이 가능하다고 한다.
https://huggingface.co/facebook/rag-token-nq#usage
from transformers import RagTokenizer, RagRetriever, RagTokenForGeneration
tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq")
retriever = RagRetriever.from_pretrained("facebook/rag-token-nq", index_name="exact", use_dummy_dataset=True)
model = RagTokenForGeneration.from_pretrained("facebook/rag-token-nq", retriever=retriever)
input_dict = tokenizer.prepare_seq2seq_batch("who holds the record in 100m freestyle", return_tensors="pt")
generated = model.generate(input_ids=input_dict["input_ids"])
print(tokenizer.batch_decode(generated, skip_special_tokens=True)[0])
# should give michael phelps => sounds reasonable
참 친절하게도 벌써 이런 패키지들을 만들어버린 것이다. 이 패키지는 데이터 저장소로 위키피디아를 사용한다고 한다. 확실히 위키피디아만 사용해도, 세종대왕이 맥북프로를 던졌다고 하는 사실 정도는 충분히 검증할 수 있으니 꽤 합리적으로 보인다.
https://arxiv.org/abs/2005.11401
동일 개발자들이 무려 2021년 4월에 이 방법을 제시해놓고 또 패키지를 만들었다고 하니, 메타와 OpenAI 등의 회사들이 얼마나 앞서가 있는지 참 무섭기도 하다.
참고로 포스팅에선 한국어로 데이터 저장소라는 용어로 일괄 사용했는데 이건 오롯이 내 편의를 위해 내가 해석한 용어로, 사용자에 따라서 다르게 표기할 수도 있다.
'LLM' 카테고리의 다른 글
[LLM] LLM으로 Tabular Data 학습해보기 - 1. GPT4o Finetuning (경정데이터분석) (9) | 2024.09.20 |
---|---|
[LLM] OPENAI 새로운 모델 ChatGPT o1 사용 후기 (10) | 2024.09.15 |
LLM - ChatGPT로 학습 데이터를 생성하는 방법 - 텍스트 데이터, 프롬프트 엔지니어링 (0) | 2024.03.27 |
[LLM] Deeplearning.AI Langchain 강의 내용 정리 (0) | 2024.02.10 |
인공지능 ChatPDF 사용해서 논문 읽는 방법 공유 (0) | 2023.05.19 |