Study/AI

[LangChain] Splitter를 사용해 자료 나누기

hongeeii 2025. 8. 18.
728x90
반응형
  • CharacterTextSplitter
  • RecursiveCharacterTextSplitter
  • SemanticChunker

잘게 나누기(splitter)

긴 문서를 chat gpt 에게 전달하면 발생할 수 있는 문제

  • 토큰 사용량이 많아서 비용문제가 발생할 수 있음
  • 너무 많은 내용 때문에 필요한 내용을 선택하지 못 할 수도 있음

그래서 문서를 chunk(문서를 작은 조각으로 나눈 단위)로 나눔

chunk size 에 따라 chunk의 개수가 결정됨

chunk 로 나눴을 때 나타날 수 있는 문제

  • 필요한 문장이 잘리거나 중간에 끊어질 수 있음

이런 문제 때문에 chunk의 일부분을 겹쳐서 만들 수도 있음

chunk size 에 의한 chunk 시각화 사이트

CharacterTextSplitter

우선 Document 객체 만들기

from langchain_community.document_loaders import WikipediaLoader

loader = WikipediaLoader(query='지진', lang='ko', load_max_docs=1, doc_content_chars_max=40000)
docs = loader.load()
 

CharacterTextSplitter 을 통해 문서를 chunk 로 나누기

from langchain_text_splitters import CharacterTextSplitter

text_splitter = CharacterTextSplitter(
  separator="\n\n",
  chunk_size=100,
  chunk_overlap=20,
  length_function=len,
  is_separator_regex=False
)

texts = text_splitter.split_documents(docs)
 
  • separator - chunk 로 나눌 구분자
  • chunk_size - chunk의 크기
  • chunk_overlap - chunk 끼리 겹칠 크기
  • length_function - 길이를 구할 함수
  • is_separator_regex - 구분자가 정규식인지 아닌지

chunk_size 는 자동 완성 안되던데 어디서 인수를 받는 거지?

 

상속 받은 부모 클래스(TextSplitter)에서 받는거였음

separator 로 나눴을 때 chunk_size 보다 크면 경고문이 뜸

len(texts)
 
89
 
for text in texts[:5]:
  print(f"Chunk Size: {len(text.page_content)}, Page Content: {text.page_content[:100]}")
  print('-' * 70)
 
Chunk Size: 689, Page Content: 지진(地震, 영어: earthquake, quake, tremor, temblor)은 지구 암석권 내부에서 갑작스럽게 에너지를 방출하면서 지진파를 만들어내며 지구 표면까지 흔들리는
----------------------------------------------------------------------
Chunk Size: 546, Page Content: == 어원 ==
영어에서 'earthquake'는 13세기 'eorthequakynge'라는 중세 영어 단어에서 유래한 말로, "땅에서 일어난 흔들림"이라는 'quavinge of
----------------------------------------------------------------------
Chunk Size: 732, Page Content: == 특성 ==
지질구조학적 지진은 단층면을 따라 파괴가 전파될 수 있을 정도로 충분한 탄성 변형 에너지가 축적된 지구 어디서나 발생할 수 있다. 단층면은 단층면 표면에 마찰 저항
----------------------------------------------------------------------
Chunk Size: 14, Page Content: === 진원과 진앙 ===
----------------------------------------------------------------------
Chunk Size: 329, Page Content: 지진은 지구 내부의 에너지가 축적되어 암석의 파열이 일어나는 한계를 넘어설 때 일어나는데, 암반이 파열되는 전체 영역을 진원역이라 한다. 규모 M8을 넘는 거대지진의 경우 진원역의
----------------------------------------------------------------------
 

RecursiveCharacterTextSplitter

CharacterTextSplitter 를 사용하면 separator 를 통해 나누지만 chunk size 가 전부 다른 문제가 있었음

RecursiveCharacterTextSplitter 를 사용하면 어느정도 해결됨

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
  separators=["\n\n", "\n", ' ', ''],
  chunk_size=100,
  chunk_overlap=20,
  length_function=len,
  is_separator_regex=False
)

texts = text_splitter.split_documents(docs)
 
  • separators - list 형태로 separator 를 여러 개 넘기고
    chunk가 chunk size 보다 크면 다음 separator로 나눔
len(texts)
 
531
 
for text in texts[:10]:
  print(f"Chunk Size: {len(text.page_content)}, Page Content: {text.page_content[:100]}")
  print('-' * 70)
 
