RAG & LANCHAIN (3)- Langchain 개념 & 문법 정리 ch.06 문서로더(Document Loader)

이영락·2024년 8월 29일
0

인공지능 공부

목록 보기
12/33

CH06 문서 로더

LangChain의 문서 로더(Document Loader)를 사용하면 다양한 형식의 데이터 파일을 문서로 로드할 수 있습니다.

  • Document 로드: 로드한 문서는 Document 객체로 표현되며, 이 객체의 page_content에는 문서의 내용이, metadata에는 메타데이터가 포함됩니다.

  • 지원 형식: PDF, Word, CSV, Excel, JSON 등 여러 형식의 파일을 로드할 수 있는 문서 로더가 각각 존재합니다.

  • 주요 메서드:

    • load(): 파일을 동기적으로 로드합니다.
    • aload(): 파일을 비동기적으로 로드합니다.
    • lazy_load(): 메모리 사용량을 줄이기 위해 문서를 필요한 시점에 로드합니다.

LangChain의 문서 로더를 통해 다양한 형식의 데이터를 손쉽게 다룰 수 있습니다. 각 파일 형식에 맞는 문서 로더를 선택해 활용하면, 데이터 처리 및 분석에 유용하게 사용할 수 있습니다.


🏖️ 01.도큐먼트(Document) 의 구조

Document & Document Loaders

  • LangChain에서 문서 로더(Document Loader)를 사용해 다양한 형식의 데이터 파일을 Document 객체로 로드할 수 있다.
  • Document 객체 -- LangChain의 기본 문서 객체이다.
    • page_content -- 문서의 실제 내용을 담고 있는 문자열이다.
    • metadata -- 문서와 관련된 메타데이터를 저장하는 딕셔너리이다.

Document 객체 예시 코드

from langchain_core.documents import Document

# Document 객체 생성
document = Document("안녕하세요? 이건 랭체인의 도큐먼트 입니다")

# 도큐먼트의 속성 확인
print(document.__dict__)
# 출력: {'id': None, 'metadata': {}, 'page_content': '안녕하세요? 이건 랭체인의 도큐먼트 입니다', 'type': 'Document'}

# 메타데이터 추가
document.metadata["source"] = "TeddyNote"
document.metadata["page"] = 1
document.metadata["author"] = "Teddy"

# 도큐먼트의 메타데이터 확인
print(document.metadata)
# 출력: {'source': 'TeddyNote', 'page': 1, 'author': 'Teddy'}

Document Loader

  • Document Loader -- 다양한 파일 형식으로부터 데이터를 불러와 Document 객체로 변환하는 역할을 한다.
    • 주요 로더로는 PyPDFLoader, CSVLoader, UnstructuredHTMLLoader, JSONLoader, TextLoader, DirectoryLoader 등이 있다.

PDF 파일 로드 예시

from langchain_community.document_loaders import PyPDFLoader

# 예제 파일 경로
FILE_PATH = "./data/SPRI_AI_Brief_2023년12월호_F.pdf"

# 로더 설정
loader = PyPDFLoader(FILE_PATH)

# 문서를 로드하여 반환
docs = loader.load()

# 로드된 문서의 수 확인
print(len(docs))  # 출력: 23

# 첫 번째 문서 확인
print(docs[0])
# 출력: Document(metadata={'source': './data/SPRI_AI_Brief_2023년12월호_F.pdf', 'page': 0}, page_content='2023 년 12월호')

추가 기능

  • load_and_split() -- 문서를 분할하여 로드하는 함수이다. splitter를 사용해 문서를 작은 청크로 분할할 수 있다.
from langchain_text_splitters import CharacterTextSplitter

# 문열 분할기 설정
text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=0)

# 문서 분할 및 로드
docs = loader.load_and_split(text_splitter=text_splitter)
  • lazy_load() -- 제너레이터 방식으로 문서를 로드하여 메모리 사용을 줄이는 기능이다.
# 제너레이터 방식으로 문서 로드
for doc in loader.lazy_load():
    print(doc.metadata)
  • aload() -- 비동기(Async) 방식으로 문서를 로드하는 기능이다.
# 문서를 async 방식으로 로드
adocs = await loader.aload()

🏖️ 02. PDF

PDF

  • Portable Document Format (PDF) -- ISO 32000으로 표준화된 파일 형식이다. Adobe가 1992년에 문서를 제시하기 위해 개발했으며, 응용 소프트웨어, 하드웨어 및 운영 시스템에 독립적인 방식으로 텍스트 서식 및 이미지를 포함한다.
  • 이 가이드는 PDF 문서를 LangChain Document 형식으로 로드하는 방법을 다룬다. -- 이 형식은 다운스트림에서 사용된다.
  • LangChain은 다양한 PDF 파서와 통합된다. -- 일부는 간단하고 상대적으로 저수준이며, 다른 일부는 OCR 및 이미지 처리를 지원하거나 고급 문서 레이아웃 분석을 수행한다.
  • 올바른 선택은 사용자의 애플리케이션에 따라 달라진다.

참고

  • LangChain 도큐먼트
  • AutoRAG 팀에서의 PDF 실험
  • AutoRAG에서 진행한 실험을 토대로 작성한 순위표

아래 표기된 숫자는 등수를 나타낸다. (The lower, the better)

PDFMinerPDFPlumberPyPDFium2PyMuPDFPyPDF2
Medical1234
Law3113
Finance1224
Public1114
Sum55715

출처: AutoRAG Medium 블로그

PyPDF

  • PyPDF -- pypdf를 사용하여 PDF를 문서 배열로 로드하며, 각 문서는 페이지 번호와 함께 페이지 내용 및 메타데이터를 포함한다.

PyPDF 설치 및 사용

# 설치
# !pip install -qU pypdf
from langchain_community.document_loaders import PyPDFLoader

# 파일 경로 설정
loader = PyPDFLoader(FILE_PATH)

# PDF 로더 초기화
docs = loader.load()

# 문서의 내용 출력
print(docs[10].page_content[:300])

PyPDF 메타데이터 출력

def show_metadata(docs):
    if docs:
        print("[metadata]")
        print(list(docs[0].metadata.keys()))
        print("\n[examples]")
        max_key_length = max(len(k) for k in docs[0].metadata.keys())
        for k, v in docs[0].metadata.items():
            print(f"{k:<{max_key_length}} : {v}")

show_metadata(docs)
  • 출력 예시:
[metadata]
['source', 'page']

[examples]
source : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
page   : 0

PyPDF(OCR)

  • PyPDF(OCR) -- 일부 PDF에는 스캔된 문서나 그림 내에 텍스트 이미지가 포함되어 있다. rapidocr-onnxruntime 패키지를 사용하여 이미지에서 텍스트를 추출할 수 있다.
# 설치
# !pip install -qU rapidocr-onnxruntime
# PDF 로더 초기화, 이미지 추출 옵션 활성화
loader = PyPDFLoader("https://arxiv.org/pdf/2103.15348.pdf", extract_images=True)

# PDF 페이지 로드
docs = loader.load()

# 페이지 내용 접근
print(docs[4].page_content[:300])

PyPDF(OCR) 메타데이터 출력

show_metadata(docs)
  • 출력 예시:
[metadata]
['source', 'page']

[examples]
source : https://arxiv.org/pdf/2103.15348.pdf
page   : 0

PyMuPDF

  • PyMuPDF -- 속도 최적화가 되어 있으며, PDF 및 해당 페이지에 대한 자세한 메타데이터를 포함한다. -- 페이지 당 하나의 문서를 반환한다.

PyMuPDF 설치 및 사용

# 설치
# !pip install -qU pymupdf
from langchain_community.document_loaders import PyMuPDFLoader

