텍스트 분할, 임베딩 및 벡터 저장

LangChain을 활용한 RAG(검색 증강 생성)

Meri Nova

Machine Learning Engineer

검색을 위한 데이터 준비

문서가 로드되는 모습.

LangChain을 활용한 RAG(검색 증강 생성)

검색을 위한 데이터 준비

문서가 분할되는 모습.

LangChain을 활용한 RAG(검색 증강 생성)

검색을 위한 데이터 준비

문서 청크가 임베딩되는 모습.

LangChain을 활용한 RAG(검색 증강 생성)

검색을 위한 데이터 준비

문서 청크가 저장되는 모습.

LangChain을 활용한 RAG(검색 증강 생성)

검색을 위한 데이터 준비

RAG 개발 워크플로우에서 분할 단계가 강조 표시된 모습.

LangChain을 활용한 RAG(검색 증강 생성)

chunk_size

이상적인 청크 크기는 중간 어딘가에 있음을 보여주는 화살표. 큰 청크는 느린 검색과 해석의 어려움이 있고, 작은 청크는 충분한 문맥을 포함하지 못할 수 있음.

chunk_overlap

  • 경계 너머의 정보 포함

두 청크가 겹치는 영역이 강조 표시된 모습.

LangChain을 활용한 RAG(검색 증강 생성)

CharacterTextSplitter

from langchain_text_splitters import CharacterTextSplitter

text = """Machine learning is a fascinating field.\n\nIt involves algorithms and models that can learn from data. These models can then make predictions or decisions without being explicitly programmed to perform the task.\nThis capability is increasingly valuable in various industries, from finance to healthcare.\n\nThere are many types of machine learning, including supervised, unsupervised, and reinforcement learning.\nEach type has its own strengths and applications."""
text_splitter = CharacterTextSplitter( separator="\n\n", chunk_size=100, chunk_overlap=10 )
LangChain을 활용한 RAG(검색 증강 생성)

CharacterTextSplitter

chunks = text_splitter.split_text(text)

print(chunks) print([len(chunk) for chunk in chunks])
['Machine learning is a fascinating field.',
 'It involves algorithms and models that can learn from data. These models can...',
 'There are many types of machine learning, including supervised, unsupervised...']

[40, 260, 155]
  • 청크에 문맥이 부족할 수 있음
  • 청크가 chunk_size보다 클 수 있음
LangChain을 활용한 RAG(검색 증강 생성)

RecursiveCharacterTextSplitter

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(

separators=["\n\n", "\n", " ", ""],
chunk_size=100, chunk_overlap=10
)
LangChain을 활용한 RAG(검색 증강 생성)

RecursiveCharacterTextSplitter

chunks = splitter.split_text(text)

print(chunks)
print([len(chunk) for chunk in chunks])
['Machine learning is a fascinating field.',
 'It involves algorithms and models that can learn from data. These models ...',
 'or decisions without being explicitly programmed to perform the task.',
 'This capability is increasingly valuable in various industries, from ...',
 'There are many types of machine learning, including supervised, ...',
 'learning.',
 'Each type has its own strengths and applications.']
[40, 98, 69, 91, 95, 9, 49]
LangChain을 활용한 RAG(검색 증강 생성)

문서 분할

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("research_paper.pdf")
documents = loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)

chunks = splitter.split_documents(documents)
LangChain을 활용한 RAG(검색 증강 생성)

문서 분할

print(chunks)

print([len(chunk.page_content) for chunk in chunks])
[Document(metadata={'source': 'Rag Paper.pdf', 'page': 0}, page_content='...'),
 Document(metadata={'source': 'Rag Paper.pdf', 'page': 0}, page_content='...'),
 Document(metadata={'source': 'Rag Paper.pdf', 'page': 0}, page_content='...')]

[928, 946, 921,...]
LangChain을 활용한 RAG(검색 증강 생성)

임베딩 및 저장

임베딩 및 저장 단계가 강조 표시된 모습.

LangChain을 활용한 RAG(검색 증강 생성)

임베딩이란?

문장이 임베딩 모델에 입력되는 모습.

LangChain을 활용한 RAG(검색 증강 생성)

임베딩이란?

임베딩 모델이 텍스트를 수치 벡터로 변환하는 모습.

LangChain을 활용한 RAG(검색 증강 생성)

임베딩이란?

what_are_embeddings3.jpg

LangChain을 활용한 RAG(검색 증강 생성)

임베딩이란?

what_are_embeddings4.jpg

LangChain을 활용한 RAG(검색 증강 생성)

청크 임베딩 및 저장

  • 임베딩 및 저장: OpenAIChromaDB 사용
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

embedding_model = OpenAIEmbeddings(
    api_key=openai_api_key,
    model="text-embedding-3-small"
)


vector_store = Chroma.from_documents( documents=chunks, embedding=embedding_model )
LangChain을 활용한 RAG(검색 증강 생성)

연습해 봅시다!

LangChain을 활용한 RAG(검색 증강 생성)

Preparing Video For Download...