LangChain으로 PDF 파일 처리하기

궁금하면 500원·2025년 2월 13일
0

AI 미생지능

목록 보기
44/68

PDF 파일은 법률, 금융, 연구 등 다양한 도메인에서 중요한 정보를 담고 있는 비구조화된 데이터 형식입니다. 하지만 PDF의 복잡한 구조와 긴 문서 길이는 데이터를 효율적으로 처리하고 검색하는 데 큰 도전 과제가 됩니다.

LangChain은 이러한 문제를 해결하기 위해 다양한 PDF 로더와 벡터 검색 기술을 제공하여 PDF 문서의 내용을 효율적으로 처리하고, 검색 및 질의응답 시스템을 구축할 수 있게 합니다.
이번 글에서는 LangChain을 활용해 PDF 파일을 처리하고, 문서 검색 및 내용 추출을 자동화하는 전략을 단계별로 알아보겠습니다.

1. PDF 로더 선택 및 텍스트 추출

LangChain은 다양한 PDF 로더를 제공합니다. 아래는 주요 로더와 사용 시나리오입니다.

로더설명사용 시나리오
PyPDFLoader가볍고 빠른 텍스트 추출에 적합단순 텍스트 추출이 필요한 경우
UnstructuredPDFLoader복잡한 레이아웃 문서 처리표, 이미지가 포함된 복잡한 문서
PDFPlumberLoader표와 같은 구조화 데이터 추출표 데이터 추출이 중요한 경우

PyPDFLoader 사용

from langchain_community.document_loaders import PyPDFLoader

# PDF 파일 로드
loader = PyPDFLoader("example.pdf")
documents = loader.load()
print(documents[0].page_content[:300])  # 첫 페이지 내용 출력

2. 텍스트 분할로 대용량 문서 처리

긴 문서를 효율적으로 다루기 위해 텍스트를 적당 단위로 분할합니다.

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
docs = text_splitter.split_documents(documents)

텍스트 분할 방식은 여러 옵션이 있습니다

분할 방식설명적합한 상황
PyPDFLoader가볍고 빠른 텍스트 추출에 적합단순 텍스트 추출이 필요한 경우
UnstructuredPDFLoader복잡한 레이아웃 문서 처리표, 이미지가 포함된 복잡한 문서
PDFPlumberLoader표와 같은 구조화 데이터 추출표 데이터 추출이 중요한 경우

3. 벡터 저장소 생성 및 검색 시스템 구축

PDF에서 추출한 텍스트를 벡터로 변환해 저장소에 저장하고, 유사도 기반 검색을 구현합니다.

from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

# 벡터 저장소 생성
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_type="mmr", search_kwargs={"k": 5})

벡터 저장소 옵션

벡터 저장소특징용도
FAISS빠른 인덱싱과 검색, 로컬 사용 가능로컬 환경, 빠른 검색 필요 시
Chroma경량 벡터 DB, 메타데이터 필터링 지원개발 환경, 프로토타입
Pinecone클라우드 기반, 대규모 데이터 처리프로덕션, 대용량 데이터

4. 검색 증강 생성(RAG) 파이프라인 구성

검색된 문서를 기반으로 GPT 모델이 답변을 생성하도록 체인을 구성합니다.

from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

template = """문서 내용 기반 답변:
{context}

질문: {question}
"""

prompt = ChatPromptTemplate.from_template(template)

# RAG 체인 구성
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | ChatOpenAI(model="gpt-4")
)

5. 성능 최적화 전략

캐싱 활용

동일한 요청에 대해 중복 계산을 방지하기 위해 캐싱 시스템을 도입합니다.

from langchain.cache import SQLiteCache
import langchain

langchain.llm_cache = SQLiteCache(database_path="./cache.db")

압축 검색

LLM 기반 압축기를 사용해 검색 성능을 개선합니다.

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

compressor = LLMChainExtractor.from_llm(ChatOpenAI())
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=retriever
)

6. 병렬 처리

여러 문서를 동시에 처리하여 속도를 높입니다.

from concurrent.futures import ThreadPoolExecutor

def process_documents(docs):
    with ThreadPoolExecutor() as executor:
        results = list(executor.map(lambda doc: retriever.retrieve(doc), docs))
    return results

실제 적용 하기

  • 법률 문서 분석: 계약서에서 특정 조항 검색 및 요약 제공
  • 연구 논문 요약: 다음 논문에서 주요 연구 비교 분석
  • 재무 보고서 처리: 투자자 추출 및 재무 지표 분석

마무리

LangChain은 PDF 파일의 복잡한 구조를 효과적으로 처리하고, 검색 및 질의응답 시스템을 손쉽게 구축할 수 있는 강력한 도구를 제공합니다.

특히, 다양한 PDF 로더와 벡터 저장소를 활용하면 대규모 문서에서도 높은 정확도로 정보를 검색할 수 있습니다. 법률, 금융, 연구 등 다양한 도메인에서 LangChain의 기능을 활용할 수 있습니다.

PDF 처리 최적화

문제해결 방법
표 추출 실패PDFPlumberLoader와 함께 테이블 추출 라이브러리 활용
이미지 포함 PDFUnstructuredPDFLoader와 OCR 라이브러리 결합
매우 큰 PDF분산 처리 시스템 구축 고려(Dask, Ray 등)
다국어 PDF언어 감지 후 적절한 임베딩 모델 선택

관련 참고 링크

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글