Chunk Size: 100, Page Content: 지진(地震, 영어: earthquake, quake, tremor, temblor)은 지구 암석권 내부에서 갑작스럽게 에너지를 방출하면서 지진파를 만들어내며 지구 표면까지 흔들리는
----------------------------------------------------------------------
Chunk Size: 98, Page Content: 만들어내며 지구 표면까지 흔들리는 현상이다. 지진은 느낄 수 없을 정도로 약한 크기서부터 사람과 여러 물건을 공중으로 들어올리고 도시 전체를 파괴할 수 있을 정도로 매우 격렬한
----------------------------------------------------------------------
Chunk Size: 96, Page Content: 파괴할 수 있을 정도로 매우 격렬한 크기의 지진까지 다양한 강도로 일어난다. 특정 지역의 지진 활동(seismic activity)이란 특정 기간 그 지역에서 발생한 지진의
----------------------------------------------------------------------
Chunk Size: 95, Page Content: 기간 그 지역에서 발생한 지진의 빈도, 유형, 크기를 말한다. 지진에는 지표면의 진동 외에도 정상 미끄러짐이나 슬로우 슬립 같은 비진동성 암반의 미끄러짐 현상도 포함된다.
----------------------------------------------------------------------
Chunk Size: 98, Page Content: 지진은 지구 표면의 땅을 흔들고 암반의 위치를 옮기거나 변성시켜 휘어지게 만든다. 큰 지진의 진앙이 바다 해역 상에 있다면 해저 지형의 변화로 쓰나미가 일어날 수도 있다. 또한
----------------------------------------------------------------------
Chunk Size: 76, Page Content: 쓰나미가 일어날 수도 있다. 또한 지진으로 산사태나 액상화 현상 같은 2차 피해가 일어날 수 있으며, 일부 지진은 화산 활동을 일으킨다.
----------------------------------------------------------------------
Chunk Size: 99, Page Content: '지진'이라는 용어는 지진파를 일으키는 자연적, 인공적인 지진학적 현상을 통틀어 일컫는다. 대부분의 지진은 단층파열로 일어나며 그 외에도 화산 활동, 산사태, 지뢰 폭발, 핵실험
----------------------------------------------------------------------
Chunk Size: 96, Page Content: 활동, 산사태, 지뢰 폭발, 핵실험 등 여러 자연적, 인공적 원인으로도 발생한다. 지진이 일어날 때 처음으로 단층이 파열되어 흔들림이 시작된 지점을 진원이라고 하고, 진원의
----------------------------------------------------------------------
Chunk Size: 37, Page Content: 지점을 진원이라고 하고, 진원의 지표면상 지점을 진앙이라고 부른다.
----------------------------------------------------------------------
Chunk Size: 8, Page Content: == 어원 ==
----------------------------------------------------------------------
 

SemanticChunker

일반 구분자를 통해 나누는 것보다 문맥의 의미에 따라 나누고 싶을 때 사용

아직 실험적인 기능이라 추가적인 패키지가 필요함

!pip install langchain_experimental==0.3.4
 
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings

text_splitter = SemanticChunker(OpenAIEmbeddings())
texts = text_splitter.split_documents(docs)
len(texts)
 
26
 
for text in texts[:10]:
  print(f"Chunk Size: {len(text.page_content)}, Page Content: {text.page_content[:100]}")
  print('-' * 70)
 
Chunk Size: 335, Page Content: 지진(地震, 영어: earthquake, quake, tremor, temblor)은 지구 암석권 내부에서 갑작스럽게 에너지를 방출하면서 지진파를 만들어내며 지구 표면까지 흔들리는
----------------------------------------------------------------------
Chunk Size: 982, Page Content: 지진은 지구 표면의 땅을 흔들고 암반의 위치를 옮기거나 변성시켜 휘어지게 만든다. 큰 지진의 진앙이 바다 해역 상에 있다면 해저 지형의 변화로 쓰나미가 일어날 수도 있다. 또한 지
----------------------------------------------------------------------
Chunk Size: 1716, Page Content: 단층면은 단층면 표면에 마찰 저항을 늘리는 불규칙한 표면 혹은 애스패리티(돌기) 구조가 없을 때만 부드럽고 지진 없이 움직인다. 대부분의 단층면은 울퉁불퉁하고 이 때문에 단층은 스
----------------------------------------------------------------------
Chunk Size: 50, Page Content: === 지진 발생 빈도 ===

전 세계에 한해 약 50만 건의 지진이 지진계에 관측된다.
----------------------------------------------------------------------
Chunk Size: 779, Page Content: 이 중 인간이 흔들림을 느낄 수 있는 지진은 약 10만 건이다. 소규모 지진이 주로 발생하는 지역은 엘살바도르, 멕시코, 과테말라, 칠레, 페루, 인도네시아, 필리핀, 이란, 파키
----------------------------------------------------------------------
Chunk Size: 3698, Page Content: 지진의 규모와 그 발생 빈도에 대한 자세한 통계는 미국 지질조사국에서 확인할 수 있다. 대지진의 수가 해마다 올라갔다거나 내려갔다는 변동에 대한 지적도 있는데, 이는 격렬한 지각
----------------------------------------------------------------------
Chunk Size: 306, Page Content: 그 후, 사상한형으로 초동이 분포하는 지진은 수없이 발견되어, 한때는 단층지진설(單層地震說)이 유행하였다. 이에 대하여 1934년 이시모토 미시오(石本已四雄)는 마그마 관입설(ma
----------------------------------------------------------------------
Chunk Size: 1283, Page Content: 위와 같이 지진의 원인으로서는 단층지진설과 마그마 관입설이 있으나, 양쪽 다 하나의 가설만으로는 완전히 설명할 수 없다. === 단층 ===

판 경계간 지진을 일으키는 단층은 크
----------------------------------------------------------------------
Chunk Size: 312, Page Content: 이런 경우의 예로 1957년 알래스카 지진, 1960년 칠레 지진, 2004년 수마트라 지진이 있으며 이들 모두 섭입대에서 일어난 지진이다. 주향이동단층에서 일어난 가장 큰 지진으
----------------------------------------------------------------------
Chunk Size: 1928, Page Content: 수렴 경계를 따라 섭입하는 단층면의 경사각은 매우 작으며 일반적으로 약 10도이다. 따라서 지구의 가장 부서지기 쉬운 지각면의 폭은 최대 약 50-100 km로 1964년 알래스카
----------------------------------------------------------------------
728x90
반응형

추천 글