Machine Learning/RAG

Chunking strategies

뚜둔뚜둔 2025. 2. 24. 16:03

→ 여러 청킹 방법을 살펴 보고 청킹 크기와 방법을 선택할 때, 고려해야 할 트레이드오프에 대해 논의

→ 어플리케이션에 적합한 최적의 청킹 크기와 방법을 결정하기 위한 몇 가지 권장 사항을 제시

 

짧고 긴 콘텐츠 임베딩 ( Embedding short and long content)

콘텐츠를 임베딩 할 때, 콘텐츠의 길이(문장처럼 짧은 것 또는 문단 또는 전체 문서처럼 긴 것)에 따라 다양한 동작을 예상 할 수 있음

문장이 임베딩되면 결과 벡터는 문장의 구체적인 의미에 중점을 둠. 이는 다른 문장 임베딩과 비교할 때 자연스럽게 그 수준에서 비교가 이루어진다는 것을 의미. 이는 또한 임베딩이 문잗닝나 문서에서 찾을 수 있는 더 넓은 맥락 정보를 놓칠 수 있음을 의미

 

전체 문단 또는 문서가 임베딩 되면 임베딩 과정은 전체 맥락과 텍스트 내의 문장과 구절 사이의 관계를 모두 고려한다.이로 인해 텍스트의 더 넓은 의미와 주제를 포착하는 더 포괄적인 벡터 표현이 생성될 수 있다. 반면에 더 큰 입력 텍스트 크기는노이즈를 도입하거나 개별 문장이나 구절의 중요성을 희석시켜 인덱스를 쿼리할 때 정확한 일치를 찾는것이 더 어려워 질 수 있다.

해당 텍스트는 짧은 콘텐츠와 긴 콘텐츠를 임베딩하는 것의 차이와 함의에 대해 설명함.
이는 문장을 임베딩하면 그 특정한 의미에 중점을 둔다고 언급하지만, 문단이나 문서와 같은 긴 텍스트를 임베딩하면 전반적인 맥락과 문장 및 구절 간의 상호 관계를 고려하며, 이는 더 포괄적인 벡터 표현을 이끌어 낼 수 있다.
그러나 또한 큰 텍스트 입력은 노이즈를 도입하거나 개별 문장 또는 구절의 중요성을 줄일 수 있어 인덱스 쿼리 중 정확한 매칭을 어렵게 만들 수있다고 지적함.

 

쿼리의 길이도 임베딩이 서로 어떻게 관련되는지에 영향을 미침. 단일 문장이나 구절과 같은 짧은 쿼리는 구체적인 사항에 중점을 둘 것이며, 문장 수준의 임베딩과 매칭하기에 더 적합할 수 있다. 한 문장 이상이나 문단을 포괄하는 긴 쿼리는 문단 또는 문서 수준의 임베딩과 더 조화를 이룰 수 있다. → 더 넓은 맥락이나 주제를 찾고 있을 가능성이 있기 때문

 

색인은 또한 비균질적일 수 있으며, 다양한 크기의 청킹에 대한 임베딩을 포함할 수 있따. 이것은 쿼리 결과의 관련성 측면에서 도전을 제시할 수 있지만, 긍정적인 결과를 가져올 수도 있음

한편으로는, 긴 콘텐츠와 짧은 콘텐츠의 이미론적 표현 사이의 차이 때문에 쿼리 결과의 관련성이 변동할 수 있다. 반면에 비균질적인 색인은 텍스틔 다양한 정밀도 수준을 나타내는 다양한 청킹 크기로 인해 더 넓은 범위의 맥락과 정보를 포착할 수 있음 → 더 유연하게 다양한 유형의 쿼리를 수용할 수 있음

 

해당 텍스트는 쿼리의 길이가 임베딩 간의 관계에 어떻게 영향을 미치는지, 그리고 다양한 청킹 크기를 가진 비균질 인덱스를 가질 때의 잠재적인 도전과 이점에 대해 논의함
짧은 쿼리는 문장 수준의 임베딩과 더 잘 매칭될 수 있으며, 반면에 긴 쿼리는 문단 또는 문서 수준의 임베딩과 더 잘 맞을 수 있다.
비균질 인덱스는 의미론적 표현의 차이로 인해 쿼리 결과의 관련성에 도전을 제시할 수 있지만, 또한 더 넓은 범위의 맥락과 정보를 포착하고 더 유연하게 다양한 유형의 쿼리를 수용할 수도 있음

 

 

청킹 고려 사항 ( Chunking Considerations )

최적의 청킹 전략을 결정하는 데에는 여러 변수가 작용하며, 이러한 변수는 사용 사례에 따라 달라진다. 

유의사항

  1. 색인화 되는 콘텐츠의 성격은 무엇인가요? 긴문서(ex.기사 or 책)와 같은 긴 콘텐츠를 다르고 있나요, 아니면 트윗이나 즉시 메시지와 같은 짧은 콘텐츠를 다루고 있나요? 답변은 당신의 목표에 더 적합한 모델과 따라서 어떤 청킹 전략을 적용할지를 결정할 것.
  2. 어떤 임베딩 모델을 사용하고 있으며, 이 모델은 어떤 청킹 크기에서 최적으로 수행되나요? ex. 문장 변환 모델은 개별적 문장에서 잘 작동하지만 text-embedding-ada-002와 같은 모델은 256 또는 512 토큰을 포함하는 청킹에서 더 잘 작동한다.
  3. 사용자 쿼리의 길이와 복잡성에 대한 기대치는 무엇인가요? 짧고 구체적일까요, 아니면 길고 복잡할까요? 이것은 임베디드 쿼리와 임베디드 청킹 사이에 더 가까운 상관 관계가 있도록 콘텐츠를 청킹하는 방법을 결정하는 데에도 도움이 될 수 있다.
  4. 검색된 결과가 특정 애플리케이션 내에서 어떻게 활용되나요? ex.의미론적 검색, 질문 응답, 요약 또는 기타 목적으로 사용되나요? ex. 결과가 토큰 제한이 있는 다른 LLM에 공급되어야 하는 경우, 이를 고려해야하며, LLM에 요청할 청킹 수에 기반하여 청킹의 크기를 제한해야합니다.

이러한 질문에 답하면 성능과 정확성 사이의 균형을 맞춘 청킹 전략을 개발할 수 있으며, 이는 차례로 쿼리 결과가 더 관련성 있게 됨을 보장함.

 

청킹 방법(Chunking methods)

고정 크기 청킹 ( Fixed-size Chunking )

  • 가장 일반적이고 간단한 접근 방식 → 대부분 일반적인 경우 가장 좋은 방법
  • 단순히 청킹의 토큰 수를 결정하고 선택적으로 그들 사이에 어떠한 겹침이 있어야 하는지 결정함 ( 일반적으로, 청킹 사이에 의미론적 맥락이 사라지지 않도록 청킹 사이에 약간의 겹침을 유지)
  • 다른 형태의 청킹에 비해 고정 크기 청킹은 계산상 저렴하고 사용하기 쉬우며 어떤 자연어처리 라이브러리도 필요로 하지 않음
  •  
// langchain을 사용하여 고정 크기 청킹을 수행하는 예시

text="..." 
from langchain.text_splitter import Character TextSplitter
text_splitter = CharacterTextSplitter(
        separator="\n\n",
        chunk_size = 256,
        chunk_overlap = 20
)
doc = text_splitter.create_documents([text])

 

"콘텐츠" 청킹 ( "Content-aware" Chunking )

문장분리 (sentence splitting)

단순 분리: 가장 단순한 접근 방식은 문장을 마침표(".")와 줄바꿈으로 분리하는 것. → 이 방법은 간단할 수 있지만, 이러한 접근 방식은 모든 가능한 케이스를 고려하지 않음

text = "...insert text"
doc = text.split(".")

 

