파일 로딩

사과 톡톡톡·2024년 9월 25일

LLM & RAG

목록 보기
3/4

블로그의 파일들은 깃허브 내에서 다운 가능합니다.
깃허브 주소

1. 파일

RAG 시스템에게 넘겨 줄 수 있는 파일들의 종류는 사실 엄청 많다.
하지만 사내에서 주로 다루는 pdf를 다뤄보겠다.

RAG 시스템 지원 파일 형식

1. 텍스트 기반 파일

  • 일반 텍스트 파일 (.txt)
  • 마크다운 파일 (.md)
  • HTML 파일 (.html, .htm)

2. 문서 파일

  • PDF 파일 (.pdf)
  • Microsoft Office 문서
  • OpenDocument 형식

3. 데이터 파일

  • CSV (Comma-Separated Values) 파일 (.csv)
  • JSON (JavaScript Object Notation) 파일 (.json)
  • XML (eXtensible Markup Language) 파일 (.xml)

4. 기타 파일

  • 이메일 파일 (.eml, .msg)
  • 압축 파일 (.zip, .rar, .7z)
  • 소스 코드 파일 (.py, .java, .cpp 등)

2. PDF 로딩

pdf 파일을 로딩하는 로더의 종류도 다양하다.

PDF 파일 로더 종류

1. PyPDFLoader

  • 가장 기본적이고 널리 사용되는 PDF 로더
  • 각 페이지를 별도의 문서로 로드

2. PyMuPDFLoader

  • PDF 문서의 메타데이터를 상세하게 추출할 수 있음
  • 성능이 좋고 빠른 처리가 가능

3. UnstructuredPDFLoader

  • 형식이 없는 PDF 문서를 로드하는 데 유용

4. OnlinePDFLoader

  • 온라인 상의 PDF 문서를 직접 로드할 수 있음

5. PyPDFDirectoryLoader

  • 특정 폴더 내의 모든 PDF 문서를 한 번에 로드할 수 있음

2-1) 기본 예제 코드

PyPDFLoader 사용 예제
from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("path/to/your/file.pdf")
pages = loader.load_and_split()

print(f"문서의 수: {len(pages)}")
print(f"\n[페이지내용]\n{pages[0].page_content[:500]}")
print(f"\n[metadata]\n{pages[0].metadata}\n")

### 출력 결과
문서의 수: 63

[페이지내용]
법제처                                                            1                                                       국가법령정보센터
도로교통법 
 
도로교통법 
[시행 2024. 10. 25.] [법률 제19745호, 2023. 10. 24., 일부개정] 
경찰청 (교통기획계(법제총괄, 안전표지, 보호구역)) 02-3150-2251 
경찰청 (교통안전계(안전, 단속, 어린이통학버스)) 02-3150-2252 
경찰청 (운전면허계(운전면허)) 02-3150-2253 
경찰청 (첨단교통계(신호, 무인단속장비)) 02-3150-2851 
경찰청 (교통조사계(교통사고조사)) 02-3150-2552 
       제1장 총칙
 
제1조(목적) 이 법은 도로에서 일어나는 교통상의 모든 위험과 장해를 방지하고 제거하여 안전하고 원활한 교통을 확보
함을 목적으로 한다.
 
제2조(정의) 이 법에서 사용

[metadata]
{'source': 'file/현행법령/도로교통법(법률)(제19745호)(20241025).pdf', 'page': 0}
#PyMuPDFLoader 사용 예제

from langchain_community.document_loaders import PyMuPDFLoader

loader = PyMuPDFLoader("path/to/your/file.pdf")
pages = loader.load()

print(f"문서의 수: {len(pages)}")
print(f"\n[페이지내용]\n{pages[0].page_content[:500]}")
print(f"\n[metadata]\n{pages[0].metadata}\n")

### 출력 결과
문서의 수: 63

[페이지내용]
법제처                                                            1                                                       국가법령정보센터
도로교통법
 
도로교통법
[시행 2024. 10. 25.] [법률 제19745호, 2023. 10. 24., 일부개정]
경찰청 (교통기획계(법제총괄, 안전표지, 보호구역)) 02-3150-2251
경찰청 (교통안전계(안전, 단속, 어린이통학버스)) 02-3150-2252
경찰청 (운전면허계(운전면허)) 02-3150-2253
경찰청 (첨단교통계(신호, 무인단속장비)) 02-3150-2851
경찰청 (교통조사계(교통사고조사)) 02-3150-2552
       제1장 총칙
 
제1조(목적) 이 법은 도로에서 일어나는 교통상의 모든 위험과 장해를 방지하고 제거하여 안전하고 원활한 교통을 확보
함을 목적으로 한다.
 
