RAG는 검색 증강 생성이라고 번역할 수 있으며, 기존 언어 모델에 외부 지식을 결합하여 더욱 정확하고 최신의 정보를 제공하는 접근 방식이다.
e.g.
2024년 11월 25일 GPT에게 아래와 같이 llama 모델은 몇 버전까지 나왔냐는 질문을 했을 때 3.1 버전까지 나왔다고 대답을 하였다.
하지만 2024년 11월 25일을 기준으로 Llama는 3.2 버전까지 공개되었다.
LLMs는 학습 시점의 데이터에 기반하여 지식을 습득하기 때문이고, 이는 곧 모델이 최신의 정보나 학습 이후에 발생한 사건들에 대해 알지 못한다는 것을 의미한다.
LLMs은 광범위한 주제에 대해 일반적인 지식을 가지고 있지만, 특정 도메인의 심도 있는 전문 지식을 모두 포함하기는 어렵다.
LLMs은 때때로 실제로 존재하지 않는 정보를 생성하는 '환각' 현상을 보인다. 이는 모델이 학습 데이터에서 패턴을 추출하여 그럴듯한 답변을 만들어내지만, 실제로는 그 답변이 사실과 다를 수 있다는 것을 의미한다.
기존 모델들은 생성한 정보의 출처를 명확하게 제시하기가 어렵다. 이는 모델의 답변을 검증하거나 더 자세한 정보를 찾고자 할 때 문제가 될 수 있다.
RAG Indexing은 외부 데이터를 LLM에 효과적으로 통합하는 프로세스로 크게 4가지 단계로 나누어진다.
Document Loader
Text Splitter
: 데이터를 적절한 크기로 분할Embedding
: 텍스트를 벡터로 변환Vector Store
: VectorDB에 저장여기에 RAG의 생성은 Embedding간의 유사성을 계산하는 단계가 추가되면 완성된다.
Retrievers
: Vector DB 검색기Embedding은 실수 벡터 형태로 표현한 결과를 의미하고, 이 결과는 사람이 직접 이해할 수는 없지만, 컴퓨터는 서로 다른 단어 또는 문서에서 추출된 임베딩 간의 거리를 계산하고 방향을 비교하여 이들 간의 의미적 관계를 이해할 수 있다.
프롬프트 엔지니어링은 원하는 결과를 얻기 위해 프롬프트를 구체적으로 작성하고 최적화하는 과정이다.
e.g. ChatGPT에게 질문을 할 때도, 아래와 같이 사용자가 원하는 방향으로 모델의 답변을 유도하는 방법을 사용한다.
VS
Next Token Prediction
은 언어 모델의 가장 기본적인 작동 원리로 주어진 context
를 기반으로 다음에 올 가장 가능성이 높은 토큰을 예측하는 과정이다.
ICL은 모델이 입력된 컨텍스트에 제공된 정보와 예시를 바탕으로 새로운 작업을 수행하는 능력을 말한다. 쉽게 말해, 새로운 작업을 즉시 학습하여 결과를 도출하는 능력이다. ICL은 사전 학습(Pre-training) 동안 축적한 지식을 기반으로, 주어진 입력의 패턴을 파악하고 이를 활용하여 결과를 생성한다.
LLM(Large Language Model)은 이러한 인간의 학습 방식을 제한적으로나마 구현하여, 레이블 데이터 없이도 새로운 작업을 수행할 수 있는 능력을 갖추게 되었다.
기존 딥러닝 모델은 대규모 데이터셋을 사용하여 사전 학습된 모델을 추가로 학습(Fine-Tuning)하는 방식을 따른다.
Fine-Tuning에는 문제와 정답(Label)으로 이루어진 레이블 데이터셋이 필요하며, 이 데이터를 사람이 직접 제작해야 하므로 많은 시간과 비용이 든다.
모델은 주어진 문장의 일부에서 시작해, 다음에 올 토큰의 조건부 확률을 최대화하도록 학습된다. 실제로 모델을 사용할 때는, 학습 결과를 바탕으로 가장 높은 확률을 가진 문장을 생성한다.
Prompt Engineering은 이러한 언어 모델의 특성을 활용하여 사용자의 의도에 부합하는 결과가 나올 확률을 높이는 작업이다.
즉, 원하는 출력이 나올 수 있도록 모델에 입력 형식을 설계하고 구성하는 과정이다.
최근 LLM 분야에서는 자연어 대신 pseudo-code를 사용하여 프롬프트를 작성하는 기법이 주목받고 있다. 마치 개발자처럼 LLM에게 코드로 명령을 내리는 방식인데, 자연어의 모호성을 줄이고, LLM이 명령을 더 잘 이해하도록 돕기 위함이다.
def generate_sentiment(sentence: str) -> str:
""" 주어진 문장에 대한 감정을 예측합니다. 긍정적인 감정이면 "positive"를, 그렇지 않으면 "negative"를 반환합니다.
Parameters:
sentence (str): 입력 문장
Returns:
str: 입력 문장의 감정
"""
# 감정 예측
if sentiment_is_positive(sentence):
return "positive"
else:
return "negative"
>>> generate_sentiment("오늘 기분 최고야!")
"positive"