NLTK: Natural Language Toolkit(NLTK)은 인간 언어 데이터를 처리하기 위한 인기 있는 python 라이브러리. 이 라이브러리는 텍스트를 문장으로 분리할 수 있는 문장 토크나이저를 제공하여 더 의미 있는 청킹을 생성하는데 도움이 됨.

ex. LangChain과 함께 LNTK를 사용하면 다음과 같이 할 수 있음

text = "...insert text"
from langchain.text_splitter import NLTKTextSplitter
text_splitter = NLTKTextSplitter()
doc = text_splitter.split_text(text)

 

 

spaCy: spaCy는 NLP 작업을 위한 또다른 강력한 python 라이브러리이다. 이라이브러리는 텍스트를 별도의 문장으로 효율적으로 나눌 수 있는 정교한 문장 세분화 기능을 제공하여 결과 청킹에서 더 나은 맥락 보존을 가능하게 한다. 

ex. LangChain과 함께 spaCy를 사용하면 다음과 같이 할 수 있음

text = "...insert text"
from langchain.text_splitter import SpacyTextSplitter
text_splitter = SpacyTextSplitter()
doc = text_splitter.split_text(text)

 

재귀청킹 (Recursive splitting)

재귀 청킹은 일녀의 구분자를 사용하여 입력 텍스트를 계층적이고 반복적인 방식으로 작은 청킹으로 나눕니다. 초기 텍스트 분할이 원하는 청킹 크기 또는 구조를 생성하지 않으면 메서드는 원하는 청킹 크기 또는 구조가 달성될 때까지 결과 청킹에 대해 다른 구분자 또는 기준을 사용하여 자체를 재귀적으로 호출. 이는 청킹이 정확하게 동일한 크기가 아니더라도 유사한 크기를 갖도록 지향한다는 것을 의미

ex. LangChain과 함께 재귀 청킹을 사용하면 다음과 같이 할 수 있음

text = "...insert text"
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 256,
    chunk_overlap = 20
)
doc = text_splitter.create_documents([text])

 

특수 청킹 (Specialized chunking)

Markdown과 LaTeX는 청킹 과정 중에 콘텐츠의 원래 구조를 유지하기 위해 특수 청킹 방법을 사용할 수 있는 구조화되고 형식화된 콘텐츠의 두 예입니다.

Markdown: Markdown은 텍스트를 형식화하는 데 일반적으로 사용되는 경량 마크업 언어입니다. Markdown 구문(예: 헤딩, 목록 및 코드 블록)을 인식함으로써, 구조와 계층에 기반하여 콘텐츠를 지능적으로 나눌 수 있으며, 이로 인해 더 의미론적으로 일관된 청킹이 생성됩니다.

LaTeX: LaTeX는 학술 논문 및 기술 문서에 자주 사용되는 문서 준비 시스템 및 마크업 언어입니다. LaTeX 명령 및 환경을 파싱함으로써, 콘텐츠의 논리적 구성(예: 섹션, 하위 섹션 및 방정식)을 존중하는 청킹을 생성할 수 있으며, 이로 인해 더 정확하고 문맥상 관련성 있는 결과가 도출됩니다. 

 

어플리케이션에 대한 최적의 청킹 크기 결정하기

일반적인 청킹 접근법, 예를 들어 고정 청킹이 사용 사례에 쉽게 적용되지 않는 경우 최적의 청킹 크기를 결정하는데 도움이 될 몇가지 지침을 제공

  1. 데이터 전처리: 
  2. 청킹 크기 범위 선택
  3. 각 청킹 크기의 성능 평가

 

 

참고 : https://www.jiniai.biz/2023/10/21/llm-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84-%EC%9C%84%ED%95%9C-chunking-strategies/

 

LLM 어플리케이션을 위한 Chunking Strategies – 지니코딩랩

Chunking Strategies for LLM Applications The Significance of Chunking, Text Splitting, and Conversation Memory for Prompt Engineers LLM(언어 모델 학습) 관련 애플리케이션을 개발할 때 chunking은 큰 텍스트를 작은 세그먼트로 분

www.jiniai.biz

 

반응형