제2조(정의) 이 법에서 사용하는 용어의 뜻

[metadata]
{'source': 'file/현행법령/도로교통법(법률)(제19745호)(20241025).pdf', 'file_path': 'file/현행법령/도로교통법(법률)(제19745호)(20241025).pdf', 'page': 0, 'total_pages': 63, 'format': 'PDF 1.4', 'title': '', 'author': '', 'subject': '', 'keywords': '', 'creator': '', 'producer': 'iText 2.1.7 by 1T3XT', 'creationDate': "D:20240906151240+09'00'", 'modDate': "D:20240906151240+09'00'", 'trapped': ''}
# PyPDFDirectoryLoader 사용 예제

from langchain_community.document_loaders import PyPDFDirectoryLoader

pdf_dir = "file/도로 교통법"

loader = PyPDFDirectoryLoader(pdf_dir)
docs = loader.load()

print(f"로드된 문서의 수: {len(docs)}")
for doc in docs[:2]:  # 처음 2개 문서만 출력
    print(f"\n[문서내용]\n{doc.page_content[:200]}")
    print(f"\n[metadata]\n{doc.metadata}\n")
    
### 출력 결과
로드된 문서의 수: 456

[문서내용]
법제처                                                            1                                                       국가법령정보센터
도로교통법 
 
도로교통법 
[시행 2025. 3. 20.] [법률 제20375호, 2024. 3. 19., 일부개정] 
경찰청 

[metadata]
{'source': 'file/도로 교통법/도로교통법(법률)(제20375호)(20250320).pdf', 'page': 0}


[문서내용]
법제처                                                            2                                                       국가법령정보센터
도로교통법 
13의2. “회전교차로”란 교차로 중 차마가 원형의 교통섬(차마의 안전하고 원활한 교통처리나 보행자 도로횡단의 안
전

[metadata]
{'source': 'file/도로 교통법/도로교통법(법률)(제20375호)(20250320).pdf', 'page': 1}

각 라이브러리들 마다 어떻게 읽어오는지의 대한 차이들이 있다.
PyPDFDirectoryLoader는 페이지 단위로 읽어오기 때문에 저런 값이 나온다.
이렇게 다양한 종류들의 라이브러리가 있지만 여러 블로그를 둘러본 결과 "PyMuPDFLoader"가 가장 좋다고 들었다.
필자가 써본 경험에도 가장 좋았다.

2. 텍스트 전처리

불러온다고 끝이 아니듯이 잘 보면 쓸모 없는 부분들이 꽤나 있다.

법제처                                                            1                                                       국가법령정보센터
도로교통법
도로교통법
[시행 2024. 10. 25.] [법률 제19745호, 2023. 10. 24., 일부개정]
경찰청 (교통기획계(법제총괄, 안전표지, 보호구역)) 02-3150-2251
경찰청 (교통안전계(안전, 단속, 어린이통학버스)) 02-3150-2252
경찰청 (운전면허계(운전면허)) 02-3150-2253
경찰청 (첨단교통계(신호, 무인단속장비)) 02-3150-2851
경찰청 (교통조사계(교통사고조사)) 02-3150-2552
       제1장 총칙           

이 부분 등이 정말 쓸모 없는 부분들이다.
따라서 필요 없는 부분들의 전처리를 해주는 과정이 어떻게 보면 필수이다.
하지만 여기서 문제점이 발생하는데 모든 파일이 동일한 형태를 띄는게 아니다 보니 파일 하나 하나당 전부 전처리를 지정해서 해줄수는 없다.
따라서 좋은 모델을 선택하거나 아니면 동일한 양식의 문서들을 처리 할 때 저런 전처리 방법을 쓰면 좋다.
필자는 현재 대한민국 현행 법령을 RAG 시스템으로 하고 있기 때문에 전처리 과정을 필자에 맞춰서 보여주겠다.

# pdf loader

from langchain_community.document_loaders import PyMuPDFLoader

def read_pdf(file_path):
    loader = PyMuPDFLoader(file_path)
    return loader.load()
# 텍스트 전처리

import re

def clean_text(text):
    text = re.sub(r"법제처\s+.*?\s+국가법령정보센터", "", text)

    # 괄호 안의 값 제거: <>, [], (), 그리고 전화번호 형식 제거
    text = re.sub(r"<.*?>|\[.*?]|\(.*?\)", "", text, flags=re.DOTALL)
    
    # 괄호와 전화번호 같이 있는 경우 제거 (ex: (내용) 02-1234-5678 또는 (내용) 010-123-4567)
    text = re.sub(r"\(.*?\)\s*\d{2,4}[-.\s]\d{3,4}[-.\s]\d{4}", "", text)
    
    # 일반 전화번호 형식 제거 (괄호와 상관없이 나타나는 번호도 제거)
    text = re.sub(r"\d{2,4}[-.\s]\d{3,4}[-.\s]\d{4}", "", text)

    # 여분의 공백을 하나의 공백으로 대체
    text = re.sub(r"\s+", " ", text)

    return text.strip()
file_path = 'file/현행법령/도로교통법(법률)(제19745호)(20241025).pdf'
documents = read_pdf(file_path)

2-2) 전처리 전