# PyMuPDF 로더 인스턴스 생성
loader = PyMuPDFLoader(FILE_PATH)

# 문서 로드
docs = loader.load()

# 문서의 내용 출력
print(docs[10].page_content[:300])

PyMuPDF 메타데이터 출력

show_metadata(docs)
  • 출력 예시:
[metadata]
['source', 'file_path', 'page', 'total_pages', 'format', 'title', 'author', 'subject', 'keywords', 'creator', 'producer', 'creationDate', 'modDate', 'trapped']

[examples]
source       : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
file_path    : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
page         : 0
total_pages  : 23
format       : PDF 1.4
title        : 
author       : dj
subject      : 
keywords     : 
creator      : Hwp 2018 10.0.0.13462
producer     : Hancom PDF 1.3.0.542
creationDate : D:20231208132838+09'00'
modDate      : D:20231208132838+09'00'
trapped      : 

Unstructured

  • Unstructured -- Markdown이나 PDF와 같은 비구조화된 또는 반구조화된 파일 형식을 다루기 위한 공통 인터페이스를 지원한다.
  • LangChain의 UnstructuredPDFLoader는 Unstructured와 통합되어 PDF 문서를 LangChain Document 객체로 파싱한다.

Unstructured 설치 및 사용

# 설치
# !pip install -qU unstructured
from langchain_community.document_loaders import UnstructuredPDFLoader

# UnstructuredPDFLoader 인스턴스 생성
loader = UnstructuredPDFLoader(FILE_PATH)

# 데이터 로드
docs = loader.load()

# 문서의 내용 출력
print(docs[0].page_content[:300])

Unstructured 메타데이터 출력

show_metadata(docs)
  • 출력 예시:
[metadata]
['source']

[examples]
source : ./data/SPRI_AI_Brief_2023년12월호_F.pdf

PyPDFium2

  • PyPDFium2 -- PyPDFium2로 PDF를 로드하고, 문서의 내용을 확인할 수 있다.

PyPDFium2 설치 및 사용

from langchain_community.document_loaders import PyPDFium2Loader

# PyPDFium2 로더 인스턴스 생성
loader = PyPDFium2Loader(FILE_PATH)

# 데이터 로드
docs = loader.load()

# 문서의 내용 출력
print(docs[10].page_content[:300])

PyPDFium2 메타데이터 출력

show_metadata(docs)
  • 출력 예시:
[metadata]
['source', 'page']

[examples]
source : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
page   : 0

PDFMiner

  • PDFMiner -- PDF를 HTML 텍스트로 변환하여 보다 구조화된 정보를 얻을 수 있다.

PDFMiner 설치 및 사용

from langchain_community.document_loaders import PDFMinerLoader

# PDFMiner 로더 인스턴스 생성
loader = PDFMinerLoader(FILE_PATH)

# 데이터 로드
docs = loader.load()

# 문서의 내용 출력
print(docs[0].page_content[:300])

PDFMiner 메타데이터 출력

show_metadata(docs)
  • 출력 예시:
[metadata]
['source']

[examples]
source : ./data/SPRI_AI_Brief_2023년12월호_F.pdf

PDFMiner를 사용한 HTML 텍스트 생성

  • PDFMiner -- HTML 콘텐츠로 변환된 텍스트를 BeautifulSoup을 사용하여 파싱함으로써 글꼴 크기, 페이지 번호, PDF 헤더/푸터 등에 대한 보다 구조화된 정보를 얻을 수 있다. -- 이를 통해 텍스트를 의미론적으로 섹션으로 분할하는 데 도움이 될 수 있다.

PDFMiner를 사용한 HTML 텍스트 생성 및 파싱

from langchain_community.document_loaders import PDFMinerPDFasHTMLLoader

# PDFMinerPDFasHTMLLoader 인스턴스 생성
loader = PDFMinerPDFasHTMLLoader(FILE_PATH)

# 문서 로드
docs = loader.load()

# 문서의 내용 출력
print(docs[0].page_content[:300])

# HTML 파서를 사용하여 HTML 콘텐츠를 파싱
from bs4 import BeautifulSoup

soup = BeautifulSoup(docs[0].page_content, "html.parser")  # HTML 파서 초기화
content = soup.find_all("div")  # 모든 div 태그 검색
import re

cur_fs = None
cur_text = ""
snippets = []  # 동일한 글꼴 크기의 모든 스니펫 수집
for c in content:
    sp = c.find("span")
    if not sp:
        continue
    st = sp.get("style")
    if not st:
        continue
    fs = re.findall("font-size:(\d+)px", st)
    if not fs:
        continue
    fs = int(fs[0])
    if not cur_fs:
        cur_fs = fs
    if fs == cur_fs:
        cur_text += c.text
    else:
        snippets.append((cur_text, cur_fs))
        cur_fs = fs
        cur_text = c.text
snippets.append((cur_text, cur_fs))
  • 이 방법을 사용하면 출력된 HTML 콘텐츠에서 글꼴 크기 등을 기준으로 PDF의 헤더/푸터 및 텍스트를 의미론적으로 구분할 수 있다.

추가 코드 예시: 중복 스니펫 제거 전략 및 섹션 분할

from langchain_core.documents import Document

cur_idx = -1
semantic_snippets = []
# 제목 가정: 높은 글꼴 크기
for s in snippets:
    # 새 제목 판별: 현재 스니펫 글꼴 > 이전 제목 글꼴
    if (
        not semantic_snippets
        or s[1] > semantic_snippets[cur_idx].metadata["heading_font"]
    ):
        metadata = {"heading": s[0], "content_font": 0, "heading_font": s[1]}
        metadata.update(docs[0].metadata)
        semantic_snippets.append(Document(page_content="", metadata=metadata))
        cur_idx += 1
        continue

    # 동일 섹션 내용 판별: 현재 스니펫 글꼴 <= 이전 내용 글꼴
    if (
        not semantic_snippets[cur_idx].metadata["content_font"]
        or s[1] <= semantic_snippets[cur_idx].metadata["content_font"]
    ):
        semantic_snippets[cur_idx].page_content += s[0]
        semantic_snippets[cur_idx].metadata["content_font"] = max(
            s[1], semantic_snippets[cur_idx].metadata["content_font"]
        )
        continue

    # 새 섹션 생성 조건: 현재 스니펫 글꼴 > 이전 내용 글꼴, 이전 제목 글꼴 미만
    metadata = {"heading": s[0], "content_font": 0, "heading_font": s[1]}
    metadata.update(docs[0].metadata)
    semantic_snippets.append(Document(page_content="", metadata=metadata))
    cur_idx += 1

print(semantic_snippets[4])
  • 출력 예시:
page_content='KEY Contents
n 미국 바이든 대통령이 ‘안전하고 신뢰할 수 있는 AI 개발과 사용에 관한 행정명령’에 서명하고 
광범위한 행정 조치를 명시
n 행정명령은 △AI의 안전과 보안 기준 마련 △개인정보보호 △형평성과 시민권 향상 △소비자 
보호 △노동자 지원 △혁신과 경쟁 촉진 △국제협력을 골자로 함'
metadata={'heading': '미국, 안전하고 신뢰할 수 있는 AI 개발과 사용에 관한 행정명령 발표 \n', 'content_font': 12, 'heading_font': 15, 'source': './data/SPRI_AI_Brief_2023년12월호_F.pdf'}

PyPDF 디렉토리 로더

  • PyPDF 디렉토리 -- 디렉토리에서 PDF 파일을 로드하는 기능을 제공한다.

PyPDF 디렉토리 로더 사용

from langchain_community.document_loaders import PyPDFDirectoryLoader

# 디렉토리 경로 설정
loader = PyPDFDirectoryLoader("data/")

