brunch

You can make anything
by writing

C.S.Lewis

by 최재철 Jun 08. 2024

RAG 시스템을 위한 주요 청킹 방법

큰 문서를 작은 부분으로 나누는 것은 RAG(Retrieval Augmented Generation) 시스템의 성능에 영향을 미치는 아주 중요한 요소입니다. RAG 시스템 개발을 위한 프레임워크는 일반적으로 선택할 수 있는 여러 옵션을 제공합니다. 이번 글에서는 주요 청킹 종류와 간단한 사용법과 차이점을 설명하도록 하겠습니다. 



RAG 시스템

검색 증강 생성(RAG) 시스템은 검색 기반 및 생성 기반 접근 방식을 결합하여 출력의 품질과 관련성을 향상시킵니다. RAG 시스템에 대한 자세한 것은 아래 링크 참고바랍니다. 


https://brunch.co.kr/@b2439ea8fc654b8/4 


LangChain

문서 분할에 대한 몇 가지 옵션을 널리 사용되는 Langchain 프레임워크를 통해서 보여드리겠습니다. 

LangChain은 주로 대규모 언어 모델(LLM) 적용에 초점을 맞추어 설계된 강력한 프레임워크입니다. 

여러가지 기능 중에 하나로 다양한 문서 분할 옵션을 제공합니다. 

이를 통해 사용자는 대용량 문서를 더 작고 관리 가능한 덩어리로 나눌 수 있습니다. 

다음은 LangChain의 문서 분할의 주요 기능과 예시입니다.


LangChain의 문서 분할 주요 기능


실험에 쓰일 텍스트는 위키디아에서 "동요" 라는 주제로 검색해서 찾은 웹사이트 입니다. 


import requests
from bs4 import BeautifulSoup

#  동요 - 위키피디아
url = 'https://ko.wikipedia.org/wiki/%EB%8F%99%EC%9A%94'
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    text = soup.get_text(separator='\n', strip=True)
else:
    text = ""
    print(f"Failed to retrieve the webpage. Status code: {response.status_code}")

  CharacterTextSplitter  

기능: 기본적인 문자 기반 텍스트 분할기.

설명: 주어진 텍스트를 문자 수를 기준으로 분할합니다.

from langchain.text_splitter import CharacterTextSplitter

splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=20)
chunks = splitter.split_text(text)
for chunk in chunks:
    print(chunk)


RecursiveCharacterTextSplitter  

기능: 문자 기반의 재귀적 텍스트 분할기.

설명: 텍스트를 일련의 규칙(주로 구두점)을 기반으로 더 큰 조각에서 더 작은 조각으로 재귀적으로 분할합니다. 이는 자연스러운 단락이나 문장 구분이 있는 문서에 특히 유용합니다. 일반적으로 가장 많이 사용합니다.

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
                    chunk_size=1000, chunk_overlap=20,
                    separators=["\n\n", "\n", " ", ""])
chunks = splitter.split_text(text)
print(chunks[0])


NltkSentenceTextSplitter  

기능: NLTK를 이용한 문장 기반 텍스트 분할기.

설명: NLTK의 문장 토크나이저를 사용하여 문장 단위로 텍스트를 분할합니다. NLTK 라이브러리가 필요합니다.

from langchain_text_splitters import NLTKTextSplitter

splitter = NLTKTextSplitter(chunk_size=1000, chunk_overlap=20)
chunks = splitter.split_text(text)
print(chunks[0])


마무리...

결론적으로, 다양한 Text Splitter를 사용하는 것은 텍스트 데이터를 처리하는 데 도움이 됩니다. 이를 통해 모델의 입력 제한을 효과적으로 관리하고, 정보 손실을 최소화하며, 여러 텍스트 구조와 사용 사례에 맞춤형 솔루션을 제공할 수 있습니다.




작가의 이전글 기본RAG에서 고급RAG까지
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari