문서 불러오기, 분할, 임베딩
PyPDFLoader, RecursiveCharacterTextSplitter, OpenAIEmbeddings, 임베딩 전략을 다룹니다.
문서 불러오기, 분할, 임베딩은(는) CoddyKit의 무료 Learn AI with Python 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn AI with Python 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
RAG 데이터 수집 과정
LLM이 문서에서 답변하려면 먼저 문서를 load하고, 분할하고, 임베딩해야 합니다. 이 수업에서는 모든 검색 증강 생성 시스템의 기반인 데이터 수집 과정을 다룹니다.
pip install langchain-community pypdf langchain-openaiPDF 불러오기
PyPDFLoader는 PDF를 읽고 페이지마다 하나씩 생성된 문서 객체 목록을 반환합니다. 각 문서에는 page_content(텍스트)와 metadata(출처 및 페이지 번호)가 있습니다.
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("handbook.pdf")
docs = loader.load()
print(len(docs), "pages")문서를 나누는 이유
전체 페이지는 임베딩하거나 프롬프트에 넣기에는 너무 큰 경우가 많습니다. 분할하면 텍스트가 더 작은 청크로 나뉘어 안정적으로 임베딩되고, 검색 시 전체 페이지가 아니라 관련 구절만 반환할 수 있습니다.
RecursiveCharacterTextSplitter
권장되는 분할기는 RecursiveCharacterTextSplitter입니다. 먼저 문단 단위로 나누고, 그다음 문장, 단어 순으로 나누면서 단어 중간에서 끊지 않고 청크의 의미적 일관성을 유지하려고 합니다.
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)청크 크기와 청크 중첩
chunk_size는 청크 하나에 포함되는 최대 문자 수를 정하고, chunk_overlap은 인접한 청크 사이에 일부 텍스트를 반복해 경계에서 컨텍스트가 사라지지 않도록 합니다. 1000/200 설정은 흔히 사용하는 시작점입니다.
chunks = splitter.split_documents(docs)
print(len(chunks), "chunks")
print(chunks[0].page_content[:120])청크 크기 조정
작은 청크는 정확한 검색을 제공하지만 주변 컨텍스트를 놓칠 수 있습니다. 큰 청크는 컨텍스트를 유지하지만 관련성이 희석되고 토큰 비용이 더 많이 듭니다. 경계를 연결하려면 청크 크기의 10~20%를 중첩하는 것이 좋은 기본값입니다.
임베딩이란 무엇인가요?
임베딩은 텍스트를 의미를 담은 고정 길이 숫자 벡터로 변환합니다. 서로 비슷한 텍스트는 서로 가까운 벡터가 됩니다. 이를 통해 키워드가 아니라 의미적 유사도로 검색할 수 있습니다.
OpenAIEmbeddings
OpenAIEmbeddings로 임베딩을 생성합니다. text-embedding-3-small 모델은 저렴하면서도 효과적입니다. embed_query는 문자열 하나를 임베딩하고, embed_documents는 목록을 임베딩합니다.
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector = embeddings.embed_query("How do I reset my password?")
print(len(vector)) # 1536배치 임베딩하기
모든 청크를 한 번에 임베딩합니다. 각 청크는 나중에 빠른 유사도 검색을 위해 벡터 데이터베이스에 저장할 벡터가 됩니다.
texts = [c.page_content for c in chunks]
vectors = embeddings.embed_documents(texts)
print(len(vectors), "vectors of dim", len(vectors[0]))임베딩 비용 추정
임베딩 비용은 토큰 단위로 청구됩니다. 모든 청크의 전체 토큰 수를 추정한 다음 1,000토큰당 가격을 곱합니다. 임베딩 전에 토큰을 계산하면 대규모 문서 모음에서 예상치 못한 비용이 발생하는 일을 막을 수 있습니다.
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
total = sum(len(enc.encode(c.page_content)) for c in chunks)
price_per_1k = 0.00002
print("tokens:", total, "cost $:", total / 1000 * price_per_1k)처리 과정 요약
데이터 수집 흐름은 다음과 같습니다. 문서를 load하고, 겹치는 청크로 분할하고, 각 청크를 벡터로 임베딩한 다음, 다음 수업에서 이를 저장합니다. 여기서 결정한 청크 분할 방식과 비용에 대한 고려가 전체 RAG 시스템의 품질과 비용을 좌우합니다.
빠른 확인
데이터 수집에 대한 이해도를 확인해 보세요.
복습: 불러오기, 분할, 임베딩
PyPDFLoader로 문서를 load하고, chunk_size와 chunk_overlap을 지정한 RecursiveCharacterTextSplitter로 문서를 청크로 나누었으며, OpenAIEmbeddings로 청크를 벡터로 변환했습니다. 또한 대규모 문서 모음을 처리하기 전에 토큰당 임베딩 비용을 추정하는 방법을 배웠습니다.
자주 묻는 질문
“문서 불러오기, 분할, 임베딩” 강의는 무료인가요?
네 — “문서 불러오기, 분할, 임베딩” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn AI with Python 강의 전체를 잠금 해제할 수 있습니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
“문서 불러오기, 분할, 임베딩”에서 뭘 배우나요?
PyPDFLoader, RecursiveCharacterTextSplitter, OpenAIEmbeddings, 임베딩 전략을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 Learn AI with Python을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn AI with Python을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn AI with Python은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“문서 불러오기, 분할, 임베딩” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn AI with Python 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn AI with Python 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.