본문 바로가기
오블완 챌린지

Chunking Strategies

by carrotomato 2024. 11. 9.
728x90

오늘은 LLM을 위한 chunking 방법론에 대해서 간단하게 알아보겠습니다.

요즘 RAG를 주제로 하는 프로젝트나 논문들이 굉장히 많은데 이 RAG 방식을 취할 때 document를 작은 단위로 나누어 처리하는 것을 chunking이라고 합니다.

여기에 여러가지 알고리즘들이 있는데 몇가지 주요 사용되는 알고리즘들을 알아보겠습니다!

 

우선 chunking이 필요한 이유는 다음과 같습니다.

  • token 길이 제한 문제의 해결 - LLM이 한 번에 처리할 수 있는 토큰의 수에는 제한이 있기 때문에 긴 텍스트를 나누어서 넣어야 모델이 모든 텍스트를 다 다룰 수 있게됩니다.
  • context 유지 - 긴 문서를 chunking을 통해 나누어야 각 문맥에서 중요한 정보들을 잘 유지할 수 있고, 특정 정보에 더 집중할 수 있게 됩니다.
  • 효율성 - text를 chunk 단위로 나누면 아무래도 원문 전체를 사용할 때 보다 처리 속도가 빨라지고, 메모리 사용량을 절약할 수 있습니다.

그럼 이제 chunking 방법론에 대해서 알아보겠습니다!

예시로 사용하는 text는 wikipeida의 '인공지능'의 일부를 발췌하였습니다.

Fixed Size Chunking

일정한 길이로 텍스트를 분할하는 방식입니다.

모든 chunk가 동일한 길이를 가지며, 병렬처리에 유리합니다.

하지만, separator에 따라 문장이 중간에서 끊길 수도 있으며, 문맥이 잘리거나 문장이 어색해질 수도 있습니다.

 

아래는 langchain을 이용한 예시코드입니다.

from langchain_text_splitters import CharacterTextSplitter

text = '''인공지능(人工智能, 영어: artificial intelligence, AI)은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현하려는 컴퓨터 과학의 세부분야 중 하나이다. 정보공학 분야에 있어 하나의 인프라 기술이기도 하다.[1][2] 인간을 포함한 동물이 갖고 있는 지능 즉, 자연 지능(natural intelligence)과는 다른 개념이다.

인간의 지능을 모방한 기능을 갖춘 컴퓨터 시스템이며, 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것이다. 일반적으로 범용 컴퓨터에 적용한다고 가정한다. 이 용어는 또한 그와 같은 지능을 만들 수 있는 방법론이나 실현 가능성 등을 연구하는 과학 기술 분야를 지칭하기도 한다.[3][4][5]'''

text_splitter = CharacterTextSplitter(
    separator='', # separator 설정
    chunk_size=128, # chunk size 조절
    chunk_overlap=20, # chunk overlap size 조절
    length_function=len,
    is_separator_regex=False,
)

documents = text_splitter.split_text(text)
documents

# ['인공지능(人工智能, 영어: artificial intelligence, AI)은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현하려는 컴퓨터 과학의 세부분야 중 하나이다. 정보공학 분야에 있어 하나의 인프라 기술이기도 하다',
#  '있어 하나의 인프라 기술이기도 하다.[1][2] 인간을 포함한 동물이 갖고 있는 지능 즉, 자연 지능(natural intelligence)과는 다른 개념이다.\n\n인간의 지능을 모방한 기능을 갖춘 컴퓨터 시스템이며, 인간의 지능',
#  '갖춘 컴퓨터 시스템이며, 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것이다. 일반적으로 범용 컴퓨터에 적용한다고 가정한다. 이 용어는 또한 그와 같은 지능을 만들 수 있는 방법론이나 실현 가능성 등을 연구하는 과학 기술 분',
#  '가능성 등을 연구하는 과학 기술 분야를 지칭하기도 한다.[3][4][5]']

 

Recursive Chunking

Recursive chunk은 재귀적으로 text를 chunking하는 방식입니다.

우선 최상위 기준에 따라서 텍스트를 chunking합니다.

예를 들어 document의 장이나, 문단 별로 chunking을 진행하고 각 chunk에 대해서 여전히 길이가 긴 chunk는 다시 하위 기준(문장 등)을 적용하여 chunk를 나눕니다.

각 chunk가 목표 길이 이하로 작아지거나, 추가로 chunking을 할 필요가 없어질 때까지 이러한 과정을 반복하는 방식입니다.

 

아래는 langchain을 이용한 예시코드입니다.

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=100,
    chunk_overlap=20,
    length_function=len,
    is_separator_regex=False,
)