# 문서 로드
docs = loader.load()

# 문서의 개수 출력
print(len(docs))  # 출력: 294

# 특정 문서의 내용 출력
print(docs[50].page_content[:300])

PyPDF 디렉토리 로더 메타데이터 출력

print(docs[50].metadata)
  • 출력 예시:
{'source': 'data/디지털 정부혁신 추진계획.pdf', 'page': 7}

PDFPlumber

  • PDFPlumber -- PyMuPDF와 유사하게 출력 문서는 PDF와 그 페이지에 대한 자세한 메타데이터를 포함하며, 페이지 당 하나의 문서를 반환한다.

PDFPlumber 사용

from langchain_community.document_loaders import PDFPlumberLoader

# PDF 문서 로더 인스턴스 생성
loader = PDFPlumberLoader(FILE_PATH)

# 문서 로딩
docs = loader.load()

# 특정 문서의 내용 접근
print(docs[10].page_content[:300])

PDFPlumber 메타데이터 출력

show_metadata(docs)
  • 출력 예시:
[metadata]
['source', 'file_path', 'page', 'total_pages', 'Author', 'Creator', 'Producer', 'CreationDate', 'ModDate', 'PDFVersion']

[examples]
source       : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
file_path    : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
page         : 0
total_pages  : 23
Author       : dj
Creator      : Hwp 2018 10.0.0.13462
Producer     : Hancom PDF 1.3.0.542
CreationDate : D:20231208132838+09'00'
ModDate      : D:20231208132838+09'00'
PDFVersion   : 1.4

🏖️ 03. 한글(HWP)

HWP (한글)

  • 한글(HWP) -- 한글과컴퓨터에서 개발한 워드프로세서로, 한국의 대표적인 문서 작성 프로그램이다.
  • 파일 확장자로 .hwp를 사용하며, 기업, 학교, 정부 기관 등에서 널리 활용되고 있다. -- 대한민국 개발자라면 .hwp 문서를 처리해야 하는 경험을 해보았을 것이다. (혹은 해볼 예정이다)
  • 아쉽게도 LangChain에는 아직 통합이 되지 않아 직접 구현한 HWPLoader를 사용해야 한다.

HWP 문서 로드 예시

# 설치
# !pip install -qU langchain-teddynote
from langchain_teddynote.document_loaders import HWPLoader

# HWP Loader 객체 생성
loader = HWPLoader("./data/디지털 정부혁신 추진계획.hwp")

# 문서 로드
docs = loader.load()

# 결과 출력
print(docs[0].page_content[:1000])
  • 출력 예시:
디지털 정부혁신 추진계획
2019. 10. 29. 관계부처 합동
순 서
Ⅰ. 개요ȃ 1
Ⅱ. 디지털 정부혁신 추진계획ㆬȃ 2
  1. 우선 추진과제ȃ 2
     ① 선제적·통합적 대국민 서비스 혁신
     ② 공공부문 마이데이터 활성화
     ③ 시민참여를 위한 플랫폼 고도화
     ④ 현장중심 협업을 지원하는 스마트 업무환경 구현
     ⑤ 클라우드와 디지털서비스 이용 활성화
     ⑥ 개방형 데이터·서비스 생태계 구축
  2. 중장기 범정부 디지털 전환 로드맵 수립ᲈȃ 4
Ⅲ. 추진체계 및 일정ȃ 4
[붙임] 디지털 정부혁신 우선 추진과제(상세)ᬜȃ 8
Ⅰ. 개 요
□ 추진 배경
 ○ 우리나라는 국가적 초고속 정보통신망 투자와 적극적인 공공정보화 사업 추진에 힘입어 세계 최고수준의 전자정부를 구축‧운영
     * UN전자정부평가에서 2010‧12‧14년 1위, 16‧18년 3위, UN공공행정상 13회 수상
 ○ 그러나, 인공지능‧클라우드 중심의 디지털 전환(Digital Transformation) 시대가 도래함에 따라 기존 전자정부의 한계 표출
   - 축적된 행정데이터에도 불구하고 기관간 연계‧활용 미흡, 부처 단위로 단절된 서비스, 신기술 활용을 위한 제도‧기반 부족
   - 디지털 전환을 위한 컨트롤타워가 없고, 구체적 전략도 부재
 ○ 이에, ‘19.3월부터 공공부문 ICT 활용현황 및 문제점 검토에 착수하여 공공분야 디지털 전환을 위한 추진계획 마련
     * 관계부처 협의 21회(행안,과기정통,기재,복지,권익위,국정원 등), 민간전문가 의견청취 10회
□ 문제점 진단 및 평가
 ○ (서비스) 국민과 최종 이용자 관점에서 서비스 혁신 미흡
   - 자격이 있어도 자신이 받을 수 있는 공공서비스를 파악하기 어려워 사각지대가 발생하고, 온라인 신청 가능한 서비스도 제한적
 ○ (데이터) 기관별로 축적·보유한 데이터의 연계와 활용 부족
   - A기관에서 서류를 발급받아 B기관에 제출하는 관행(연간 증명서 9.5억건‘18년 발급) 등 데이터가 국민편익 향상에 제대로 활용

HWP 문서 메타데이터 출력

  • 메타데이터에는 파일명 정보가 담겨 있다.
# 메타데이터 출력
print(docs[0].metadata)
  • 출력 예시:
{'source': './data/디지털 정부혁신 추진계획.hwp'}

🏖️ 04. CSV

CSV

  • Comma-Separated Values (CSV) -- 쉼표로 값을 구분하는 구분된 텍스트 파일이다. -- 파일의 각 줄은 데이터 레코드이다.
  • 각 레코드는 쉼표로 구분된 하나 이상의 필드로 구성된다.

CSVLoader

  • CSVLoader -- CSV 데이터를 문서당 한 행씩 로드한다.

CSV 파일 로드 예시

from langchain_community.document_loaders.csv_loader import CSVLoader

# CSV 로더 생성
loader = CSVLoader(file_path="./data/titanic.csv")

# 데이터 로드
docs = loader.load()

print(len(docs))  # 출력: 891
print(docs[0].metadata)  # 출력: {'source': './data/titanic.csv', 'row': 0}

CSV 파싱 및 로딩 커스터마이징

  • csv 모듈 문서를 참조하여 지원되는 csv_args에 대한 자세한 정보를 확인할 수 있다.

커스터마이징된 CSV 로더 예시

# CSV 파일 경로
loader = CSVLoader(
    file_path="./data/titanic.csv",
    csv_args={
        "delimiter": ",",  # 구분자
        "quotechar": '"',  # 인용 부호 문자
        "fieldnames": [
            "Passenger ID",
            "Survival (1: Survived, 0: Died)",
            "Passenger Class",
            "Name",
            "Sex",
            "Age",
            "Number of Siblings/Spouses Aboard",
            "Number of Parents/Children Aboard",
            "Ticket Number",
            "Fare",
            "Cabin",
            "Port of Embarkation",
        ],  # 필드 이름
    },
)

# 데이터 로드
docs = loader.load()

# 데이터 출력
print(docs[1].page_content)
  • 출력 예시:
Passenger ID: 1
Survival (1: Survived, 0: Died): 0
Passenger Class: 3
Name: Braund, Mr. Owen Harris
Sex: male
Age: 22
Number of Siblings/Spouses Aboard: 1
Number of Parents/Children Aboard: 0
Ticket Number: A/5 21171
Fare: 7.25
Cabin: 
Port of Embarkation: S
  • source_column 인자를 사용하여 각 행에서 생성된 문서의 출처를 지정할 수 있다. -- 그렇지 않으면 모든 문서의 출처로 file_path가 사용된다.