print(documents[0].page_content)

### 출력 결과
법제처                                                            1                                                       국가법령정보센터
도로교통법
 
도로교통법
[시행 2024. 10. 25.] [법률 제19745호, 2023. 10. 24., 일부개정]
경찰청 (교통기획계(법제총괄, 안전표지, 보호구역)) 02-3150-2251
경찰청 (교통안전계(안전, 단속, 어린이통학버스)) 02-3150-2252
경찰청 (운전면허계(운전면허)) 02-3150-2253
경찰청 (첨단교통계(신호, 무인단속장비)) 02-3150-2851
경찰청 (교통조사계(교통사고조사)) 02-3150-2552
       제1장 총칙
 
제1조(목적) 이 법은 도로에서 일어나는 교통상의 모든 위험과 장해를 방지하고 제거하여 안전하고 원활한 교통을 확보
함을 목적으로 한다.
 
제2조(정의) 이 법에서 사용하는 용어의 뜻은 다음과 같다. <개정 2012. 3. 21., 2013. 3. 23., 2014. 1. 28., 2014. 11. 19.,
2017. 3. 21., 2017. 7. 26., 2017. 10. 24., 2018. 3. 27., 2020. 5. 26., 2020. 6. 9., 2020. 12. 22., 2021. 10. 19., 2022. 1.
11., 2023. 4. 18., 2023. 10. 24.>
1. “도로”란 다음 각 목에 해당하는 곳을 말한다.
가. 「도로법」에 따른 도로
나. 「유료도로법」에 따른 유료도로
다. 「농어촌도로 정비법」에 따른 농어촌도로
라. 그 밖에 현실적으로 불특정 다수의 사람 또는 차마(車馬)가 통행할 수 있도록 공개된 장소로서 안전하고 원활
한 교통을 확보할 필요가 있는 장소
2. “자동차전용도로”란 자동차만 다닐 수 있도록 설치된 도로를 말한다.
3. “고속도로”란 자동차의 고속 운행에만 사용하기 위하여 지정된 도로를 말한다.
4. “차도”(車道)란 연석선(차도와 보도를 구분하는 돌 등으로 이어진 선을 말한다. 이하 같다), 안전표지 또는 그와 비
슷한 인공구조물을 이용하여 경계(境界)를 표시하여 모든 차가 통행할 수 있도록 설치된 도로의 부분을 말한다.
5. “중앙선”이란 차마의 통행 방향을 명확하게 구분하기 위하여 도로에 황색 실선(實線)이나 황색 점선 등의 안전표
지로 표시한 선 또는 중앙분리대나 울타리 등으로 설치한 시설물을 말한다. 다만, 제14조제1항 후단에 따라 가변
차로(可變車路)가 설치된 경우에는 신호기가 지시하는 진행방향의 가장 왼쪽에 있는 황색 점선을 말한다.
6. “차로”란 차마가 한 줄로 도로의 정하여진 부분을 통행하도록 차선(車線)으로 구분한 차도의 부분을 말한다.
7. “차선”이란 차로와 차로를 구분하기 위하여 그 경계지점을 안전표지로 표시한 선을 말한다.
7의2. “노면전차 전용로”란 도로에서 궤도를 설치하고, 안전표지 또는 인공구조물로 경계를 표시하여 설치한 「도시
철도법」 제18조의2제1항 각 호에 따른 도로 또는 차로를 말한다.
8. “자전거도로”란 안전표지, 위험방지용 울타리나 그와 비슷한 인공구조물로 경계를 표시하여 자전거 및 개인형 이
동장치가 통행할 수 있도록 설치된 「자전거 이용 활성화에 관한 법률」 제3조 각 호의 도로를 말한다.
9. “자전거횡단도”란 자전거 및 개인형 이동장치가 일반도로를 횡단할 수 있도록 안전표지로 표시한 도로의 부분을
말한다.
10. “보도”(步道)란 연석선, 안전표지나 그와 비슷한 인공구조물로 경계를 표시하여 보행자(유모차, 보행보조용 의자
차, 노약자용 보행기 등 행정안전부령으로 정하는 기구ㆍ장치를 이용하여 통행하는 사람 및 제21호의3에 따른 실
외이동로봇을 포함한다. 이하 같다)가 통행할 수 있도록 한 도로의 부분을 말한다.
11. “길가장자리구역”이란 보도와 차도가 구분되지 아니한 도로에서 보행자의 안전을 확보하기 위하여 안전표지 등
으로 경계를 표시한 도로의 가장자리 부분을 말한다.
12. “횡단보도”란 보행자가 도로를 횡단할 수 있도록 안전표지로 표시한 도로의 부분을 말한다.
13. “교차로”란 ‘십’자로, ‘T’자로나 그 밖에 둘 이상의 도로(보도와 차도가 구분되어 있는 도로에서는 차도를 말한다
)가 교차하는 부분을 말한다.

3-2) 전처리 후

print(clean_text(documents[0].page_content))

### 출력 결과
도로교통법 도로교통법 경찰청 ) 경찰청 ) 경찰청 ) 경찰청 ) 경찰청 ) 제1장 총칙 제1조 이 법은 도로에서 일어나는 교통상의 모든 위험과 장해를 방지하고 제거하여 안전하고 원활한 교통을 확보 함을 목적으로 한다. 제2조 이 법에서 사용하는 용어의 뜻은 다음과 같다. 1. “도로”란 다음 각 목에 해당하는 곳을 말한다. 가. 「도로법」에 따른 도로 나. 「유료도로법」에 따른 유료도로 다. 「농어촌도로 정비법」에 따른 농어촌도로 라. 그 밖에 현실적으로 불특정 다수의 사람 또는 차마가 통행할 수 있도록 공개된 장소로서 안전하고 원활 한 교통을 확보할 필요가 있는 장소 2. “자동차전용도로”란 자동차만 다닐 수 있도록 설치된 도로를 말한다. 3. “고속도로”란 자동차의 고속 운행에만 사용하기 위하여 지정된 도로를 말한다. 4. “차도”란 연석선, 안전표지 또는 그와 비 슷한 인공구조물을 이용하여 경계를 표시하여 모든 차가 통행할 수 있도록 설치된 도로의 부분을 말한다. 5. “중앙선”이란 차마의 통행 방향을 명확하게 구분하기 위하여 도로에 황색 실선이나 황색 점선 등의 안전표 지로 표시한 선 또는 중앙분리대나 울타리 등으로 설치한 시설물을 말한다. 다만, 제14조제1항 후단에 따라 가변 차로가 설치된 경우에는 신호기가 지시하는 진행방향의 가장 왼쪽에 있는 황색 점선을 말한다. 6. “차로”란 차마가 한 줄로 도로의 정하여진 부분을 통행하도록 차선으로 구분한 차도의 부분을 말한다. 7. “차선”이란 차로와 차로를 구분하기 위하여 그 경계지점을 안전표지로 표시한 선을 말한다. 7의2. “노면전차 전용로”란 도로에서 궤도를 설치하고, 안전표지 또는 인공구조물로 경계를 표시하여 설치한 「도시 철도법」 제18조의2제1항 각 호에 따른 도로 또는 차로를 말한다. 8. “자전거도로”란 안전표지, 위험방지용 울타리나 그와 비슷한 인공구조물로 경계를 표시하여 자전거 및 개인형 이 동장치가 통행할 수 있도록 설치된 「자전거 이용 활성화에 관한 법률」 제3조 각 호의 도로를 말한다. 9. “자전거횡단도”란 자전거 및 개인형 이동장치가 일반도로를 횡단할 수 있도록 안전표지로 표시한 도로의 부분을 말한다. 10. “보도”란 연석선, 안전표지나 그와 비슷한 인공구조물로 경계를 표시하여 보행자가 통행할 수 있도록 한 도로의 부분을 말한다. 11. “길가장자리구역”이란 보도와 차도가 구분되지 아니한 도로에서 보행자의 안전을 확보하기 위하여 안전표지 등 으로 경계를 표시한 도로의 가장자리 부분을 말한다. 12. “횡단보도”란 보행자가 도로를 횡단할 수 있도록 안전표지로 표시한 도로의 부분을 말한다. 13. “교차로”란 ‘십’자로, ‘T’자로나 그 밖에 둘 이상의 도로가 교차하는 부분을 말한다.

이렇게 전처리만 시켜도 쓸모 없는 부분들 [ex) 반복되는 단어, 전화 번호, 한문] 등을 없앨수 있다.

0개의 댓글