🤖 AI/LLM

[LLM] 텍스트 분할(TextSplit)

heywantodo 2024. 7. 17. 10:21
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

 

출처

https://wikidocs.net/book/14314

728x90
반응형