LangChain을 이용한 RAG - (1) 이론편

    목차
반응형

RAG란

Retrieve-Augmented Generation으로 굳이 한국어로 번역하자면 검색-증강 생성이 된다. 이는 LLM이 학습하지 않은 정보에 대해 답변을 잘 하지 못하는 문제를 해결하기 위해 나온 방법이다. GPT-3.5가 2021년까지의 데이터로 학습이 되었기 때문에 그 이후의 질문을 하면 대답을 잘 하지 못하거나 엉뚱한 답을 한다. 하지만 one-shot 프롬프트나 few-shot 프롬프트 엔지니어링을 통해 원하는 답을 만들게 할 수 있는데 이를 응용한 것이 RAG이다. 좀 더 쉽게 설명하자면, 프롬프트 안에 "정답지"를 주고 그 정보를 이용하여 답을 하게 만들게 하는데 결국 오픈북 시스템과 비슷하다고 볼 수 있다.

 

RAG의 필요성

그럼 이런 의문점이 생길 것이다.

 

"정답을 알고 있는데 왜 굳이 LLM에게 물어보나요?"

 

위에서 오픈북 시스템과 비슷하다고 이야기했듯, 오픈북으로 시험을 본다고 한들 수많은 페이지 중에 어디에 정답이 있는지 어느 세월에 찾아낼 수 있을지 모른다. 또, 오픈북으로 쓸 정답지가 없는 사람에게 LLM을 통해 자동으로 답을 주고 싶은 경우도 있을 수 있다. 뿐만 아니라 책이 너무 많아서 다 들고 갈 수가 없어 문제와 관련된 책만 가져가야 하는 경우도 있다. RAG가 필요한 이유를 정리하면 아래와 같다.

1. LLM이 갖고 있지 않은 정보를 기반으로 대화를 하기 위해 (도메인 특화 LLM)
2. 수많은 문서 중 정답을 빠르게 찾아내기 위해
3. 메모리 또는 토큰 제한을 극복하기 위해

 

RAG는 다음과 같은 방식으로 쓰인다.

- 고객 Q&A 봇 (대응 매뉴얼을 프롬프트에 넣고 사용하기)

- 사내 매뉴얼 탐색 (수많은 사내 문서를 기반으로 대화하여 탐색하기)

- 자연어를 기반으로 한 인터넷 검색 (검색 결과를 프롬프트에 넣고 사용하기, Bing Copilot이나 Google Gemini 등이 이렇게 작동한다.)

 

 

RAG 작동 방식 (단계)

이 글에서는 각 단계에 대해 간단하게 설명하고, 다음 글들에서 더 자세하게 설명하고자 한다.

1. 문서 임베딩(embedding)
로컬이든 온라인 상이든 텍스트로 된 비정형 데이터를 불러온 후 정해진 길이의 벡터 데이터로 변환하는 작업이다. 일반적으로 chunk 단위로 텍스트를 자른 후 임베딩을 수행한다. 여기서 chunk는 음절, 단어, 토큰 등 다양한 선택지가 있다.


2. 벡터DB에 저장
벡터화한 문서를 어딘가에 저장을 해둘 필요가 있다. 이 때 벡터DB라고 불리는 데이터베이스를 사용하게 되는데 유료 툴인 AWS OpenSearch, MongoDB Atlas나 무료 툴인 FAISS, Chroma 등이 있다.

벡터화한 문서를 "저장"하는 이유?

문서가 크면 임베딩하는데 오래 걸리기 때문에 재사용을 위해 저장한다.

 

벡터화한 문서를 "벡터DB에" 저장하는 이유?

유사한 벡터를 검색하는 데에 최적화되어 일반적인 DB를 사용하는 것보다 빠르게 검색하고 유사성을 비교할 수 있으며 효율적으로 저장하여 공간을 절약할 수 있다.

 

3. 사용자의 질문 임베딩 및 검색
임베딩된 질문과 가장 가까운 문서 인덱스를 k개 찾는다. 가까운 기준은 코사인 유사도, MMR 등이 있다.


4. 생성(대화)
검색으로 찾은 문서를 프롬프트에 넣어 대화를 이어간다.

 

 

RAG를 쉽게 할 수 있도록 돕는 라이브러리

가장 많이 쓰이는 라이브러리는 `langchain`과 `llamaindex`가 있다. `langchain`은 2022년 10월에 최초로 출시했고 `llamaindex`는 `gpt-index`라는 이름으로 2022년 11월에 출시하였다. 불과 한 달 차이지만 선점효과로 인한 것인지 2024년 7월 기준으로 `langchain`은 8만 8천개의 별이, `llamaindex`는 3만 3천개의 별이 달려있다.


`langchain`

`llamaindex`

나는 좀 더 인기가 많은 `langchain`을 이용하여 RAG를 해보는 내용을 작성해보고자 한다.

다음 편으로 넘어가기 전에 `langchain`을 설치하자.

`pip install langchain langchain_community langchainhub`

OpenAI API 사용 시 `langchain_openai`를, AWS Bedrock 사용 시 `langchain_aws`를 추가로 설치

PDF 파일을 읽기 위해 `pip install pypdf`, 여러 파일을 불러오기 위해 `pip install unstructured`

벡터DB를 위해 `pip install faiss-cpu`, `pip install chromadb`

retriever를 위해 `pip install rank-bm25`

 

참조

- langchain (이미지)

728x90
반응형