loader = CSVLoader(
    file_path="./data/titanic.csv", source_column="PassengerId"
)  # CSV 로더 설정, 파일 경로 및 소스 컬럼 지정

docs = loader.load()  # 데이터 로드

print(docs[1])  # 데이터 출력
  • 출력 예시:
page_content='PassengerId: 2
Survived: 1
Pclass: 1
Name: Cumings, Mrs. John Bradley (Florence Briggs Thayer)
Sex: female
Age: 38
SibSp: 1
Parch: 0
Ticket: PC 17599
Fare: 71.2833
Cabin: C85
Embarked: C'
metadata={'source': '2', 'row': 1}

UnstructuredCSVLoader

  • UnstructuredCSVLoader -- 비구조화된 CSV 파일을 로드할 수 있는 기능을 제공한다. -- "elements" 모드에서 사용하면 메타데이터에서 테이블의 HTML 표현을 제공한다.

UnstructuredCSVLoader 사용 예시

from langchain_community.document_loaders.csv_loader import UnstructuredCSVLoader

# 비구조화 CSV 로더 인스턴스 생성
loader = UnstructuredCSVLoader(file_path="./data/titanic.csv", mode="elements")

# 문서 로드
docs = loader.load()

# 첫 번째 문서의 HTML 텍스트 메타데이터 출력
print(docs[0].metadata["text_as_html"][:1000])

DataFrameLoader

  • Pandas -- Python 프로그래밍 언어를 위한 오픈 소스 데이터 분석 및 조작 도구이다. -- 데이터 과학, 머신러닝, 그리고 다양한 분야의 데이터 작업에 널리 사용된다.

Pandas를 사용하여 CSV 파일 읽기 예시

import pandas as pd

# CSV 파일 읽기
df = pd.read_csv("./data/titanic.csv")

# 데이터프레임의 처음 다섯 행 조회
df.head()
  • 출력 예시:
   PassengerId  Survived  Pclass Name Sex  Age SibSp Parch Ticket Fare Cabin Embarked
1           0        3  Braund, Mr. Owen Harris  male  22  1  0  A/5 21171  7.25  NaN  S
2           1        1  Cumings, Mrs. John Bradley (Florence Briggs Thayer)  female  38  1  0  PC 17599  71.2833  C85  C
3           1        3  Heikkinen, Miss. Laina  female  26  0  0  STON/O2. 3101282  7.9250  NaN  S
4           1        1  Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35  1  0  113803  53.1000  C123  S
5           0        3  Allen, Mr. William Henry  male  35  0  0  373450  8.0500  NaN  S

DataFrameLoader 사용 예시

from langchain_community.document_loaders import DataFrameLoader

# 데이터 프레임 로더 설정, 페이지 내용 컬럼 지정
loader = DataFrameLoader(df, page_content_column="Name")

# 문서 로드
docs = loader.load()

# 데이터 출력
print(docs[0].page_content)

# 메타데이터 출력
print(docs[0].metadata)
  • 출력 예시:
Braund, Mr. Owen Harris
{'PassengerId': 1, 'Survived': 0, 'Pclass': 3, 'Sex': 'male', 'Age': 22.0, 'SibSp': 1, 'Parch': 0, 'Ticket': 'A/5 21171', 'Fare': 7.25, 'Cabin': nan, 'Embarked': 'S'}
  • 지연 로딩 -- 큰 테이블의 경우 전체 테이블을 메모리에 로드하지 않고, 필요에 따라 데이터를 지연 로딩할 수 있다.
# 큰 테이블에 대한 지연 로딩, 전체 테이블을 메모리에 로드하지 않음
for row in loader.lazy_load():
    print(row)
    break  # 첫 행만 출력
  • 출력 예시:
page_content='Braund, Mr. Owen Harris'
metadata={'PassengerId': 1, 'Survived': 0, 'Pclass': 3, 'Sex': 'male', 'Age': 22.0, 'SibSp': 1, 'Parch': 0, 'Ticket': 'A/5 21171', 'Fare': 7.25, 'Cabin': nan, 'Embarked': 'S'}

🏖️ 05. Excel

Excel

  • UnstructuredExcelLoader -- Microsoft Excel 파일을 로드하는 데 사용되는 로더이다.
  • 이 로더는 .xlsx.xls 파일 모두에서 작동하며, 페이지 내용은 Excel 파일의 원시 텍스트로 로드된다.
  • "elements" 모드에서 로더를 사용하는 경우, 문서 메타데이터의 text_as_html 키 아래에 Excel 파일의 HTML 표현이 제공된다.

UnstructuredExcelLoader 사용 예시

# 설치
# !pip install -qU langchain-community unstructured openpyxl
from langchain_community.document_loaders import UnstructuredExcelLoader

# UnstructuredExcelLoader 생성
loader = UnstructuredExcelLoader("./data/titanic.xlsx", mode="elements")

# 문서 로드
docs = loader.load()

# 문서 길이 출력
print(len(docs))  # 출력: 1
  • 1개의 문서로 로드되었음을 확인한다.

Excel 파일의 내용 출력

  • page_content에는 각 행의 데이터가 저장되고, metadatatext_as_html에는 각 행의 데이터가 HTML 형식으로 저장된다.
# 문서 출력
print(docs[0].page_content[:200])
  • 출력 예시:
PassengerId
Survived
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked

1
0
3
Braund, Mr. Owen Harris
male
22
1
0
A/5 21171
7.25

S

메타데이터의 HTML 출력

# metadata 의 text_as_html 출력
print(docs[0].metadata["text_as_html"][:1000])
  • 출력 예시:
PassengerId	Survived	Pclass	Name	Sex	Age	SibSp	Parch	Ticket	Fare	Cabin	Embarked
1	0	3	Braund, Mr. Owen Harris	male	22	1	0	A/5 21171	7.25		S
2	1	1	Cumings, Mrs. John Bradley (Florence Briggs Thayer)	female	38	1	0	PC 17599	71.2833	C85	C

DataFrameLoader

  • CSV 파일과 마찬가지로 Excel 파일을 로드하는 read_excel() 기능을 사용하여 DataFrame으로 만든 뒤 로드할 수 있다.

Pandas를 사용한 Excel 파일 로드 예시

import pandas as pd

# Excel 파일 읽기
df = pd.read_excel("./data/titanic.xlsx")

from langchain_community.document_loaders import DataFrameLoader

# 데이터 프레임 로더 설정, 페이지 내용 컬럼 지정
loader = DataFrameLoader(df, page_content_column="Name")

# 문서 로드
docs = loader.load()

# 데이터 출력
print(docs[0].page_content)

# 메타데이터 출력
print(docs[0].metadata)
  • 출력 예시:
Braund, Mr. Owen Harris
{'PassengerId': 1, 'Survived': 0, 'Pclass': 3, 'Sex': 'male', 'Age': 22.0, 'SibSp': 1, 'Parch': 0, 'Ticket': 'A/5 21171', 'Fare': 7.25, 'Cabin': nan, 'Embarked': 'S'}

🏖️ 06. Word

Microsoft Word

  • Microsoft Word -- Microsoft에서 개발한 워드 프로세서이다. -- Word 문서를 하류에서 사용할 수 있는 문서 형식으로 로드하는 방법을 다룬다.

Docx2txtLoader

  • Docx2txtLoader -- Docx2txt를 사용하여 .docx 파일을 문서로 불러올 수 있다.

Docx2txtLoader 사용 예시

# 설치
# !pip install -qU docx2txt
from langchain_community.document_loaders import Docx2txtLoader

# 문서 로더 초기화
loader = Docx2txtLoader("./data/sample-word-document.docx")

# 문서 로딩
docs = loader.load()

