728x90
[LLM] 텍스트 분할(TextSplit)
문서 분할은 RAG 시스템의 두 번째 단계로, 로드된 문서들을 효율적으로 처리하고 시스템이 정보를 보다 잘 활용할 수 있도록 준비하는 과정이다.
크고 복잡한 문서를 LLM이 받아들일 수 있는 효율적인 작은 규모의 조각으로 나누는 작업이다.
01. 문자 텍스트 분할(CharacterTextSplitter)
기본적으로 \n\n을 기준으로 문자 단위로 텍스트를 분할하고 청크의 크기를 문자 수로 측정한다.
텍스트 분할 방식 : 단일 문자 기준
청크 크기 측정 방식 : 문자 수 기준
CharacterTextSplitter를 사용하여 텍스트를 청크(chunk)로 분할할 수 있다.
# 패키지 설치
pip install -qU langchain-text-splitters
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
# 텍스트를 분할할 때 사용할 구분자를 지정
# separator=" ",
# 분할된 텍스트 청크의 최대 크기를 지정
chunk_size=250,
# 분할된 텍스트 청크 간의 중복되는 문자 수를 지정
chunk_overlap=50,
# 텍스트의 길이를 계산하는 함수를 지정
length_function=len,
# 구분자가 정규식인지 여부를 지정
is_separator_regex=False,
)
# text_splitter를 사용하여 state_of_the_union 텍스트를 문서로 분할
texts = text_splitter.create_documents([file])
print(texts[0]) # 분할된 문서 중 첫 번째 문서를 출력
02. 재귀적 문자 텍스트 분할(RecursiveCharacterTextSplitter)
해당 분할은 문자 목록을 매개변수로 받아 동작한다. 청크가 충분히 작아질 때까지 주어진 문자 목록의 순서대로 텍스트를 분할하려고 시도한다.
단락 → 문장 → 단어 순서로 재귀적으로 분할한다.
# 패키지 설치
pip install -qU langchain-text-splitters
with open("./data/sample.txt") as f:
file = f.read()
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
# 청크 크기를 매우 작게 설정합니다. 예시를 위한 설정
chunk_size=250,
# 청크 간의 중복되는 문자 수를 설정
chunk_overlap=50,
# 문자열 길이를 계산하는 함수를 지정
length_function=len,
# 구분자로 정규식을 사용할지 여부를 설정
is_separator_regex=False,
)
# text_splitter를 사용하여 file 텍스트를 문서로 분할
texts = text_splitter.create_documents([file])
print(texts[0]) # 분할된 문서의 첫 번째 문서를 출력
print("===" * 20)
print(texts[1]) # 분할된 문서의 두 번째 문서를 출력
03. 토큰 텍스트 분할(TokenTextSplitter)
언어 모델에는 토큰 제한이 있으며, 토큰 제한을 초과하지 않아야한다.
TokenTextSplitter를 사용하면 토큰 수를 기반으로 청크를 생성할 수 있다.
# 패키지 설치
pip install --upgrade --quiet langchain-text-splitters tiktoken
with open("./data/sample.txt") as f:
file = f.read()
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
# 청크 크기를 300으로 설정
chunk_size=300,
# 청크 간 중복되는 부분이 없도록 설정
chunk_overlap=0,
)
# file 텍스트를 청크 단위로 분할
texts = text_splitter.split_text(file)
print(texts[0])
04. 시멘틱 청커(SemanticChunker)
텍스트를 의미론적 유사성에 기반하여 분할한다.
# 패키지 설치
pip install -qU langchain_experimental langchain_openai
with open("./data/sample.txt") as f:
file = f.read()
from langchain_experimental.text_splitter import SemanticChunker
chunks = text_splitter.split_text(file)
print(chunks[0])
05. 코드 분할(CodeTextSplitter)
CodeTextSplitter를 사용하면 다양한 프로그래밍 언어로 작성된 코드를 분할할 수 있다.
# 패키지 설치
pip install -qU langchain-text-splitters
from langchain_text_splitters import (
Language,
RecursiveCharacterTextSplitter,
)
python_splitter = RecursiveCharacterTextSplitter.from_language(
language=Language.PYTHON, chunk_size=50, chunk_overlap=0
)
# document 생성
python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs
출처
반응형
'🤖 AI > LLM' 카테고리의 다른 글
[LLM] 도큐먼트 로더(Document Loader) (0) | 2024.07.15 |
---|---|
[LLM] RAG (Retrieval-Augmented Generation) (0) | 2024.07.03 |
[LLM] 올라마 모델에 랭체인 적용하기 (0) | 2024.06.27 |
[LLM] 랭체인(LangChain) (0) | 2024.06.24 |
[LLM] 올라마(Ollama) (0) | 2024.06.21 |