text = '''인공지능(人工智能, 영어: artificial intelligence, AI)은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현하려는 컴퓨터 과학의 세부분야 중 하나이다. 정보공학 분야에 있어 하나의 인프라 기술이기도 하다.[1][2] 인간을 포함한 동물이 갖고 있는 지능 즉, 자연 지능(natural intelligence)과는 다른 개념이다.

인간의 지능을 모방한 기능을 갖춘 컴퓨터 시스템이며, 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것이다. 일반적으로 범용 컴퓨터에 적용한다고 가정한다. 이 용어는 또한 그와 같은 지능을 만들 수 있는 방법론이나 실현 가능성 등을 연구하는 과학 기술 분야를 지칭하기도 한다.[3][4][5]

강인공지능과 약인공지능
초기 인공지능 연구에 대한 대표적인 정의는 다트머스 회의에서 존 매카시가 제안한 것으로 "기계를 인간 행동의 지식에서와 같이 행동하게 만드는 것"이다. 그러나 이 정의는 범용인공지능(AGI, 강한 인공지능)에 대한 고려를 하지 못한 것 같다. 인공지능의 또다른 정의는 인공적인 장치들이 가지는 지능이다. 거의 대부분 정의들이 인간처럼 사고하는 시스템, 인간처럼 행동하는 시스템, 이성적으로 사고하는 시스템 그리고 이성적으로 행동하는 시스템이라는 4개의 분류로 분류된다.[6] 인공지능의 작동 방식이 의사 결정과 문제 해결, 학습에 있어 사람의 생각이나 행동과 유사할수록 강한 인공지능으로 분류되고, 논리에 의해 만들어지는 합리적인 생각이나 행동에 가까울수록 약한 인공지능으로 분류된다.[7]'''
texts = text_splitter.split_text(text)
texts

# ['인공지능(人工智能, 영어: artificial intelligence, AI)은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현하려는 컴퓨터 과학의 세부분야 중 하나이다.',
#  '과학의 세부분야 중 하나이다. 정보공학 분야에 있어 하나의 인프라 기술이기도 하다.[1][2] 인간을 포함한 동물이 갖고 있는 지능 즉, 자연 지능(natural',
#  '지능 즉, 자연 지능(natural intelligence)과는 다른 개념이다.',
#  '인간의 지능을 모방한 기능을 갖춘 컴퓨터 시스템이며, 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것이다. 일반적으로 범용 컴퓨터에 적용한다고 가정한다. 이 용어는 또한',
#  '가정한다. 이 용어는 또한 그와 같은 지능을 만들 수 있는 방법론이나 실현 가능성 등을 연구하는 과학 기술 분야를 지칭하기도 한다.[3][4][5]',
#  '강인공지능과 약인공지능',
#  '초기 인공지능 연구에 대한 대표적인 정의는 다트머스 회의에서 존 매카시가 제안한 것으로 "기계를 인간 행동의 지식에서와 같이 행동하게 만드는 것"이다. 그러나 이 정의는',
#  '만드는 것"이다. 그러나 이 정의는 범용인공지능(AGI, 강한 인공지능)에 대한 고려를 하지 못한 것 같다. 인공지능의 또다른 정의는 인공적인 장치들이 가지는 지능이다. 거의',
#  '장치들이 가지는 지능이다. 거의 대부분 정의들이 인간처럼 사고하는 시스템, 인간처럼 행동하는 시스템, 이성적으로 사고하는 시스템 그리고 이성적으로 행동하는 시스템이라는 4개의',
#  '행동하는 시스템이라는 4개의 분류로 분류된다.[6] 인공지능의 작동 방식이 의사 결정과 문제 해결, 학습에 있어 사람의 생각이나 행동과 유사할수록 강한 인공지능으로 분류되고,',
#  '강한 인공지능으로 분류되고, 논리에 의해 만들어지는 합리적인 생각이나 행동에 가까울수록 약한 인공지능으로 분류된다.[7]']

 

Document based Chunking

이 방식은 문서마다 내재된 구조에 따라서 chunking하는 방식입니다.

이러한 방식은 document의 흐름과 구조를 고려하지만, 명확한 구조가 없는 문서에 대해서는 효과적이지 않을 수 있습니다.

langchain 모듈을 이용한 MarkdownTextSplitter 예시만 간단히 보겠습니다.

from langchain_text_splitters import MarkdownHeaderTextSplitter

markdown_document = """# Foo\n\n
## Bar\n\nHi this is Jim\n\nHi this is Joe\n\n
### Boo \n\n Hi this is Lance \n\n
## Baz\n\n Hi this is Molly"""

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits

# [Document(metadata={'Header 1': 'Foo', 'Header 2': 'Bar'}, page_content='Hi this is Jim  \nHi this is Joe'),
#  Document(metadata={'Header 1': 'Foo', 'Header 2': 'Bar', 'Header 3': 'Boo'}, page_content='Hi this is Lance'),
#  Document(metadata={'Header 1': 'Foo', 'Header 2': 'Baz'}, page_content='Hi this is Molly')]

 

Semantic Chunking

이 chunking 방식은 임베딩에서 의미적 의미를 추출한 다음 chunk 간의 의미적 관계를 평가하는 것을 목표로 하며, 의미적으로 유사한 chunk들을 함께 유지하는 방식입니다.

아래는 langchain과 openai 의 임베딩 모델을 이용한 chunking의 예시입니다.

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
import os

os.environ["OPENAI_API_KEY"] = "sk-..."
text_splitter = SemanticChunker(OpenAIEmbeddings())

text = '''인공지능(人工智能, 영어: artificial intelligence, AI)은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현하려는 컴퓨터 과학의 세부분야 중 하나이다. 정보공학 분야에 있어 하나의 인프라 기술이기도 하다.[1][2] 인간을 포함한 동물이 갖고 있는 지능 즉, 자연 지능(natural intelligence)과는 다른 개념이다.

인간의 지능을 모방한 기능을 갖춘 컴퓨터 시스템이며, 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것이다. 일반적으로 범용 컴퓨터에 적용한다고 가정한다. 이 용어는 또한 그와 같은 지능을 만들 수 있는 방법론이나 실현 가능성 등을 연구하는 과학 기술 분야를 지칭하기도 한다.[3][4][5]

강인공지능과 약인공지능
초기 인공지능 연구에 대한 대표적인 정의는 다트머스 회의에서 존 매카시가 제안한 것으로 "기계를 인간 행동의 지식에서와 같이 행동하게 만드는 것"이다. 그러나 이 정의는 범용인공지능(AGI, 강한 인공지능)에 대한 고려를 하지 못한 것 같다. 인공지능의 또다른 정의는 인공적인 장치들이 가지는 지능이다. 거의 대부분 정의들이 인간처럼 사고하는 시스템, 인간처럼 행동하는 시스템, 이성적으로 사고하는 시스템 그리고 이성적으로 행동하는 시스템이라는 4개의 분류로 분류된다.[6] 인공지능의 작동 방식이 의사 결정과 문제 해결, 학습에 있어 사람의 생각이나 행동과 유사할수록 강한 인공지능으로 분류되고, 논리에 의해 만들어지는 합리적인 생각이나 행동에 가까울수록 약한 인공지능으로 분류된다.[7]'''

docs = text_splitter.split_text(text)
docs

# ['인공지능(人工智能, 영어: artificial intelligence, AI)은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현하려는 컴퓨터 과학의 세부분야 중 하나이다. 정보공학 분야에 있어 하나의 인프라 기술이기도 하다.[1][2] 인간을 포함한 동물이 갖고 있는 지능 즉, 자연 지능(natural intelligence)과는 다른 개념이다. 인간의 지능을 모방한 기능을 갖춘 컴퓨터 시스템이며, 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것이다. 일반적으로 범용 컴퓨터에 적용한다고 가정한다. 이 용어는 또한 그와 같은 지능을 만들 수 있는 방법론이나 실현 가능성 등을 연구하는 과학 기술 분야를 지칭하기도 한다.[3][4][5]\n\n강인공지능과 약인공지능\n초기 인공지능 연구에 대한 대표적인 정의는 다트머스 회의에서 존 매카시가 제안한 것으로 "기계를 인간 행동의 지식에서와 같이 행동하게 만드는 것"이다. 그러나 이 정의는 범용인공지능(AGI, 강한 인공지능)에 대한 고려를 하지 못한 것 같다.',
#  '인공지능의 또다른 정의는 인공적인 장치들이 가지는 지능이다. 거의 대부분 정의들이 인간처럼 사고하는 시스템, 인간처럼 행동하는 시스템, 이성적으로 사고하는 시스템 그리고 이성적으로 행동하는 시스템이라는 4개의 분류로 분류된다.[6] 인공지능의 작동 방식이 의사 결정과 문제 해결, 학습에 있어 사람의 생각이나 행동과 유사할수록 강한 인공지능으로 분류되고, 논리에 의해 만들어지는 합리적인 생각이나 행동에 가까울수록 약한 인공지능으로 분류된다.[7]']

 

이렇게 4가지 chunking strategy에 대해서 알아보았습니다!

documents의 양이나 성격에 따라서 여러가지 chunking strategy 중 골라서 사용하면 된다고 하는데요.

많이 사용하는 chunking은 아무래도 fixed size chunking 방식인 것 같긴합니다. 단순하고 빠르기 때문이죠!

 

다음엔 RAG에 사용할 수 있는 다른 방법들도 한 번 소개해보도록 할게요!

오늘은 여기까지 -끄읏-

 

728x90

'오블완 챌린지' 카테고리의 다른 글

2024.11.12 뱅밥 세끼 - 2탄  (2) 2024.11.13
2024.11.12 뱅밥 세끼 - 1탄  (10) 2024.11.12
Tiktoken 사용하기  (2) 2024.11.08
Ollama 사용하기  (3) 2024.11.07
티스토리 <작심삼주 오블완 챌린지>를 소개합니다.  (0) 2024.10.30