LangChain의 문서 로더(Document Loader)를 사용하면 다양한 형식의 데이터 파일을 문서로 로드할 수 있습니다.
Document 로드: 로드한 문서는 Document
객체로 표현되며, 이 객체의 page_content
에는 문서의 내용이, metadata
에는 메타데이터가 포함됩니다.
지원 형식: PDF, Word, CSV, Excel, JSON 등 여러 형식의 파일을 로드할 수 있는 문서 로더가 각각 존재합니다.
주요 메서드:
load()
: 파일을 동기적으로 로드합니다.aload()
: 파일을 비동기적으로 로드합니다.lazy_load()
: 메모리 사용량을 줄이기 위해 문서를 필요한 시점에 로드합니다.LangChain의 문서 로더를 통해 다양한 형식의 데이터를 손쉽게 다룰 수 있습니다. 각 파일 형식에 맞는 문서 로더를 선택해 활용하면, 데이터 처리 및 분석에 유용하게 사용할 수 있습니다.
Document
객체로 로드할 수 있다.Document
객체 -- LangChain의 기본 문서 객체이다.page_content
-- 문서의 실제 내용을 담고 있는 문자열이다.metadata
-- 문서와 관련된 메타데이터를 저장하는 딕셔너리이다.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
객체로 변환하는 역할을 한다.PyPDFLoader
, CSVLoader
, UnstructuredHTMLLoader
, JSONLoader
, TextLoader
, DirectoryLoader
등이 있다.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()
아래 표기된 숫자는 등수를 나타낸다. (The lower, the better)
PDFMiner | PDFPlumber | PyPDFium2 | PyMuPDF | PyPDF2 |
---|---|---|---|---|
Medical | 1 | 2 | 3 | 4 |
Law | 3 | 1 | 1 | 3 |
Finance | 1 | 2 | 2 | 4 |
Public | 1 | 1 | 1 | 4 |
Sum | 5 | 5 | 7 | 15 |
출처: AutoRAG Medium 블로그
# 설치
# !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])
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
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])
show_metadata(docs)
[metadata]
['source', 'page']
[examples]
source : https://arxiv.org/pdf/2103.15348.pdf
page : 0
# 설치
# !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])
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 :
UnstructuredPDFLoader
는 Unstructured와 통합되어 PDF 문서를 LangChain Document
객체로 파싱한다.# 설치
# !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])
show_metadata(docs)
[metadata]
['source']
[examples]
source : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
from langchain_community.document_loaders import PyPDFium2Loader
# PyPDFium2 로더 인스턴스 생성
loader = PyPDFium2Loader(FILE_PATH)
# 데이터 로드
docs = loader.load()
# 문서의 내용 출력
print(docs[10].page_content[:300])
show_metadata(docs)
[metadata]
['source', 'page']
[examples]
source : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
page : 0
from langchain_community.document_loaders import PDFMinerLoader
# PDFMiner 로더 인스턴스 생성
loader = PDFMinerLoader(FILE_PATH)
# 데이터 로드
docs = loader.load()
# 문서의 내용 출력
print(docs[0].page_content[:300])
show_metadata(docs)
[metadata]
['source']
[examples]
source : ./data/SPRI_AI_Brief_2023년12월호_F.pdf
BeautifulSoup
을 사용하여 파싱함으로써 글꼴 크기, 페이지 번호, PDF 헤더/푸터 등에 대한 보다 구조화된 정보를 얻을 수 있다. -- 이를 통해 텍스트를 의미론적으로 섹션으로 분할하는 데 도움이 될 수 있다.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))
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'}
from langchain_community.document_loaders import PyPDFDirectoryLoader
# 디렉토리 경로 설정
loader = PyPDFDirectoryLoader("data/")
# 문서 로드
docs = loader.load()
# 문서의 개수 출력
print(len(docs)) # 출력: 294
# 특정 문서의 내용 출력
print(docs[50].page_content[:300])
print(docs[50].metadata)
{'source': 'data/디지털 정부혁신 추진계획.pdf', 'page': 7}
from langchain_community.document_loaders import PDFPlumberLoader
# PDF 문서 로더 인스턴스 생성
loader = PDFPlumberLoader(FILE_PATH)
# 문서 로딩
docs = loader.load()
# 특정 문서의 내용 접근
print(docs[10].page_content[:300])
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
.hwp
를 사용하며, 기업, 학교, 정부 기관 등에서 널리 활용되고 있다. -- 대한민국 개발자라면 .hwp
문서를 처리해야 하는 경험을 해보았을 것이다. (혹은 해볼 예정이다)HWPLoader
를 사용해야 한다.# 설치
# !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년 발급) 등 데이터가 국민편익 향상에 제대로 활용
# 메타데이터 출력
print(docs[0].metadata)
{'source': './data/디지털 정부혁신 추진계획.hwp'}
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_args
에 대한 자세한 정보를 확인할 수 있다.# 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
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}
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])
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
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'}
.xlsx
및 .xls
파일 모두에서 작동하며, 페이지 내용은 Excel 파일의 원시 텍스트로 로드된다.text_as_html
키 아래에 Excel 파일의 HTML 표현이 제공된다.# 설치
# !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
page_content
에는 각 행의 데이터가 저장되고, metadata
의 text_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
# 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
read_excel()
기능을 사용하여 DataFrame으로 만든 뒤 로드할 수 있다.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'}
.docx
파일을 문서로 불러올 수 있다.# 설치
# !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
Document
로 로드된다.from langchain_community.document_loaders import UnstructuredWordDocumentLoader
# 비구조화된 워드 문서 로더 인스턴스화
loader = UnstructuredWordDocumentLoader("./data/sample-word-document.docx")
# 문서 로드
docs = loader.load()
print(len(docs)) # 출력: 1
# 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'}
mode="elements"
를 지정하여 쉽게 분리할 수 있다.# UnstructuredWordDocumentLoader
loader = UnstructuredWordDocumentLoader(
"./data/sample-word-document.docx", mode="elements"
)
# 데이터 로드
docs = loader.load()
# 로드한 문서의 개수 출력
print(len(docs)) # 출력: 125
# 첫번째 문서의 내용 출력
print(docs[0].page_content)
Semantic Search
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'}
# 패키지 설치
# !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
mode="elements"
를 지정함으로써 쉽게 요소들을 분리할 수 있다.# UnstructuredPowerPointLoader 생성
loader = UnstructuredPowerPointLoader("./data/sample-ppt.pptx", mode="elements")
# 데이터 로드
docs = loader.load()
# 로드한 문서의 개수 출력
print(len(docs)) # 출력: 17
# 첫번째 문서의 내용 출력
print(docs[0].page_content)
랭체인 한국어 튜토리얼
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'}
bs4
라이브러리를 사용하여 웹 페이지를 파싱하며, bs4.SoupStrainer
를 사용하여 파싱할 요소를 지정할 수 있다.bs4.SoupStrainer
의 추가적인 인수를 지정할 수 있다.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
"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년 가까이 스타트업 창업자를 릴레이 인터뷰 하면서 의미 있게 생각했던 것이 두 가지 있다. 첫째, 회사라는 단어보다 팀이라는 어휘를 주로 쓰고 있다는 점이었다. 그 표현의 유래나 의미 때문이라기보다는 팀이라는 말이 더 정겨워 뜻 깊게 생각된 듯하다. 이해관계보다 지향하는 뜻에 더 중점을 두고 하나의 마음으로 한 곳을 향해 달려가는 집단을 가리키는 표현이라는 생각에 더 정겨웠다.스타트업 대표들의 창업 동기는 대부분 ‘사회
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()
.txt
확장자를 가지는 파일을 로더로 로드하는 방법을 살펴보겠다.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
정의: 의미론적 검색은 사용자의 질의를 단순한 키워드 매칭을 넘어서 그 의미를 파악하여 관련된 결과를 반환하는 검색 방식입니다.
예시: 사용자가 "태양계 행성"이라고 검색하면, "목성", "화성" 등과 같이 관련된 행성에 대한 정보를 반환합니다.
연관키워드: 자연어 처리, 검색 알고리즘, 데이터 마이닝
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
정의: 의미론적 검색은 사용자의 질의를 단순한 키워드 매칭을 넘어서 그 의미를 파악하여 관련된 결과를 반환하는 검색 방식입니다.
예시: 사용자가 "태양계 행성"이라고 검색하면, "목성", "화성" 등과 같이 관련된 행성에 대한 정보를 반환합니다.
연관키워드: 자연어 처리, 검색 알고리즘, 데이터 마이닝
.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']}]
type(data[0])
dict
content
필드 아래의 값을 추출할 수 있다.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']")]
arXiv는 물리학, 수학, 컴퓨터 과학, 정량 생물학, 정량 금융, 통계, 전기공학 및 시스템 과학, 경제학 분야의 200만 편 이상의 학술 논문을 위한 오픈 액세스 아카이브이다.
Arxiv 문서 로더에 접근하려면 arxiv
, PyMuPDF
및 langchain-community
통합 패키지를 설치해야 한다.
arxiv.org
사이트에서 다운로드한 PDF 파일을 텍스트 형식으로 변환한다.# 패키지 설치
!pip install -qU langchain-community arxiv pymupdf
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', ...}
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. ...
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', ...})]
UpstageLayoutAnalysisLoader는 Upstage AI에서 제공하는 문서 분석 도구로, LangChain 프레임워크와 통합되어 사용할 수 있는 문서 로더이다.
PDF, 이미지 등 다양한 형식의 문서에서 레이아웃 분석 수행
문서의 구조적 요소(제목, 단락, 표, 이미지 등)를 자동으로 인식 및 추출
OCR 기능 지원 (선택적)
UpstageLayoutAnalysisLoader는 단순한 텍스트 추출을 넘어 문서의 구조를 이해하고 요소 간 관계를 파악하여 보다 정확한 문서 분석을 가능하게 한다.
pip install -U langchain-upstage
.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"]
: 헤더, 푸터 제외
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}
LlamaParser는 LlamaIndex에서 개발한 문서 파싱 서비스로, 대규모 언어 모델(LLM)을 위해 특별히 설계된 도구이다.
PDF, Word, PowerPoint, Excel 등 다양한 문서 형식 지원
자연어 지시를 통한 맞춤형 출력 형식 제공
복잡한 표와 이미지 추출 기능
JSON 모드 지원
외국어 지원
LlamaParser는 독립형 API로 제공되며, LlamaCloud 플랫폼의 일부로도 사용 가능하다.
.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)
# 랭체인 도큐먼트로 변환
docs = [doc.to_langchain_format() for doc in documents]
# metadata 출력
docs[0].metadata
주요 파라미터:
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]
# Ⅱ. 주요 행사 일정
| 행사명 | 행사 주요 개요 |
| --- | --- |
| 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/) |