고급 분할 방법

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

Meri Nova

Machine Learning Engineer

현재 분할 전략의 한계

 

  1. 🤦 분할이 단순함 (문맥 미고려)

    • 주변 텍스트의 문맥 무시
  2. 🖇 문자 기반 vs. 토큰 기반 분할

    • 토큰은 모델이 처리하는 단위
    • 컨텍스트 윈도우 초과 위험

 

SemanticChunker

 

TokenTextSplitter

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

토큰 기반 분할

문자 텍스트 분할기가 문자 수를 기준으로 텍스트를 청크로 분할하는 모습.

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

토큰 기반 분할

토큰 텍스트 분할기가 토큰 수를 기준으로 텍스트를 청크로 분할하는 모습.

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

토큰 기반 분할

토큰이 강조 표시되어 chunk_size 및 chunk_overlap 값과의 대응 관계를 보여주는 모습.

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

토큰 기반 분할

import tiktoken
from langchain_text_splitters import TokenTextSplitter
example_string = "Mary had a little lamb, it's fleece was white as snow."

encoding = tiktoken.encoding_for_model('gpt-4o-mini')
splitter = TokenTextSplitter(encoding_name=encoding.name,
                             chunk_size=10,
                             chunk_overlap=2)

chunks = splitter.split_text(example_string) for i, chunk in enumerate(chunks): print(f"Chunk {i+1}:\n{chunk}\n")
LangChain을 활용한 RAG(검색 증강 생성)

토큰 기반 분할

Chunk 1:
Mary had a little lamb, it's fleece

Chunk 2:
 fleece was white as snow.
LangChain을 활용한 RAG(검색 증강 생성)

토큰 기반 분할

for i, chunk in enumerate(chunks):
    print(f"Chunk {i+1}:\nNo. tokens: {len(encoding.encode(chunk))}\n{chunk}\n")
Chunk 1:
No. tokens: 10
Mary had a little lamb, it's fleece was

Chunk 2:
No. tokens: 6
 fleece was white as snow.
LangChain을 활용한 RAG(검색 증강 생성)

의미 기반 분할

RAG 애플리케이션에 관한 문장과 개에 관한 문장이 포함된 단락.

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

의미 기반 분할

문자 또는 토큰 기반으로 단락이 분할되어 문맥이 손실된 모습.

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

의미 기반 분할

의미 기반 분할기가 주제가 RAG에서 개로 바뀌는 지점에서 단락을 분할한 모습.

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

의미 기반 분할

from langchain_openai import OpenAIEmbeddings
from langchain_experimental.text_splitter import SemanticChunker

embeddings = OpenAIEmbeddings(api_key="...", model='text-embedding-3-small')
semantic_splitter = SemanticChunker( embeddings=embeddings,
breakpoint_threshold_type="gradient", breakpoint_threshold_amount=0.8
)
1 https://api.python.langchain.com/en/latest/text_splitter/langchain_experimental.text_splitter. SemanticChunker.html
LangChain을 활용한 RAG(검색 증강 생성)

의미 기반 분할

chunks = semantic_splitter.split_documents(data)
print(chunks[0])
page_content='Retrieval-Augmented Generation for\nKnowledge-Intensive NLP Tasks\ Patrick Lewis,
Ethan Perez,\nAleksandra Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich
Küttler,\nMike Lewis, Wen-tau Yih, Tim Rocktäschel, Sebastian Riedel, Douwe Kiela\nFacebook AI
Research; University College London;New York University;\[email protected]\nAbstract\nLarge
pre-trained language models have been shown to store factual knowledge\nin their parameters,
and achieve state-of-the-art results when fine-tuned on down-\nstream NLP tasks. However, their
ability to access and precisely manipulate knowl-\nedge is still limited, and hence on
knowledge-intensive tasks, their performance\nlags behind task-specific architectures.'
metadata={'source': 'rag_paper.pdf', 'page': 0}
LangChain을 활용한 RAG(검색 증강 생성)

연습해 봅시다!

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

Preparing Video For Download...