ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LangChain + RAG 기반 문서 Q&A 챗봇 시리즈 4화 - 문서 처리의 시작(문서를 불러오고, 쪼개고, 벡터로 바꾸기)
    기술과 산업/AI 2025. 5. 26. 10:51
    728x90

    LangChain 기반 RAG 시스템에서 가장 중요한 전처리 단계는 문서를 불러오고, 의미 단위로 분할한 뒤 임베딩하는 과정입니다. 다양한 로더와 스플리터, 임베딩 전략을 소개합니다.

     

    RAG 구조를 이해했다면, 이제 실질적인 구현에 들어갈 차례입니다.
    그 첫 단계는 바로 문서를 시스템이 이해할 수 있는 형태로 바꾸는 일입니다.
    즉, 문서를 불러오고 → 잘게 쪼개고 → 의미 기반 벡터로 바꾸는 과정입니다.

    이 단계가 얼마나 정교하게 구성되느냐에 따라
    이후 검색 정확도와 응답 품질이 크게 달라집니다.
    따라서 이 글에서는 문서 처리의 핵심 구성 요소 3가지를 다룹니다.


    1. 문서 불러오기 – 다양한 Loader를 활용하자

    LangChain은 다양한 문서 유형을 불러올 수 있는 Loader를 지원합니다.
    아래는 실무에서 자주 사용되는 로더들입니다:

    • PyPDFLoader → PDF 문서
    • TextLoader → 일반 텍스트 파일
    • CSVLoader → 엑셀, CSV 파일
    • UnstructuredFileLoader → 구조 없는 문서 전반
    • DirectoryLoader → 폴더 단위의 문서 일괄 로딩
    • RecursiveUrlLoader → 웹페이지 크롤링
    • WikipediaLoader → 위키 문서 API 기반 불러오기

    예시 코드 (PDF 불러오기):

    from langchain.document_loaders import PyPDFLoader
    
    loader = PyPDFLoader("contract_2023.pdf")
    documents = loader.load()
    

    로더는 문서 내용을 LangChain 내부에서 처리할 수 있는 텍스트 조각 리스트로 반환합니다.
    다만, 문서가 너무 길거나 구성된 섹션이 복잡하다면, 다음 단계인 분할(Splitting) 작업이 매우 중요해집니다.


    2. 텍스트 분할 – ‘생각 단위’로 쪼개기

    하나의 문서를 통째로 GPT에게 넘길 수는 없습니다.
    그래서 문서를 적절한 크기와 의미 단위로 나누는 작업이 필요합니다.
    이를 위해 사용하는 것이 Splitter입니다.

    LangChain이 지원하는 주요 스플리터는 다음과 같습니다:

    • CharacterTextSplitter: 고정 길이 기준 단순 분할
    • RecursiveCharacterTextSplitter: 문단, 문장, 단어 등 자연스러운 기준 우선
    • SemanticChunker: 의미 기반 분할 (sentence-transformers 기반)

    예시 코드:

    from langchain.text_splitter import RecursiveCharacterTextSplitter
    
    splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
    chunks = splitter.split_documents(documents)
    

    이 과정에서 설정하는 chunk sizechunk overlap 값이 매우 중요합니다.
    예를 들어 계약서처럼 문맥이 긴 문서는 overlap을 높이고,
    짧은 FAQ는 chunk size를 줄이는 식으로 조정해야 검색 품질이 높아집니다.


    3. 임베딩 – 텍스트를 ‘의미의 좌표’로 바꾸기

    텍스트 분할이 끝나면, 이제 각 조각을 벡터화해야 합니다.
    즉, 텍스트를 컴퓨터가 유사도를 판단할 수 있는 수치로 변환하는 작업입니다.
    이때 사용하는 것이 Embedding 모델입니다.

    LangChain은 다양한 임베딩 모델을 지원합니다:

    • OpenAIEmbeddings: GPT의 벡터 표현 (API 기반, 성능 우수)
    • HuggingFaceEmbeddings: 공개 모델 기반 로컬 실행 가능
    • CohereEmbeddings, GooglePalmEmbeddings 등도 가능

    예시 코드 (OpenAI 사용):

    from langchain.embeddings import OpenAIEmbeddings
    
    embedding_model = OpenAIEmbeddings()
    vectorstore = FAISS.from_documents(chunks, embedding_model)
    

    여기서 나온 결과는 벡터 데이터베이스에 저장됩니다.
    이후 사용자가 질문하면, 해당 질문도 벡터로 변환되어
    이 저장된 조각들과 유사도 기반 검색을 수행하게 됩니다.


    정리하며 – 데이터 준비가 절반이다

    문서를 Q&A 챗봇으로 전환하려면 GPT만 잘 쓰는 것보다,
    문서를 잘 쪼개고 잘 벡터화하는 능력이 훨씬 중요합니다.
    좋은 데이터 전처리는 검색 정확도와 답변 신뢰도를 직접 좌우합니다.

    지금까지 문서 로딩 → 분할 → 임베딩이라는
    RAG 시스템의 핵심 전처리 파이프라인을 살펴봤습니다.

    다음 글에서는 이 데이터를 저장하고 검색하는 벡터 데이터베이스(Vector DB) 구조를 소개하겠습니다.

    728x90
Designed by Tistory.