-
LangChain + RAG 기반 문서 Q&A 챗봇 시리즈 4화 - 문서 처리의 시작(문서를 불러오고, 쪼개고, 벡터로 바꾸기)기술과 산업/AI 2025. 5. 26. 10:51728x90
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 size와 chunk 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'기술과 산업 > AI' 카테고리의 다른 글
TaskMaster AI 실전 활용 예시 – 개발자의 일과를 바꾸는 AI 기반 프로젝트 운영법 (0) 2025.05.26 Gradio 실전 시리즈 9화 – Hugging Face Spaces로 Gradio 앱 배포하기 (0) 2025.05.26 AI/ML 기반 데이터 분석 시리즈 10화 - 하이퍼파라미터 튜닝 전략과 실전 최적화 기법 (2) 2025.05.23 LLM 학습 시리즈 3화 – 인간다운 AI를 만드는 마지막 퍼즐: RLHF 완전 이해 (1) 2025.05.23 LLM 학습 시리즈 2화 – LLM을 똑똑하게 만드는 법: 감독학습(SFT)과 그 한계 (0) 2025.05.23