print(len(docs))  # 출력: 1

UnstructuredWordDocumentLoader

  • UnstructuredWordDocumentLoader -- 비구조화된 Word 문서를 로드하는 데 사용된다. -- 결과는 1개의 단일 Document로 로드된다.

UnstructuredWordDocumentLoader 사용 예시

from langchain_community.document_loaders import UnstructuredWordDocumentLoader

# 비구조화된 워드 문서 로더 인스턴스화
loader = UnstructuredWordDocumentLoader("./data/sample-word-document.docx")

# 문서 로드
docs = loader.load()

print(len(docs))  # 출력: 1
  • metadata 출력 예시:
# metadata 출력
print(docs[0].metadata)
{'source': './data/sample-word-document.docx', 'filename': 'sample-word-document.docx', 'file_directory': './data', 'last_modified': '2024-07-30T03:09:26', 'filetype': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'category_depth': 0, 'page_number': 1, 'category': 'Title'}

텍스트 요소 분리 모드

  • UnstructuredWordDocumentLoader -- 기본적으로 비정형 텍스트 덩어리마다 서로 다른 "요소"를 생성한다. -- 이들은 기본적으로 함께 결합되어 있지만 mode="elements"를 지정하여 쉽게 분리할 수 있다.

UnstructuredWordDocumentLoader의 요소 분리 모드 사용 예시

# UnstructuredWordDocumentLoader
loader = UnstructuredWordDocumentLoader(
    "./data/sample-word-document.docx", mode="elements"
)

# 데이터 로드
docs = loader.load()

# 로드한 문서의 개수 출력
print(len(docs))  # 출력: 125

# 첫번째 문서의 내용 출력
print(docs[0].page_content)
  • 출력 예시:
Semantic Search
  • metadata 출력 예시:
docs[0].metadata
{'source': './data/sample-word-document.docx', 'filename': 'sample-word-document.docx', 'file_directory': './data', 'last_modified': '2024-07-30T03:09:26', 'filetype': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'category_depth': 0, 'page_number': 1, 'category': 'Title'}

🏖️ 07. PowerPoint

Microsoft PowerPoint

  • Microsoft PowerPoint -- Microsoft에서 개발한 프레젠테이션 프로그램이다. -- 이 프로그램을 통해 생성된 문서를 다운스트림에서 사용할 수 있는 문서 형식으로 로드하는 방법을 다룬다.

UnstructuredPowerPointLoader

  • UnstructuredPowerPointLoader -- Microsoft PowerPoint 문서를 로드하는 데 사용되는 로더이다. -- 다양한 "elements"를 생성하여 텍스트의 다양한 청크를 처리할 수 있다.

UnstructuredPowerPointLoader 사용 예시

# 패키지 설치
# !pip install -qU unstructured python-pptx
from langchain_community.document_loaders import UnstructuredPowerPointLoader

# UnstructuredPowerPointLoader 생성
loader = UnstructuredPowerPointLoader("./data/sample-ppt.pptx")

# 데이터 로드
docs = loader.load()

# 로드한 문서의 개수 출력
print(len(docs))  # 출력: 1
  • Unstructured는 기본적으로 텍스트의 다양한 청크에 대해 다양한 "elements"를 생성한다. -- 기본적으로 결합되어 하나의 문서로 반환되지만, mode="elements"를 지정함으로써 쉽게 요소들을 분리할 수 있다.

요소 분리 모드 사용 예시

# UnstructuredPowerPointLoader 생성
loader = UnstructuredPowerPointLoader("./data/sample-ppt.pptx", mode="elements")

# 데이터 로드
docs = loader.load()

# 로드한 문서의 개수 출력
print(len(docs))  # 출력: 17

# 첫번째 문서의 내용 출력
print(docs[0].page_content)
  • 출력 예시:
랭체인 한국어 튜토리얼
  • metadata 출력 예시:
docs[0].metadata
{'source': './data/sample-ppt.pptx', 'filename': 'sample-ppt.pptx', 'file_directory': './data', 'last_modified': '2024-07-30T03:11:38', 'filetype': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'page_number': 1, 'category': 'Title'}

🏖️ 08. 웹 문서(WebBaseLoader)

WebBaseLoader

  • WebBaseLoader -- 웹 기반 문서를 로드하는 로더이다. -- bs4 라이브러리를 사용하여 웹 페이지를 파싱하며, bs4.SoupStrainer를 사용하여 파싱할 요소를 지정할 수 있다.
  • bs_kwargs 매개변수를 사용하여 bs4.SoupStrainer의 추가적인 인수를 지정할 수 있다.

WebBaseLoader 사용 예시

import bs4
from langchain_community.document_loaders import WebBaseLoader

# 뉴스기사 내용을 로드합니다.
loader = WebBaseLoader(
    web_paths=("https://n.news.naver.com/article/437/0000378416",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["newsct_article _article_body", "media_end_head_title"]},
        )
    ),
    header_template={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    },
)

docs = loader.load()
print(f"문서의 수: {len(docs)}")  # 출력: 문서의 수: 1
  • SSL 인증 오류를 우회하기 위해 "verify" 옵션을 설정할 수 있다.
# ssl 인증 우회
loader.requests_kwargs = {"verify": False}

# 데이터 로드
docs = loader.load()
  • 여러 웹페이지를 한 번에 로드할 수도 있으며, 이를 위해 urls의 리스트를 로더에 전달하면 전달된 urls의 순서대로 문서 리스트를 반환한다.
loader = WebBaseLoader(
    web_paths=[
        "https://n.news.naver.com/article/437/0000378416",
        "https://n.news.naver.com/mnews/hotissue/article/092/0002340014?type=series&cid=2000063",
    ],
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["newsct_article _article_body", "media_end_head_title"]},
        )
    ),
    header_template={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    },
)

# 데이터 로드
docs = loader.load()

# 문서 수 확인
print(len(docs))  # 출력: 2

웹에서 가져온 결과 출력 예시

print(docs[0].page_content[:500])
print("===" * 10)
print(docs[1].page_content[:500])
  • 출력 예시:
출산 직원에게 '1억원' 쏜다…회사의 파격적 저출생 정책

[앵커]올해 아이 낳을 계획이 있는 가족이라면 솔깃할 소식입니다. 정부가 저출생 대책으로 매달 주는 부모 급여, 0세 아이는 100만원으로 올렸습니다. 여기에 첫만남이용권, 아동수당까지 더하면 아이 돌까지 1년 동안 1520만원을 받습니다. 지자체도 경쟁하듯 지원에 나섰습니다. 인천시는 새로 태어난 아기, 18살될 때까지 1억원을 주겠다. 광주시도 17살될 때까지 7400만원 주겠다고 했습니다. 선거 때면 나타나서 아이 낳으면 현금 주겠다고 밝힌 사람이 있었죠. 과거에는 표만 노린 '황당 공약'이라는 비판이 따라다녔습니다. 그런데 지금은 출산율이 이보다 더 나쁠 수 없다보니, 이런 현금성 지원을 진지하게 정책화 하는 상황까지 온 겁니다. 게다가 기업들도 뛰어들고 있습니다. 이번에는 출산한 직원에게 단번에 1억원을 주겠다는 회사까지 나타났습니다.이상화 기자가 취재했습니다.[기자]한 그룹사가 오늘 파격적인 저출생 정책을 내놨
==============================
고속 성장하는 스타트업엔 레드팀이 필요하다

