Chatbot 프로젝트/RAG

1. RAG 기초와 파이프라인

조찬국 2024. 10. 31. 16:40
728x90

1. RAG의 필요성

1.1. LLM의 한계

딥러닝모델긴길이의문장을입력받거나출력하는데에어려움이있다.

또한 학습된 데이터이외의것을만들어내는것에취약하다는한계점이 있다.

1.1.1 환각 현상

딥러닝모델은학습된데이터이외의정보에취약하다. 오픈 AI의최신모델인GPT-4o는2023년9월까지, Claude Sonnet 3.5는2024년4월까지의데이터 로학습되어, 이 이후의정보는 알지 못한다.

예를 들어, 스프링 시큐리티 6.1 버전이 23년 5월에 출시 되었는데 이에 대해 gpt는 제대로 알지 못한다.

1.1.2 기억 불가

LLM은 사전 학습시에 받아들인 정보 외의 것은배우지 못한다. 따라서 오늘 나와 대화하고 있는 LLM은 어제 나와 대화했던 내용을 기억하지 못한다.

1.1.3 토큰 제한

LLM은 입력값의 길이가 길어지면 계산량이 크게 늘어나, 대부분의 모델이 길이를 제한하고있다.

GPT-4o의입력값제한은128,000토큰(문자단위) 이다. Claude sonnet 3.5는200,000토큰이다.

 

2. RAG의 개념

2.1 RAG(Retrieval Augmented Generation,검색 증강 생성): 환각 증상 해결을 위해 고안

LLM에게 어떤 질문을 할 때, 이에 힌트가 될만한 문장을 함께 넣어 줌으로써, 환각 현상 방지

 

위와 같이 학습 이후의 최신 데이터들에 대해 힌트(context)를 줌으로써 환각 증상을 해결할 수 있다.

 

3. RAG 파이프 라인

3.1. 데이터 인덱싱과 검색 및 생성

RAG는 문서를 숫자로 변환하여 저장하는 인덱싱, 검색하고 답변을 생성하는 검색/생성 두가지 구조로 나뉘어있습니다.

벡터 임베딩: 문장 구조를 숫자형태의 행렬로 변환해서 저장. 

벡터db: 벡터 임베딩이 여러개.

Chunk: 1. llm의 입력 값 길이 제한을 회피하기 위해 문서를 쪼개서 벡터 임베딩을 저장한다.

             2. llm이 힌트 문장을 잘 받을 수 있도록 문서를 잘개 쪼갠 다음, 사용자의 질문과 가장 직접적으로 연                   관된 힌트 문장을 하나 찾아낼 수 있게 한다.

 

 

3.2. RAG의 핵심 컴포넌트

사용자의 질문과 문서 모두 임베딩 모델에 의해 수치화해서 벡터 임베딩을 생성한 후 벡터 DB에 저장한다.

3.2.1. 문서 로더

텍스트가 아닌 형태의 것들을 끌어오는 데에 있어서는 조금 애로사항이 있다. 따라서 Word형태가 가장 안전하다. 

3.2.2. 문서 임베딩(= 임베딩 모델)

오픈소스 임베딩 모델: Huggin Face, 내 RAG시스템에 어울릴 만한 임베딩 모델을 선택한다. 

딥러닝 커뮤니티에서 제공한 오픈 소스 임베딩 모델보다 현재로서는 기업에서 제공하는 임베딩 모델이 더 사용하기 편하고, 성능이 보장이 되어있다. (ex, Open AI의 ada-002)

3.2.3. 벡터 DB 저장

크로마, 파인콘,휴드론트,밀버스 가 대표적인 벡터DB이다. 벡터 DB는 수치화된 행렬인 벡터 임베딩을 저장하는 곳이다.  이곳에서 유사 문장을 검색해서 힌트 문장이 포함된 사용자 질문을 수행한다.

3.2.4. LLM 답변 생성

LLM은 질문과 힌트 문장을 섞인것을 통해 답변을 한다.

LLM은 크게 2가지로 나뉜다.

1. Closed Source LLM

: 모델 개발한 곳에 돈을 내고 API 형태로 모델을 활용할 수 있는 방법

(Open AI사의 Chat gpt 4, 엔트로픽사의 클로드 3.5 sonnect, 구글사의 Gemini 등)

2. Open Source LLM

: 로컬 PC에 LLM 모델을 다운로드 받아서 직접 구동할 수 있어 보안 측면에서 Closed source LLM 보다 조금 더 장점이 있다.

(Qn, Command-R+, 솔라 모델 등)

 

 

3.3. RAG의 실제 사용 사례 분석

3.3.1. Chat GPT의 GPTs나 Claude의 Project와 같은 맞춤형 챗봇 문서 업로드 기능

3.3.2. 법률, 금융, 의료 분야에서 LLM의 부족한 전무 지식을 RAG로 보완할 수 있다.

4. LangChain 이란?

4.1. LangChain의 개념

LangChain은 대규모 언어모델로 구동되는 애플리케이션을 개발하기 위한 프레임 워크

실제로 유연성과 재사용성이 높기 때문에 많은 기업들이 활용하고 있다. BCG, ElasticSearch, 리플릿 등이 많이 쓰고 있는 프레임 워크이다.

4.2. LangChain의 필요성

4.2.1. LLM의 발전과 함께 중요해진 프롬프트 엔지니어링을 보조한다.

LLM의 발전과 함께 LLM에게 어떻게 질문하는가가 중요해졌다. 이를 프롬프트 엔지니어링이라한다. Langchain은 프롬프트 엔지니어링의 번거로움을 줄이기 위해 Prompt Template이라는 모듈을 지원한다.

 

4.2.2.  RAG도 사용자의 질문에 힌트 문장을 합하여 LLM에게 전달하는 일종의 프롬프트엔지니어링

 

4.2.3.  LangChain의 아키텍쳐

Langchain은 프롬프트 엔지니어링 뿐만 아니라 RAG,  Agent  등의 시스템을 만들기 위한 모듈을 모두 갖췄다.

LangChain에서 핵심 6가지 주제

 

5. LangChain을 활용한 RAG 구현 워크 플로우

LangChain에는 Document Loader라는 문서를 업로드 하는 컴포넌트가 있다. PDF파일을 그대로 갖고 오는게 아니라 Document 객체라는 것으로 변환 후에 가져오게 된다. 

Document 객체는 텍스트 컨텐츠를 담고 있는 하나의 구조와 메타데이터를 담고 있는 구조 2개로 이루어져 있다. 

텍스트 스플리터를 통해 Document 객체의 텍스트 컨텐츠들을 여러 개의 문서로 분할을 하게 된다. 

텍스트 스플리터는 글자수를 기준으로 나누게 된다. 이때 맥락을 위해 다양한 방식으로 Chunking 할 수 있다.

임베딩 모델과 백터 db -> 문장을 행렬 형태로 수치화 후에 벡터 DB에 저장

임베딩 검색 -> 백터 DB에서 찾는 과정(Retriever:추출) 사용자의 질문과 유사성을 검색후 가장 연관성이 높                          은 문서를 추출.

답변 생성 -> LLM이 답변을 할때 Chain을 하나 더 두어 답변을 할때 좀더 고도화 하게 하여 답변하게 할 수 있다.

 

 

 

728x90