brunch

You can make anything
by writing

C.S.Lewis

by 차근차근 AI Nov 23. 2023

생성형 AI를 더 강력하게 사용하기: RAG와 미세조정

생성형 AI로 문서 질의응답/답변의 출처 표시를 할 수 있는 원리

이전 글에서 대규모 언어 모델에 입력되는 프롬프트를 잘 작성해서 원하는 답변을 얻는 방법과 그 한계에 대해 알아보았습니다. 이번 글에서는, 이렇게 단순히 프롬프트를 입력하는 것만으로는 답변을 얻기 어려운 문제들을 어떻게 해결할 수 있는지에 대해 살펴보겠습니다.




검색 증강 생성(Retrieval Augmented Generation, RAG)


RAG라고도 불리는 검색 증강 생성은 대규모 언어 모델에게 미리 학습한 데이터 외에 추가로 외부 데이터를 알려주고 싶을 때 사용되는 방법입니다. 작동하는 원리는 다음과 같이 크게 세 단계로 나눠볼 수 있습니다.


1. 추가하고 싶은 데이터를 임베딩 벡터 형태로 벡터 데이터베이스에 저장:

임베딩은 데이터를 낮은 차원의 숫자 벡터로 표현하는 기술로, 임베딩을 통해서 서로 관련이 있는 데이터가 비슷한 벡터 공간에 위치하게 됩니다. 혹시 기억이 안 나시면 두 번째 글을 참고해 주세요.


2. 사용자가 질문을 입력하면, 이 질문과 관련된 추가 데이터를 벡터 데이터베이스 검색을 통해 가져오기:

질문의 임베딩 벡터와 비슷한 벡터 공간에 있는 추가 데이터를 첫 번째 단계의 벡터 데이터베이스에서 가져옵니다.


3. 검색된 추가 데이터와 사용자의 질문을 합쳐서 프롬프트를 구성한 뒤 대규모 언어 모델에 입력해서 이 맥락(context)에 기반한 답변 생성하기:

어떻게 프롬프트를 구성하는지 이해하기 위해 LangChain 웹사이트에 올라온 RAG 프롬프트 예시를 한국말로 바꿔서 살펴보겠습니다.

다음의 맥락에만 기반해서 주어진 질문에 답하세요:
{맥락}

질문: {주어진 질문}

이때 {맥락} 부분에 두 번째 단계의 검색을 통해 가져온 추가 데이터들이, {주어진 질문}에 사용자의 질문이 들어가고, 이 프롬프트를 바탕으로 대규모 언어 모델이 답변을 생성하게 됩니다.


이처럼 관련된 추가 데이터를 검색해서 프롬프트에 추가함으로써 모델이 답변을 생성하는 능력을 증강하기 때문에 검색 증강 생성이라는 이름이 붙었습니다. 이 방법이 중요한 이유는 첫 번째와 두 번째 단계 덕분에 어떠한 추가 데이터를 근거로 해서 답변을 생성했는지 알 수 있고, 그렇기 때문에 사용자들이 직접 해당 데이터를 찾아서 읽어볼 수도 있기 때문에 환각 현상에 대한 대응도 가능하다는 점입니다. 또한 최신 정보의 부재라는 한계도 외부 데이터의 추가 주입을 통해 어느 정도 극복하는 것을 기대할 수 있습니다. 하지만 여전히 프롬프트에 입력할 수 있는 맥락 길이에 제한이 있기 때문에 무한정으로 추가 데이터를 제공할 수 없다는 한계는 존재합니다.


RAG를 적용한 예시는 굉장히 많은데, 문서를 업로드한 뒤 그 문서 내용에 대한 질문을 하면 생성형 AI가 답변을 내어 놓는 것이 대표적인 예시입니다.




미세조정(Fine-tuning)


위에서 살펴본 RAG 외에 미세조정을 통해서도 대규모 언어 모델에게 추가로 외부 데이터를 제공하는 것이 가능한데, 미세조정이란 풀고자 하는 문제에 맞는 학습 데이터 수백, 수천 개를 추가로 마련해서 대규모 언어 모델을 다시 학습시켜 모델의 파라미터를 업데이트하는 것을 의미합니다.


그렇다면 어떤 경우에 미세조정이 필요한 것일까요? 다음과 같은 경우를 생각해 볼 수 있습니다.

- 특정한 형식으로 결과를 출력하고 싶을 경우: 코드 생성 등 원하는 결과물이 정해져 있는 경우

- 특정한 도메인 지식을 모델에 주입하고 싶을 경우: 법률, 재무, 의료 등 특정 분야의 전문 용어 및 데이터에 대한 답변을 생성하고 싶은 경우

- 프롬프트 수정으로 만으로는 문제 해결이 잘되지 않는 경우: 프롬프트를 정의하는 것이 쉽지 않거나, 필요한 맥락이 너무 길어서 프롬프트에 다 넣을 수 없는 경우

- 대규모 모델 대신 추론 시간이 짧고 더 저렴한 작은 모델을 쓰고 싶은 경우: 비교적 간단한 일이라서 작은 규모의 모델을 미세조정하는 것만으로도 충분한 경우


이러한 미세조정을 통해서도 최신 정보의 부재 및 환각이라는 한계에 대응할 수 있습니다. 그런데 모델의 크기가 점점 거대해지고 있는 추세이기 때문에, 대규모 언어 모델의 파라미터를 업데이트하는 데에는 많은 계산 비용이 발생합니다. 그래서 좀 더 효율적인 방법으로 튜닝할 수 있는 방법이 없는가에 대한 고민과 함께 Parameter Efficient Fine Tuning (PEFT)이 등장합니다. PEFT를 사용하면 대규모 언어 모델 전체를 다시 학습하는 게 아니라 모델 파라미터 중 일부만 학습시켜 업데이트하거나, 기존 모델 파라미터에 새로운 파라미터를 일부 추가하는 방법을 사용합니다. 이를 통해 미세조정 방법보다는 훨씬 적은 계산 비용을 사용하면서도, 프롬프트만 바꿔서 사용하는 방법 대비 더 높은 정확도의 답변을 얻을 수 있습니다.


이번 글에서는 생성형 AI를 더 강력하게 사용하는 RAG와 미세조정에 대해 알아보았습니다. 한 줄로 요약하면 다음과 같습니다.

검색 증강 생성(RAG) 또는 미세조정(Fine-tuning)을 이용하면 대규모 언어 모델에게 추가로 외부 데이터를 알려주고 답변 생성을 요청함으로써 최신 정보의 부재 및 환각이라는 한계에 어느 정도 대응이 가능합니다.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari