어쩌다데싸

LangChain으로 RAG 구현하기 본문

Generative AI

LangChain으로 RAG 구현하기

엔팁 2024. 2. 4. 18:22

LLM은 놀라운 모델이지만 한계점이 있습니다. 이번 글에서는 LLM의 답변 정확도를 높이기 위해 함께 사용되는 RAG(Retriever Augmented Generation)와 LangChain이란 프레임워크로 RAG를 구현하는 법에 대해 알아보겠습니다.

 

1. LLM 한계

인터넷 세계의 학습 시점 과거의 데이터를 학습해 지식을 습득하는 LLM은 실제 세계에 대한 인식이 부족하고, 학습시점 이후의 데이터는 알지 못하는 등 학습 방식에 따른 근본적인 한계가 존재합니다. 아래의 4가지는 LLM의 대표적인 한계점으로 언급되는 내용입니다.

 

- Knowledge Cutoff : 모델 학습 이후에 생성된 데이터에 대해서는 학습이 안되어 답변을 못함

- No Access to private data : 회사 내부 기밀정보, 신상정보, 비공개 정보 등에 대해 접근 불가

- Hallucinations : 사실에 입각하지 않은 답변을 그럴싸하게 하는 환각 증상

- General Purpose : 다방면에 일정 수준 이상 답변할 수 있지만 특정 영역의 전문성이 떨어짐

 

이와 같은 한계에 대한 해결책으로, 동적인 외부 지식을 주입해 지식 집약적인 프롬포트에 대한 LLM 응답 정확도를 향상시키는 검색 증강 생성을 뜻하는 RAG(Retrieval-Augmented Generation)를 사용할 수 있습니다.

 

2. RAG (Retrieval-Augmented Generation)이란?

RAG는 언어 모델의 기능을 향상시키기 위해 검색 시스템과 결합해서 작동하는 것으로, 모델이 사용자의 질문에 답변할 때 필요한 정보를 외부 데이터베이스에서 검색하고 사용해서 더욱 정확한 답변을 제공할 수 있습니다. 

RAG(Retrieval-Augmented Generation): Load - Split - Embed - Store
RAG(Retrieval-Augmented Generation): Question - Retrieve - Prompt - LLM - Answer

 

QA 를 위해 RAG와 함께 LLM 이 작동하는 방식을 살펴보면,

 

1. 검색(참조)할 문서를 로드하고, chunk 단위로 쪼개어 임베딩한 벡터값을 Vector DB에 저장

2. Question(=Query)가 들어오면 해당 질문을 임베딩한 벡터값과 가장 유사한 문서를 Retriever을 통해 선택

2. Prompt에서 기존 Question과 해당 문서 내용을 합쳐 새로운 Prompt 내용 구성 (입력된 질문을 증강)

3. 2에서 만들어진 Prompt 내용을 LLM에 입력해 답변을 생성

 

순으로 진행되며 LLM만 사용했을 때는 LLM 자체의 지식(데이터)만을 근거로 답변을 했다면, RAG가 들어가면서 답변을 하기 위해 유사한 문서를 검색해서 해당 내용을 참조해 답변을 한다는 점에서 보다 나은 대답을 할 수 있게 됩니다.

 

이렇듯 RAG는 더 풍부한 응답을 할 수 있고, 동적 지식을 가져 최신 정보에도 접근할 수 있다는 장점을 가집니다. 이에 더해 회사 내부 지식 데이터 베이스를 구축해 회사 내부 자료 관련한 대답이 가능하도록 만드는 등 위에서 언급한 LLM의 한계를 해결하는데 많은 도움을 주게 됩니다.

 

3. LangChain 으로 RAG 구현하기

RAG는 LLM을 사용해서 애플리케이션 개발, 프로덕트화, 배포 등을 도와주는 LangChain이란 프레임워크로 쉽게 구현할 수 있습니다. 아래는 RAG 구현을 위한 간단한 예제입니다.

 

1) 필요한 라이브러리 import

from langchain import HuggingFacePipeline
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import ConversationalRetrievalChain

import torch
from transformers import pipeline, AutoTokenizer

 

 

2) Embedding 모델 정의

# Pre-trained된 Embedding 모델명
modelPath = 'jhgan/ko-sroberta-multitask' # open source Korean embedding model

# Create a dictionary with model configuration options, specifying to use the CPU for computations
model_kwargs = {'device': 'cpu'}

# Create a dictionary with encoding options, specifically setting 'normalize_embeddings' to False
encode_kwargs = {'normalize_embeddings': False}

# Initialize an instance of HuggingFaceEmbeddings with the specified parameters
embeddings = HuggingFaceEmbeddings(
    model_name=modelPath,     # Provide the pre-trained model's path
    model_kwargs=model_kwargs, # Pass the model configuration options
    encode_kwargs=encode_kwargs # Pass the encoding options
)

 

 

3) Retriever 생성

# 참고할 문서 정의 (각 리스트 내 원소 값이 하나의 문서로 취급)
documents = ["""소방방재학과 교육목표
1. 소방방재 기술의 습득과 소방방재분야 전문성을 갖춘 인재양성을 한다.
2. 학생의 진로를 고려한 맞춤형 교육 강화한다.
3. 재난 상황에 대한 예방과 재난 관리의 효율화에 필요한 창의적 문제 해결 능력을 갖추도록 한다.""",
"""소방방재학과 교육과정
4차산업기술창업, 건설공학개론, 건축소방학, 건축환경설비공학, 공학프로그래밍, 기계시스템설계, 산업위생종합설계, 소방방재전공진로탐색, 소방방재취업세미나, 소방방재현장실습1, 소방방재현장실습2, 소방법규해설, 소방전기설비공학, 소방학개론, 소방행정법, 소화설비론, 소화약제학, 스마트도시방재, 스마트재난관리론, 안전미디어종합설계, 연소폭발론, 열역학, 위험물시설론, 위험물질론, 유체역학, 응급처치론, 인간공학, 재료과학과공학, 전기전자종합설계, 전기회로이론, 정보통신론, 제연설비론, 화재조사론, 화재피난시뮬레이션, 화재현상론""",
"""소방방재학과 진로취업분야
방재안전관리자, 소방기구 및 설비 제조, 안전관리직, 소방공무원, 경찰·소방·교도관리자"""
]

# VectorStore 생성
vectorstore = FAISS.from_texts(
	documents, embedding=embeddings
)

# Retriever 생성
retriever = vectorstore.as_retriever()

 

 

4) Tokenizer 및 Pipeline 생성

# Pre-trained 된 LLM 모델 (llama 7b 모델)
model_name = "NousResearch/llama-2-7b-chat-hf"

# Llama Tokenizer 정의
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right" # Fix weird overflow issue with fp16 training

# 생성형 pipeline 설정
pipe = pipeline(task="text-generation",
                model=model_name,
                tokenizer=tokenizer,
                return_full_text=True,
                max_length=1024,
                device_map="auto"
               )
               
llm = HuggingFacePipeline(pipeline = pipe)

 

 

5) LangChain으로 Retriever 와 LLM Chaining

# Chaining a pipeline
chain = ConversationalRetrievalChain.from_llm(
    llm,
    retriever,
    return_source_documents=True
)

 

 

6) RAG 기반 LLM 답변 생성

query ='소방방재학과에 나오면 어디로 취업할 수 있어?'

chat_history = []
result = chain({"question": query, "chat_history": chat_history})

print(result)
# 결과값
{'question': '소방방재학과에 나오면 어디로 취업할 수 있어?',
 'chat_history': [],
 'answer': "소방방재학과 졸업생은 방재안전관리자, 소방기구 및 설비 제조, 안전관리직, 소방공무원,
			 경찰·소방·교도관리자 등의 취업분야에 진출할 수 있습니다."
 'source_documents': [Document(page_content='소방방재학과 교육목표
					1. 소방방재 기술의 습득과 소방방재분야 전문성을 갖춘 인재양성을 한다.
					2. 학생의 진로를 고려한 맞춤형 교육 강화한다.
					3. 재난 상황에 대한 예방과 재난 관리의 효율화에 필요한 창의적 문제 해결 능력을 갖추도록 한다.

					소방방재학과 교육과정
					4차산업기술창업, 건설공학개론, 건축소방학, 건축환경설비공학, 공학프로그래밍, 기계시스템설계, 산업위생종합설계, 소방방재전공진로탐색, 소방방재취업세미나, 소방방재현장실습1, 소방방재현장실습2, 소방법규해설, 소방전기설비공학, 소방학개론, 소방행정법, 소화설비론, 소화약제학, 스마트도시방재, 스마트재난관리론, 안전미디어종합설계, 연소폭발론, 열역학, 위험물시설론, 위험물질론, 유체역학, 응급처치론, 인간공학, 재료과학과공학, 전기전자종합설계, 전기회로이론, 정보통신론, 제연설비론, 화재조사론, 화재피난시뮬레이션, 화재현상론

					소방방재학과 진로취업분야
                    방재안전관리자, 소방기구 및 설비 제조, 안전관리직, 소방공무원, 경찰·소방·교도관리자')]}

 

위의 결과의 answer가 RAG를 통해 LLM이 답변한 결과인데, 이를 보면 question에 대해 3번 과정에서 정의한 document를 참고해서 답변을 생성했다는 것을 알 수 있습니다. 이처럼 LLM이 Generation 하기에 앞서 Retriever을 통해 참조할 문서를 찾고 이를 바탕으로 생성을 했을 때 보다 나은 대답을 하게 됩니다.

 

 

간단한 예제를 실습해봤는데, 더 나은 답변을 위해서는 Retriever의 성능을 높이기 위해 VectorStore을 변경하거나 임베딩 모델을 바꾸는 등 여러가지 실험이 가능합니다. 다음에는 RAG 관련 과제를 진행하며 성능을 높이기 위한 실험과 겪었던 문제들을 정리해보겠습니다.

'Generative AI' 카테고리의 다른 글

LLM - Fine Tuning(미세조정)  (0) 2024.03.17
Transformer 쉽게 이해하기 1편  (2) 2024.01.21
LLM(Large Language Model)이란?  (1) 2023.12.19