RAG란?
RAG(Retrieval Augmented Generation)이란 외부 데이터를 참조하여 LLM이 답변할 수 있도록 해주는 프레임워크
RAG는 Fine-tuning과 엮여서 설명되는 경우가 많은데 두 방법 모두 LLM이 기존에 갖고 있지 않은 지식을 포함해서 답변할 수 있도록 해주는 프레임워크이다.
Fine-tuning은 LLM을 학습시키는 과정에서 GPU, 데이터셋등 비용이 많이 드는 단점이 존재. 따라서, 일반 상용자가 사용하기 힘들다.
RAG에서는 사용자가 질문을 했을때 QA 시스템이 외부 데이터 저장소에서 사용자의 질문과 유사한 데이터를 검색한다.
그럼 QA 시스템이 검색한 유사 문장과 사용자의 질문을 합쳐서 LLM에게 prompt로 전달을 하고
LLM은 이러한 정보를 종합하여 답변을 한다.
따라서, LLM이 외부 데이터 소스에서 정보를 받아 답변하기 때문에 기존에 없던 정보에 대해서도 답변을 할 수 있다.
특히, LangChain의 Retrieval이란 구조가 QA 시스템, 외부 데이터 저장소, LLM을 엮는 중요한 역할을 한다.
그중에서 오늘은 Document Loaders에 대해 다룬다.
Retrieval
LangChain의 Retrieval은 RAG의 대부분의 구성요소를 아우르며, 구성 요소 하나하나가 RAG의 품질을 좌우한다.
RAG 프레임워크를 완성하기 위해 랭체인에는 Retrieval의 순서가 있다.
- Document Loaders : 문서를 불러오는 역할을 한다.
- Text Splitters : 문서를 불러온 후 텍스트를 분할하는 과정
- Vector Embeddings : 텍스트를 그대로 저장하는게 아니라 벡터로 임베딩 후 저장하기 위해 임베딩 모델을 거친다.
이후 임베딩 모델을 통해서 수치화된 임베딩 값을 Vector Store에 저장한다. - Retrievers : 수치 데이터를 저장소에 저장하고 사용자의 질문과 가장 유사한 문장을 찾는 역할
- Chain : 일련의 과정을 통해 가져온 데이터와 사용자의 질문을 Chain을 통해 LLM이 문장을 생성한다.
Document Loaders란?
Document Loaders는 다양한 형태의 문서를 RAG 전용 객체로 불러들이는 모듈.
ex) pdf, word, ppt, youtube scripts...
이러한 문서들을 가져올때 Document Loaders로 가져와야 LangChain에서 활용할 수 있는 형식으로 불러올 수 있다.
이렇게 불러온 데이터는 2가지 내용을 포함하는데 Page_content와 Metadata이다.
- Page_content : 문서의 내용
- Metadata : 문서의 위치, 제목, 페이지 넘버 등
위의 사진에서 answer는 LLM의 답변이고 sources는 답변의 출처이다. sources를 담당하는게 metadata이다.
sources가 중요한 이유는 LLM의 답변이 어떤 자료를 근거로 하는지 확인이 필요할 수 있기 때문이다 -> 사람이 확인해야함
실습
라이브러리 설치
!pip install unstructured==0.6.1 langchain
!pip install langchain pypdf pdf2image docx2txt pdfminer
!pip install openpyxl
파일을 불러올때 필요한 라이브러리들이다.
from google.colab import drive
drive.mount('/content/drive')# 본인 파일 위치
구글 드라이브를 마운트하는 코드로 코딩으로 해도되고 클릭해서 해도됨
Document Loaders
Document Loader는 다양한 형식의 문서를 불러오고 이를 Langchain에 결합하기 쉬운 텍스트 형태로 변환하는 기능을 합니다. 이를 통해 사용자는 txt. 형식의 문서 뿐만 아니라 pdf, word, ppt, xlsx, csv 등 거의 모든 형식의 문서를 기반으로 LLM을 구동할 수 있습니다.
URL Document Loader
LangChain은 웹에 기록된 글도 텍스트 형식으로 가져와 LLM에 활용할 수 있습니다. 대표적인 URL Loader는 WebBaseLoader와 UnstructuredURLLoader가 있습니다.
WebBaseLoader
from langchain.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://n.news.naver.com/mnews/article/092/0002307222?sid=105")
data = loader.load()
print(data[0].page_content)
- 링크는 뉴스 기사에 해당하는 링크이고 data에 정보를 로드하고 data의 첫번째에 해당하는 값의 page_content를 가져오는 코드
- loader를 통해 로딩을 하면 list로 불러온다. 따라서, 리스트 값에 바로 page_content로 접근할 수 없다.
- page_content는 뉴스 기사의 내용에 해당하는 부분이다.
- URL 로더의 문제점은 URL 상에 페이지의 모든 데이터를 가져온다. 불필요한 데이터까지. LLM한테 전달해도 문제는 없음
UnstructuredURLLoader
from langchain.document_loaders import UnstructuredURLLoader
urls = [
"https://n.news.naver.com/mnews/article/092/0002307222?sid=105",
"https://n.news.naver.com/mnews/article/052/0001944792?sid=105"
]
loaders = UnstructuredURLLoader(urls=urls)
data = loader.load()
data
- urls라는 리스트에 url을 넣어주고 UnstructuredURLLoader에 매개변수로 전달해준다.
- 로딩해주면 텍스트가 출력되는데 원하지 않는 정보들도 같이 온다.
PDF Document Loader
많은 문서들이 pdf로 구성되어있기 때문에 pdf에서 정보를 추출할 수 있다면 매우 효율적이다.
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("pdf 파일 아무거나 경로")
pages = loader.load_and_split()
pages[0]
- load_and_split : pdf 문서를 페이지별로 자르고 리스트로 반환.
- 메타데이터, 내용 등이 포함됨
- 따라서, pages에는 각 페이지의 정보가 list로 저장되어있다.
- pages[0] 에는 첫 번째 페이지의 내용, 메타데이터등이 저장되어있다.
print(pages[1].page_content)
Word Document Loader
from langchain.document_loaders import Docx2txtLoader
loader = Docx2txtLoader("word(docx) 파일 아무거나 경로")
data = loader.load_and_split()
data
data[1].metadata
print(type(data[0].page_content))
print(data[0].page_content)
CSV Document Loader
from langchain.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path = "csv 파일 아무거나 경로")
data = loader.load()
data[:10]
for i in range():
print(f"row{i}")
print("-" * 100)
print(data[i].page_content)
print(data[i].metadata)
Reference
모두의 AI 유튜브 채널[https://www.youtube.com/@AI-km1yn]
'인공지능 > RAG' 카테고리의 다른 글
LangChain (6) Retrieval - Text Splitters (0) | 2024.04.08 |
---|---|
Knowledge Distillation (0) | 2024.04.06 |
LangChain (4) Prompt Template (1) | 2024.03.23 |
LangChain (3) OpenAI API 사용법 (0) | 2024.03.23 |
LangChain (2) LLM 개요 (0) | 2024.03.23 |