[이균성의 溫技] 초심, 본질을 잃을 때한 스타트업 창업자와 최근 점심을 같이 했다. 조언을 구할 게 있다고 했다. 당장 급한 현안이 있는 건 아니었다. 여러 번 창업한 경험이 있는데 지금 하고 있는 아이템은 대박 느낌이 든다고 헸다. 그런데 오히려 더 조심해야겠다는 생각이 들더란다. 조언을 구하고자 하는 바도 성장이 예상될 때 무엇을 경계해야 할지 알고 싶다는 거였다. 적잖은 스타트업 창업자를 만났지만 드문 사례였다.2년 가까이 스타트업 창업자를 릴레이 인터뷰 하면서 의미 있게 생각했던 것이 두 가지 있다. 첫째, 회사라는 단어보다 팀이라는 어휘를 주로 쓰고 있다는 점이었다. 그 표현의 유래나 의미 때문이라기보다는 팀이라는 말이 더 정겨워 뜻 깊게 생각된 듯하다. 이해관계보다 지향하는 뜻에 더 중점을 두고 하나의 마음으로 한 곳을 향해 달려가는 집단을 가리키는 표현이라는 생각에 더 정겨웠다.스타트업 대표들의 창업 동기는 대부분 ‘사회
  • 프록시 사용 -- IP 차단을 우회하기 위해 프록시를 사용할 수 있다. 프록시를 사용하려면 로더에 프록시 딕셔너리를 전달하면 된다.
loader = WebBaseLoader(
    "https://www.google.com/search?q=parrots",
    proxies={
        "http": "http://{username}:{password}:@proxy.service.com:6666/",
        "https": "https://{username}:{password}:@proxy.service.com:6666/",
    },
)

# 문서 로드
docs = loader.load()

🏖️ 09. 텍스트(TextLoader)

TXT Loader

  • .txt 확장자를 가지는 파일을 로더로 로드하는 방법을 살펴보겠다.

TextLoader 사용 예시

from langchain_community.document_loaders import TextLoader

# 텍스트 로더 생성
loader = TextLoader("data/appendix-keywords.txt")

# 문서 로드
docs = loader.load()
print(f"문서의 수: {len(docs)}\n")  # 출력: 문서의 수: 1

print("[메타데이터]\n")
print(docs[0].metadata)

print("\n========= [앞부분] 미리보기 =========\n")
print(docs[0].page_content[:500])
  • 출력 예시:
[메타데이터]

{'source': 'data/appendix-keywords.txt'}

========= [앞부분] 미리보기 =========

Semantic Search

정의: 의미론적 검색은 사용자의 질의를 단순한 키워드 매칭을 넘어서 그 의미를 파악하여 관련된 결과를 반환하는 검색 방식입니다.
예시: 사용자가 "태양계 행성"이라고 검색하면, "목성", "화성" 등과 같이 관련된 행성에 대한 정보를 반환합니다.
연관키워드: 자연어 처리, 검색 알고리즘, 데이터 마이닝

TextLoader를 통한 파일 인코딩 자동 감지

  • TextLoader 클래스는 디렉토리에서 임의의 파일 목록을 대량으로 로드할 때 유용한 몇 가지 전략을 제공한다.
  • silent_errors -- 디렉토리 로더에 이 매개변수를 전달하여 로드할 수 없는 파일을 건너뛰고 로드 프로세스를 계속할 수 있다.
  • autodetect_encoding -- 로더 클래스에 자동 감지 인코딩을 전달하여 실패하기 전에 파일 인코딩을 자동으로 감지하도록 요청할 수 있다.

TextLoader를 통한 인코딩 자동 감지 예시

from langchain_community.document_loaders import DirectoryLoader

path = "data/"

text_loader_kwargs = {"autodetect_encoding": True}

loader = DirectoryLoader(
    path,
    glob="**/*.txt",
    loader_cls=TextLoader,
    silent_errors=True,
    loader_kwargs=text_loader_kwargs,
)

docs = loader.load()

# 로드된 파일들의 목록 확인
doc_sources = [doc.metadata["source"] for doc in docs]
print(doc_sources)
  • 출력 예시:
['data/appendix-keywords-CP949.txt', 'data/reference.txt', 'data/appendix-keywords-EUCKR.txt', 'data/chain-of-density.txt', 'data/appendix-keywords.txt', 'data/appendix-keywords-utf8.txt']

메타데이터와 파일 내용 미리보기

print("[메타데이터]\n")
print(docs[2].metadata)

print("\n========= [앞부분] 미리보기 =========\n")
print(docs[2].page_content[:500])
  • 출력 예시:
[메타데이터]

{'source': 'data/appendix-keywords-EUCKR.txt'}

========= [앞부분] 미리보기 =========

Semantic Search

정의: 의미론적 검색은 사용자의 질의를 단순한 키워드 매칭을 넘어서 그 의미를 파악하여 관련된 결과를 반환하는 검색 방식입니다.
예시: 사용자가 "태양계 행성"이라고 검색하면, "목성", "화성" 등과 같이 관련된 행성에 대한 정보를 반환합니다.
연관키워드: 자연어 처리, 검색 알고리즘, 데이터 마이닝

🏖️ 10. JSON

JSON

  • .json 확장자를 가지는 파일을 로더로 로드하는 방법을 살펴보겠다.

JSON 파일 로드 예시

import json
from pathlib import Path
from pprint import pprint

# JSON 파일 경로
file_path = "data/people.json"

# JSON 파일 로드
data = json.loads(Path(file_path).read_text())

# 데이터 출력
pprint(data)
  • 출력 예시:
[{'address': {'city': '서울', 'street': '312번지', 'zipCode': '83795'},
  'age': 31,
  'carOwnership': True,
  'hobbies': ['요리', '음악 감상', '사진 촬영'],
  'isMarried': True,
  'name': '박시우',
  'phoneNumbers': ['483-4639-1933', '947-4179-7976']},
 {'address': {'city': '서울', 'street': '877번지', 'zipCode': '36780'},
  'age': 31,
  'carOwnership': True,
  'hobbies': ['여행', '음악 감상', '등산'],
  'isMarried': False,
  'name': '정수아',
  'phoneNumbers': ['337-5721-3227', '387-3768-9586']},
 ...
 (중략)
 ...
 {'address': {'city': '서울', 'street': '940번지', 'zipCode': '60335'},
  'age': 52,
  'carOwnership': True,
  'hobbies': ['요리', '사진 촬영', '등산'],
  'isMarried': True,
  'name': '최도윤',
  'phoneNumbers': ['290-8270-9786', '483-1765-4028']},
 {'address': {'city': '서울', 'street': '289번지', 'zipCode': '59793'},
  'age': 18,
  'carOwnership': True,
  'hobbies': ['여행', '요리', '영화 감상'],
  'isMarried': True,
  'name': '최주원',
  'phoneNumbers': ['460-4533-7245', '344-2344-7362']}]
  • data의 첫 번째 요소의 타입을 확인:
type(data[0])
  • 출력: dict

JSONLoader

  • JSONLoader -- JSON 데이터를 로드하고 특정 키 내의 필드를 추출할 수 있다. -- 예를 들어, 메시지 키 내 content 필드 아래의 값을 추출할 수 있다.

JSONLoader 사용 예시

from langchain_community.document_loaders import JSONLoader

# JSONLoader 생성
loader = JSONLoader(
    file_path="data/people.json",
    jq_schema=".[].phoneNumbers",
    text_content=False,
)

# 문서 로드
docs = loader.load()

# 결과 출력
pprint(docs)
  • 출력 예시:
[Document(metadata={'source': '/Users/teddy/Dev/github/langchain-master/07-DocumentLoader/data/people.json', 'seq_num': 1}, page_content="['483-4639-1933', '947-4179-7976']"),
 Document(metadata={'source': '/Users/teddy/Dev/github/langchain-master/07-DocumentLoader/data/people.json', 'seq_num': 2}, page_content="['337-5721-3227', '387-3768-9586']"),
 Document(metadata={'source': '/Users/teddy/Dev/github/langchain-master/07-DocumentLoader/data/people.json', 'seq_num': 3}, page_content="['354-5563-4638', '471-9212-1826']"),
...
(중략)
...
 Document(metadata={'source': '/Users/teddy/Dev/github/langchain-master/07-DocumentLoader/data/people.json', 'seq_num': 19}, page_content="['290-8270-9786', '483-1765-4028']"),
 Document(metadata={'source': '/Users/teddy/Dev/github/langchain-master/07-DocumentLoader/data/people.json', 'seq_num': 20}, page_content="['460-4533-7245', '344-2344-7362']")]

🏖️ 11. Arxiv

Arxiv

  • arXiv는 물리학, 수학, 컴퓨터 과학, 정량 생물학, 정량 금융, 통계, 전기공학 및 시스템 과학, 경제학 분야의 200만 편 이상의 학술 논문을 위한 오픈 액세스 아카이브이다.

  • Arxiv 문서 로더에 접근하려면 arxiv, PyMuPDFlangchain-community 통합 패키지를 설치해야 한다.

    • PyMuPDFarxiv.org 사이트에서 다운로드한 PDF 파일을 텍스트 형식으로 변환한다.
# 패키지 설치
!pip install -qU langchain-community arxiv pymupdf

ArxivLoader 객체 생성

  • ArxivLoader 객체를 인스턴스화하고 문서를 로드한다.
from langchain_community.document_loaders import ArxivLoader

# Query에 검색하고자 하는 논문의 주제를 입력
loader = ArxivLoader(
    query="Chain of thought",
    load_max_docs=2,  # 최대 문서 수
    load_all_available_meta=True,  # 메타데이터 전체 로드 여부
)

# 문서 로드 결과 출력
docs = loader.load()
docs
  • 출력 예시:
[Document(metadata={'Published': '2023-11-15', 'Title': 'Contrastive Chain-of-Thought Prompting', 'Authors': 'Yew Ken Chia, Guizhen Chen, Luu Anh Tuan, Soujanya Poria, Lidong Bing', ...}), 
 Document(metadata={'Published': '2024-03-23', 'Title': 'Beyond Chain-of-Thought, Effective Graph-of-Thought Reasoning in Language Models', 'Authors': 'Yao Yao, Zuchao Li, Hai Zhao', ...})]
  • 메타데이터 출력:
# 첫 번째 문서의 메타데이터 출력
docs[0].metadata
  • 출력 예시:
{'Published': '2023-11-15', 'Title': 'Contrastive Chain-of-Thought Prompting', 'Authors': 'Yew Ken Chia, Guizhen Chen, Luu Anh Tuan, Soujanya Poria, Lidong Bing', ...}

load_all_available_meta=False 설정

  • 메타데이터 전체가 아닌 일부만 출력되도록 설정할 수 있다.
loader = ArxivLoader(
    query="ChatGPT",
    load_max_docs=2,  # 최대 문서 수
    load_all_available_meta=False,  # 메타데이터 전체 로드 여부
)

# 문서 로드 결과 출력
docs = loader.load()
docs[0].metadata
  • 출력 예시:
{'Published': '2023-05-23', 'Title': 'Is Information Extraction Solved by ChatGPT? ...'}

문서 요약

  • 논문의 전체 내용이 아닌 요약본을 출력하고자 할 경우, get_summaries_as_docs() 함수를 호출한다.
# 문서 요약 로딩
docs = loader.get_summaries_as_docs()

# 첫 번째 문서 접근
print(docs[0].page_content)
  • 출력 예시:
ChatGPT has stimulated the research boom in the field of large language models. In this paper, we assess the capabilities of ChatGPT from four perspectives including Performance, Evaluation Criteria, Robustness and Error Types. ...

lazy_load() 기능

  • 대량의 문서를 로드할 때 메모리 사용량을 최소화하기 위해 문서를 한 번에 하나씩 지연 로드할 수 있다.
docs = []

# 문서 지연 로드
for doc in loader.lazy_load():
    docs.append(doc)
  • 출력 예시:
[Document(metadata={'Published': '2023-05-23', 'Title': 'Is Information Extraction Solved by ChatGPT? ...}), 
 Document(metadata={'Published': '2023-10-05', 'Title': 'In ChatGPT We Trust? Measuring and Characterizing the Reliability of ChatGPT', ...})]

🏖️ 12. UpstageLayoutAnalysisLoader

UpstageLayoutAnalysisLoader

  • UpstageLayoutAnalysisLoader는 Upstage AI에서 제공하는 문서 분석 도구로, LangChain 프레임워크와 통합되어 사용할 수 있는 문서 로더이다.

    • PDF, 이미지 등 다양한 형식의 문서에서 레이아웃 분석 수행

    • 문서의 구조적 요소(제목, 단락, 표, 이미지 등)를 자동으로 인식 및 추출

    • OCR 기능 지원 (선택적)

  • UpstageLayoutAnalysisLoader는 단순한 텍스트 추출을 넘어 문서의 구조를 이해하고 요소 간 관계를 파악하여 보다 정확한 문서 분석을 가능하게 한다.

설치

pip install -U langchain-upstage

API Key 설정

  • .env 파일에 UPSTAGE_API_KEY 키를 설정해야 한다.
from dotenv import load_dotenv

# API KEY 정보 로드
load_dotenv()
True

환경 설정

# LangSmith 추적을 설정합니다. https://smith.langchain.com
# !pip install langchain-teddynote
from langchain_teddynote import logging

# 프로젝트 이름을 입력합니다.
logging.langsmith("CH07-DocumentLoader")
  • UpstageLayoutAnalysisLoader의 주요 파라미터:

    • file_path: 분석할 문서 경로

    • output_type: 출력 형식 [(기본값) 'html', 'text']

    • split: 문서 분할 방식 ['none', 'element', 'page']

    • use_ocr=True: OCR 사용

    • exclude=["header", "footer"]: 헤더, 푸터 제외

UpstageLayoutAnalysisLoader 사용 예시

from langchain_upstage import UpstageLayoutAnalysisLoader

# 파일 경로
file_path = "./data/SPRI_AI_Brief_2023년12월호_F.pdf"

# 문서 로더 설정
loader = UpstageLayoutAnalysisLoader(
    file_path,
    output_type="text",
    split="page",
    use_ocr=True,
    exclude=["header", "footer"],
)

# 문서 로드
docs = loader.load()

# 결과 출력
for doc in docs[:3]:
    print(doc)
  • 출력 예시:
page_content='SPRi AI Brief 인공지능 산업의 최신 동향 2023년 12월호' metadata={'page': 1}
page_content='2023년 12월호 CONTENTS I 인공지능 산업 동향 브리프 1. 정책/법제 ▷ 미국, 안전하고 신뢰할 수 있는 AI 개발과 사용에 관한 행정명령 발표 1 ▷ G7, 히로시마 AI 프로세스를 통해 AI 기업 대상 국제 행동강령에 합의 2 ▷ 영국 AI 안전성 정상회의에 참가한 28개국, AI 위험에 공동 대응 선언 3 ▷ 미국 법원, 예술가들이 생성 AI 기업에 제기한 저작권 소송 기각 4 ▷ 미국 연방거래위원회, 저작권청에 소비자 보호와 경쟁 측면의 AI 의견서 제출 5 ▷ EU AI 법 3자 협상, 기반모델 규제 관련 견해차로 난항 6 2. 기업/산업 ▷ 미국 프런티어 모델 포럼, 1,000만 달러 규모의 AI 안전 기금 조성 7 ▷ 코히어, 데이터 투명성 확보를 위한 데이터 출처 탐색기 공개 8 ▷ 알리바바 클라우드, 최신 LLM '통이치엔원 2.0' 공개 9 ▷ 삼성전자, 자체 개발 생성 AI '삼성 가우스' 공개 10 ▷ 구글, 앤스로픽에 20억 달러 투자로 생성 AI 협력 강화 11 ▷ IDC, 2027년 AI 소프트웨어 매출 2,500억 달러 돌파 전망 12 ▷ 빌 게이츠, AI 에이전트로 인한 컴퓨터 사용의 패러다임 변화 전망 13 ▷ 유튜브, 2024년부터 AI 생성 콘텐츠 표시 의무화 14 3. 기술/연구 ▷ 영국 과학혁신기술부, AI 안전 연구소 설립 발표 15 ▷ 구글 딥마인드, 범용 AI 모델의 기능과 동작에 대한 분류 체계 발표 16 ▷ 갈릴레오의 LLM 환각 지수 평가에서 GPT-4가 가장 우수 17 4. 인력/교육 ▷ 영국 옥스퍼드 인터넷 연구소, AI 기술자의 임금이 평균 21% 높아 18 II. 주요 행사 ▷ CES 2024 19 ▷ AIMLA 2024 19 ▷ AAAI Conference on Artificial Intelligence 19' metadata={'page': 2}
page_content='I . 인공지능 산업 동향 브리프' metadata={'page': 3}

🏖️ 14. LlamaParser

LlamaParser

  • LlamaParserLlamaIndex에서 개발한 문서 파싱 서비스로, 대규모 언어 모델(LLM)을 위해 특별히 설계된 도구이다.

    • PDF, Word, PowerPoint, Excel 등 다양한 문서 형식 지원

    • 자연어 지시를 통한 맞춤형 출력 형식 제공

    • 복잡한 표와 이미지 추출 기능

    • JSON 모드 지원

    • 외국어 지원

  • LlamaParser는 독립형 API로 제공되며, LlamaCloud 플랫폼의 일부로도 사용 가능하다.

    • 이 서비스는 문서를 파싱하고 정제하여 검색 증강 생성(RAG) 등 LLM 기반 애플리케이션의 성능을 향상시키는 것을 목표로 한다.

API 키 설정

  • API 키를 발급 후 .env 파일에 LLAMA_CLOUD_API_KEY 에 설정한다.
pip install llama-index-core llama-parse llama-index-readers-file python-dotenv
import os
import nest_asyncio
from dotenv import load_dotenv

load_dotenv()
nest_asyncio.apply()

기본 파서 적용

from llama_parse import LlamaParse
from llama_index.core import SimpleDirectoryReader

# 파서 설정
parser = LlamaParse(
    result_type="markdown",  # "markdown"과 "text" 사용 가능
    num_workers=8,  # worker 수 (기본값: 4)
    verbose=True,
    language="ko",
)

# SimpleDirectoryReader를 사용하여 파일 파싱
file_extractor = {".pdf": parser}

# LlamaParse로 파일 파싱
documents = SimpleDirectoryReader(
    input_files=["data/SPRI_AI_Brief_2023년12월호_F.pdf"],
    file_extractor=file_extractor,
).load_data()

# 페이지 수 확인
len(documents)
  • LlamaIndex에서 LangChain Document로 변환:
# 랭체인 도큐먼트로 변환
docs = [doc.to_langchain_format() for doc in documents]

# metadata 출력
docs[0].metadata

MultiModal Model 로 파싱

  • 주요 파라미터:

    • use_vendor_multimodal_model: 멀티모달 모델 사용 여부

    • vendor_multimodal_model_name: 사용할 멀티모달 모델의 이름

    • vendor_multimodal_api_key: 멀티모달 모델 API

    • result_type: 파싱 결과 형식

    • language: 파싱할 문서의 언어

    • skip_diagonal_text: 대각선 텍스트 건너뛰기

    • page_separator: 페이지 구분자 지정

documents = LlamaParse(
    use_vendor_multimodal_model=True,
    vendor_multimodal_model_name="openai-gpt4o",
    vendor_multimodal_api_key=os.environ["OPENAI_API_KEY"],
    result_type="markdown",
    language="ko",
    # skip_diagonal_text=True,
    # page_separator="\n=================\n"
)

# parsing 된 결과
parsed_docs = documents.load_data(file_path="data/SPRI_AI_Brief_2023년12월호_F.pdf")

# langchain 도큐먼트로 변환
docs = [doc.to_langchain_format() for doc in parsed_docs]

사용자 정의 인스트럭션 지정

# parsing instruction 을 지정합니다.
parsing_instruction = (
    "You are parsing a brief of AI Report. Please extract tables in markdown format."
)

# LlamaParse 설정
parser = LlamaParse(
    use_vendor_multimodal_model=True,
    vendor_multimodal_model_name="openai-gpt4o",
    vendor_multimodal_api_key=os.environ["OPENAI_API_KEY"],
    result_type="markdown",
    language="ko",
    parsing_instruction=parsing_instruction,
)

# parsing 된 결과
parsed_docs = parser.load_data(file_path="data/SPRI_AI_Brief_2023년12월호_F.pdf")

# langchain 도큐먼트로 변환
docs = [doc.to_langchain_format() for doc in parsed_docs]
  • markdown 형식으로 추출된 테이블 확인:
# Ⅱ. 주요 행사 일정

| 행사명 | 행사 주요 개요 |
| --- | --- |
| CES 2024 | - 미국 소비자기술 협회(CTA)가 주관하는 세계 최대 가전·IT·소비재 전시회로 5G, AR&VR, 디지털헬스, 교통·모빌리티 등 주요 카테고리 중심으로 기업들이 최신의 기술 제품들을 전시 - CTA 사피로 회장은 가장 주목받는 섹터로 AI를 꼽았으며, 모든 산업을 포함한다는 의미에서 '올 인AI on'을 주제로 한 이번 전시에는 500곳 이상의 한국기업 참가 예정 |

| 기간 | 2024.1.9~12 |
| 장소 | 미국, 라스베가스 |
| 홈페이지 | [https://www.ces.tech/](https://www.ces.tech/) |

| 행사명 | 행사 주요 개요 |
| --- | --- |
| AIMLA 2024 | - 머신러닝 및 응용에 관한 국제 컨퍼런스(AIMLA 2024)는 인공지능 및 머신러닝의 이론, 방법론 및 실용적 접근에 관한 지식과 최신 연구 결과 공유 - 이론 및 실무 측면에서 인공지능, 기계학습의 주요 분야를 논의하고, 함께, 산업계의 연구자와 실무자들에게 해당 분야의 최첨단 개발 소식 공유 |

| 기간 | 2024.1.27~28 |
| 장소 | 덴마크, 코펜하겐 |
| 홈페이지 | [https://ccnet2024.org/aimla/index](https://ccnet2024.org/aimla/index) |

| 행사명 | 행사 주요 개요 |
| --- | --- |
| AAAI Conference on Artificial Intelligence | - AI 발전 협회 컨퍼런스(AAAI)는 AI 연구를 촉진하고, AI 분야 연구원, 실무자, 과학자, 학술 및 공학자 간 교류의 기회 제공 - 컨퍼런스에서 AI 관련 기술 발표, 특별 트랙, 초청 연사, 워크숍, 튜토리얼, 포스터 세션, 주제 발표, 대회, 전시 프로그램 등 진행 |

| 기간 | 2024.2.20~27 |
| 장소 | 캐나다, 밴쿠버 |
| 홈페이지 | [https://aaai.org/aaai-conference/](https://aaai.org/aaai-conference/) |

profile
AI Engineer / 의료인공지능

0개의 댓글

관련 채용 정보