오늘날의 RAG 솔루션을 더 깊이 이해하려면 RAG Cookbook에서 제공하는 추가 내용을 살펴보세요.

Watson for Customer Care 리드스페이스를 기본으로 사용하여 색상을 변경한 리드스페이스.
개요

웹 크롤링과 문서 인덱싱 영역에서는 검색 성능과 관련성을 최적화하기 위해 효과적인 청킹 방법론이 매우 중요합니다. HTML 웹 페이지나 PDF를 처리할 때 사용하는 전략은 검색 애플리케이션의 효율성과 정확도에 큰 영향을 미칠 수 있습니다. 다음은 특히 Elasticsearch를 벡터 스토어로 사용하는 환경에서 다양한 상황에 적용할 수 있는 효과적인 청킹 방법론에 대한 종합 가이드입니다.

 

문서 분할

웹 페이지는 크기와 구조가 매우 다양합니다. 효율적인 처리를 위해 다음을 고려합니다.

  • HTML 파싱: HTML 태그를 기준으로 HTML 페이지를 관리 가능한 청크로 분해합니다(예: 단락은 <p>, 섹션은 <div>).
  • 콘텐츠 추출: 본문, 제목, 정형 데이터와 같은 의미 있는 콘텐츠를 추출하는 데 집중합니다.
청킹 전략
  • URL 기준: 각 URL을 별도의 문서로 처리합니다. 이 방법은 단순하며 각 페이지가 비교적 작고 독립적인 웹사이트에서 유용합니다.
  • 페이지 섹션 기준: 의미 있는 섹션(예: 기사, 블로그 게시물)을 기준으로 문서를 분할합니다. 이 접근 방식은 장문 콘텐츠와 다양한 콘텐츠 유형을 가진 사이트에 유용합니다.
  • 콘텐츠 길이: 지나치게 큰 청크는 피하고 검색 관련성을 위한 세분화와 성능 간의 균형을 유지합니다. 더 작은 청크는 검색 정확도를 향상시킬 수 있지만 처리 오버헤드를 증가시킬 수 있습니다.
처리 파이프라인
  • 웹 스크래핑에는 Beautiful Soup이나 Scrapy와 같은 라이브러리를 사용할 수 있습니다.
  • HTML 태그를 제거하고 인코딩 문제를 처리해 텍스트를 정규화합니다.
  • 검색 정확도를 높이기 위해 언어별 분석기(예: 어간 추출, 불용어 처리)를 적용합니다.
구형 HTML 코드의 문제

웹 크롤링에 오래된 HTML 코드가 포함되는 경우 Elasticsearch 인덱싱을 위해 추출되는 청크의 품질에 상당한 영향을 줄 수 있습니다. 다음은 주요 과제와 완화 전략입니다.

구조적 불일치

비표준 태그 및 속성:

  • 오래된 HTML 코드는 현대 파서가 정확하게 처리하거나 완전히 이해하지 못하는 비표준 태그나 속성을 사용할 수 있습니다.
  • 특히 크롤러가 표준 HTML 파싱 라이브러리에 의존하는 경우 콘텐츠 청크가 불완전하거나 잘못 추출될 수 있습니다.

중첩 및 사용 중단된 요소:

  • 오래된 HTML에는 , , 와 같은 사용 중단된 태그나 중첩된 요소가 포함되는 경우가 많으며, 이러한 요소는 최신 HTML 파서에서 제대로 파싱되지 않을 수 있습니다.
  • 그 결과 이러한 요소를 기반으로 콘텐츠를 분할하면 청크가 조각나거나 잘못된 구조로 생성될 수 있습니다.

콘텐츠 품질 및 관련성

인라인 스타일 및 서식:

  • 오래된 HTML은 <font>, <b>, <i> 등과 같은 인라인 스타일 및 서식 태그에 크게 의존하는 경우가 많으며, 이로 인해 추출된 텍스트가 복잡해지고 인덱싱된 청크의 품질이 저하될 수 있습니다.
  • Elasticsearch가 이러한 청크를 분석하고 인덱싱하는 과정에서 검색 품질이 저하되어 검색 결과의 관련성에 영향을 줄 수 있습니다.

일관성 없는 문서 구조:

  • 오래된 HTML 페이지에는 표준화된 문서 구조가 부족한 경우가 많아 청크 크기와 콘텐츠 구간이 일관되지 않게 될 수 있습니다.
  • 이러한 불일치는 의미 있는 콘텐츠 섹션 간의 명확한 경계를 설정하기 어렵게 만들어 청크의 세분성과 검색 관련성에 영향을 줍니다.

기술적 과제

인코딩 및 문자 문제:

  • 오래된 HTML 페이지에는 잘못된 문자 집합이나 엔티티(&nbsp;, &lt;)와 같은 인코딩 문제가 있을 수 있으며, 텍스트 추출 과정에서 이를 적절히 처리해야 합니다.
  • 이를 제대로 처리하지 못하면 텍스트가 깨지거나 인덱싱된 청크에서 콘텐츠가 잘못 표현될 수 있습니다.

스크립트 및 동적 콘텐츠:

  • 오래된 HTML 페이지에 포함된 동적 요소와 스크립트(예: JavaScript, Flash)는 기본 웹 크롤러에서 제대로 처리되지 않을 수 있습니다.
  • 이로 인해 콘텐츠가 불완전하게 추출되거나 동적으로 생성된 텍스트가 누락되어 인덱싱된 청크의 포괄성에 영향을 줄 수 있습니다.

완화 전략

Elasticsearch 인덱싱을 위한 웹 크롤링 과정에서 오래된 HTML 코드가 청크 품질에 미치는 영향을 완화하려면 다음 전략을 고려하세요.

  • 강력한 파싱 라이브러리 사용: 다양한 HTML 버전과 비표준 요소를 처리할 수 있는 고급 HTML 파싱 라이브러리를 사용합니다.
  • 텍스트 정규화: 추출된 텍스트를 사전 처리하여 서식을 정규화하고 불필요한 태그나 속성을 제거합니다.
  • 콘텐츠 정리: 추출 과정에서 관련 없는 요소나 사용 중단된 요소를 제거하여 인덱싱된 청크의 품질을 개선합니다.
  • 추출 로직 조정: 오래된 HTML 페이지의 특수한 구조를 처리할 수 있도록 사용자 정의 로직을 개발해 의미 있는 콘텐츠 청크로 더 정확하게 분할합니다.
  • 정기 업데이트: 웹 표준과 HTML 사용 방식의 변화에 대응할 수 있도록 크롤러 로직과 파싱 라이브러리를 지속적으로 유지 관리합니다.

이러한 과제를 사전에 해결하면 오래된 HTML 페이지에서 추출되는 콘텐츠 청크의 품질을 향상시킬 수 있으며, 그 결과 Elasticsearch 기반 검색 애플리케이션의 전반적인 효과성과 관련성을 높일 수 있습니다.

PDF 인덱싱

PDF 콘텐츠 추출

  • 제목, 단락, 표와 같은 요소를 고려하여 PDF에서 텍스트를 추출합니다.
  • 인덱싱을 위해 메타데이터(제목, 작성자, 날짜)를 별도로 처리합니다.

청킹 전략

  • 문서 기준: 각 PDF 파일을 인덱싱을 위한 단일 문서로 처리합니다.
  • 페이지 기준: 필요에 따라 PDF를 페이지 또는 논리적 섹션을 기준으로 청크로 분할합니다.
  • 텍스트 블록: 콘텐츠의 자연스러운 구분(예: 단락)을 기준으로 큰 청크를 더 작은 단위로 분할합니다.

텍스트 추출의 과제, 사실 및 오해

  • 사실: PDF에는 이미지 또는 스캔 문서가 포함될 수 있으며, 텍스트 추출을 위해 OCR이 필요할 수 있습니다. Watsonx Discovery에는 OCR 기능이 있으므로 이는 문제가 되지 않습니다.
  • PDF에 고유한 텍스트 인코딩 및 서식 문제(예: 하이픈 분할, 줄바꿈)를 처리합니다.

인덱싱 파이프라인

  • 특수 문자를 제거하고 하이픈 분할을 처리하여 추출된 텍스트를 정규화합니다.
  • 검색 기능을 향상시키기 위해 처리된 텍스트에 언어별 분석기를 적용합니다.
고려 사항

일반 고려 사항

  • 성능: 효율적인 인덱싱과 쿼리 성능을 위해 청크 크기의 균형을 유지합니다.
  • 관련성: 정확한 검색 결과를 위해 청크가 의미 있는 콘텐츠 구간을 포함하도록 합니다.
  • 인덱싱 오버헤드: 대량의 데이터를 인덱싱할 때 발생하는 오버헤드를 고려하고 Elasticsearch에서 인덱싱 설정과 샤드 할당을 최적화합니다.
  • 검색 품질: 청크로 분할된 문서 전반에서 관련 결과를 제공하도록 검색 쿼리를 테스트하고 개선합니다.

청킹 방법 선택

  • 콘텐츠 특성: 짧은 메시지의 경우 문장 수준 청킹으로 충분할 수 있습니다. 긴 문서의 경우 콘텐츠 인식 청킹을 고려하거나 서로 다른 청크 크기를 혼합한 이종 청킹을 탐색할 수 있습니다.
  • 애플리케이션 요구 사항: 계산 효율성이 가장 중요하다면 고정 크기 청킹이 좋은 시작점이 될 수 있습니다. 컨텍스트가 풍부한 검색이 중요하다면 콘텐츠 인식 청킹이 더 적합한 옵션입니다.

요약하면 웹 크롤링 또는 PDF 인덱싱과 함께 Elasticsearch를 사용할 때의 최적의 청킹 전략은 콘텐츠를 관리 가능한 단위(문서, 페이지, 섹션)로 분해하여 인덱싱과 쿼리에서 세분성과 효율성의 균형을 맞추는 것입니다. 콘텐츠 소스의 특성(예: 웹 페이지와 PDF)과 검색 애플리케이션의 특정 요구 사항에 따라 전략을 조정하십시오. 이러한 방법론을 구현하면 검색 엔진의 성능과 정확도를 향상시키고 사용자에게 더 관련성 높고 정확한 결과를 제공할 수 있습니다.

청킹 방법론 비교

이점 단순함, 관리 용이

 

사용 사례:

 
  • <b style=" font-family: inherit; ">Websites with small, self-contained pages:<span style=" font-family: inherit; "> 각 URL을 별도의 문서로 쉽게 관리할 수 있습니다.
  • 각 URL이 서로 다른 문서를 나타내는 상황: 문서 관리에서 명확성과 단순성을 보장합니다.
이점 세분화 향상, 검색 질의 관련성 향상

 

사용 사례: 

장문 콘텐츠 웹사이트: 큰 기사나 게시물을 분할하여 검색 관련성을 향상시킵니다.

다양한 콘텐츠 유형을 가진 사이트: 다양한 콘텐츠를 더 효과적으로 정리하고 검색할 수 있습니다.

 

이점 세분화와 성능 간의 균형, 검색 정확도 향상

 

사용 사례: 

콘텐츠가 많은 웹사이트: 청크가 지나치게 커지는 것을 방지하여 검색 정확도와 성능을 향상시킵니다.

매우 큰 청크가 적합하지 않은 웹사이트: 상세한 인덱싱 요구와 성능 사이의 균형을 유지합니다.

이점 연산 효율성, 예측 가능한 성능

 

사용 사례: 

높은 연산 효율이 요구되는 애플리케이션: 예측 가능한 성능과 리소스 사용을 제공합니다.

표준화된 데이터 처리 작업: 균일한 청크 크기가 유리한 환경에 적합합니다.

이점 콘텐츠에 대한 세밀한 제어, 높은 검색 관련성

 

사용 사례: 

 

짧은 메시지 인덱싱: 짧은 텍스트에서 정확한 검색과 검색 결과 제공에 적합합니다.

텍스트 분석 애플리케이션: 짧은 텍스트 구간에 대한 세밀한 분석과 이해를 가능하게 합니다.

이점 컨텍스트 인식 청킹, 검색 관련성 향상

 

사용 사례: 

다양한 콘텐츠가 포함된 장문 문서: 청크가 의미 있는 컨텍스트를 유지하도록 합니다.

세부 콘텐츠 분석: 컨텍스트를 유지하여 검색 결과 품질을 향상시킵니다.

이점 논리적 분할, 가독성 향상

 

사용 사례:

PDF 인덱싱: 각 페이지를 논리적 단위로 처리하여 가독성과 검색 가능성을 향상시킵니다.

각 페이지가 독립적인 단위인 문서: 페이지 기반 콘텐츠의 구조적 일관성을 유지합니다.

 

이점 콘텐츠의 자연스러운 분할, 구조화된 콘텐츠 처리 향상

 

사용 사례: 

- 단락 구분이 명확한 대형 문서: 더 쉽게 읽고 처리할 수 있습니다.

- 구조화된 문서 인덱싱: 의미 있는 섹션이 별도로 인덱싱되도록 합니다.

IBM 솔루션

watsonx에서의 청킹

IBM watsonx 플랫폼은 RAG 패턴 구현을 지원하고 가속하며 문서 청킹과 문서 이해를 가능하게 합니다.  watsonx Orchestrate와 watsonx Discovery를 함께 사용하면 로우코드 또는 노코드 방식부터 더 맞춤화된 솔루션 구현까지 문서 청킹을 수행할 수 있습니다. 

여기에 나열된 방법은 RAG 사용 사례에서 청킹 기법을 구현할 때 일반적으로 고려되는 방법입니다. watsonx에서는 더 높은 정확도와 속도를 제공하기 위해 하이브리드 기법을 사용할 수 있습니다. 전체 프로세스는 의미 있는 세분화를 보장하기 위해 문서를 단일 문장 단위로 분할합니다. 그 다음 LLM을 사용해 문장들을 청크로 그룹화합니다. LLM은 문장의 컨텍스트가 해당 청크에 적합한지 평가하고, 적합하지 않으면 새로운 청크를 생성합니다. 그 청크를 기반으로 LLM을 사용해 의미 있는 메타데이터를 추출합니다. 여기에는 제목, ID, 요약이 포함됩니다.

이 방법에 대한 자세한 내용은 다음 IBM 블로그를 참고하세요. https://developer.ibm.com/articles/awb-enhancing-llm-performance-document-chunking-with-watsonx/

오픈 소스 툴

구문 기반 청킹

구문 기반 청킹은 문서 형식을 기준으로 텍스트를 분리하기 위해 구조 기반 접근 방식을 사용합니다. 가장 일반적으로는 섹션 제목이 구분자로 사용됩니다. 그러나 인코딩된 구조 정보가 없는 문서 형식(예: PDF)의 경우 글꼴 크기를 청크를 분리하는 기준으로 사용할 수 있습니다.

강점:

  • 간단한 구현

제한 사항:

  • 알고리즘이 정보 계층 구조를 가정하기 때문에 일부 구문 표시가 누락될 수 있음

문서의 구조가 예측 가능하고 분할하기 쉽도록 깔끔하게 형식화된 경우 구문 기반 청킹이 유용할 수 있습니다.

고정 크기 청킹

고정 크기 청킹에서는 입력 데이터를 동일한 크기의 청크로 나눕니다. 이 방식은 일반적으로 토큰 수를 기준으로 미리 정의된 크기로 텍스트를 분리합니다. 이 방식은 구현과 이해가 간단하여 입력 데이터의 크기가 일정하고 예측 가능한 작업에 적합합니다.

강점:

  • 구현 및 이해가 용이함
  • 연산 효율성이 높음

제한 사항:

  • 경직되어 있으며 텍스트 컨텍스트에 맞게 조정할 수 없음
  • 텍스트의 중요한 컨텍스트 정보를 놓칠 수 있음

고정 크기 청킹은 입력 데이터가 예측 가능하고 깊은 컨텍스트가 필요하지 않은 경우에 가장 적합합니다.

from langchain.text_splitter import CharacterTextSplitter

# Example text
text = "The quick brown fox jumps over the lazy dog."

# Create a splitter for fixed size chunks
splitter = CharacterTextSplitter(chunk_size=10, chunk_overlap=0)

# Split the text
chunks = splitter.split(text)

# Print the chunks
for chunk in chunks:
 print(chunk)

시맨틱 청킹

의미 기반 청킹은 컨텍스트를 기준으로 텍스트를 분리하고 알고리즘 기법을 사용하여 의미 있는 구성 요소를 그룹화합니다. 의미 기반 청킹은 법률 문서와 같이 응답을 생성할 때 내용의 의미가 중요한 경우에 중요합니다.

강점:

  • 검색된 데이터의 정확성과 관련성이 높음
  • 청킹 과정에서 지식 베이스의 응집성 유지

제한 사항:

  • 정교한 알고리즘을 사용하는 복잡한 구현
  • 연산 비용이 더 큼

예시:

from langchain.text_splitter import RecursiveCharacterTextSplitter

# Example text
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Create a splitter for semantic chunking
splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10)

# Split the text
chunks = splitter.split(text)

# Print the chunks
for chunk in chunks:
 print(chunk)

하이브리드 청킹은 고정 크기 청킹과 의미 기반 청킹의 장점을 결합하기 위해 컨텍스트 정보와 구조 정보를 모두 사용합니다. 이 방법은 기업 지식 베이스와 같이 다양한 형식과 자료를 포함한 대규모 데이터 코퍼스가 여러 사용 사례에 걸쳐 존재하는 상황에서 가장 적합합니다.

강점:

  • 지식 베이스 구조와 컨텍스트에 기반한 유연한 청킹 기법으로 최적의 정확도와 속도 제공

제한 사항:

  • 높은 리소스 요구 사항으로 인해 구현 및 유지 관리에 더 많은 노력 필요

예시:

from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter

# Example text
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Fixed-size splitter
fixed_size_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=10)
fixed_size_chunks = fixed_size_splitter.split(text)

# Semantic splitter
semantic_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
semantic_chunks = semantic_splitter.split(text)

# Print the fixed-size chunks
print("Fixed-size chunks:")
for chunk in fixed_size_chunks:
 print(chunk)

# Print the semantic chunks
print("\nSemantic chunks:")
for chunk in semantic_chunks:
 print(chunk)

에이전틱 청킹

이 청킹 전략은 텍스트 청크가 사용될 컨텍스트를 기반으로 적절한 길이와 내용을 결정하기 위해 대규모 언어 모델(LLM)을 사용하는 방식을 포함합니다. 이 전략은 원시 텍스트에서 독립적인 진술을 추출하는 것을 의미하는 명제 개념에서 영감을 받았습니다.

이 접근 방식을 구현하기 위해 이 전략은 Langchain에서 제공하는 명제 검색 템플릿을 사용하여 텍스트에서 명제를 추출합니다. 이 명제들은 이후 LLM 기반 에이전트에 전달되며, 에이전트는 각 명제를 기존 청크에 포함할지 또는 새로운 청크를 생성해야 하는지를 결정합니다.

LLM 기반 에이전트는 현재 청크와의 관련성, 청크의 전체적인 일관성, 그리고 모델의 목표와 의도 등 다양한 요소를 고려하여 이러한 결정을 내립니다. 이 방식으로 LLM을 사용하면 일관되고 컨텍스트에 적합할 뿐 아니라 모델의 목표와 의도에도 부합하는 텍스트 청크를 생성하는 것을 목표로 합니다.

강점:

  • 자율성: LLM은 사람의 개입 없이 어떤 명제를 청크에 포함할지, 언제 새로운 청크를 생성할지를 결정할 수 있어 보다 효율적이고 확장 가능한 텍스트 생성을 가능하게 합니다.
  • 일관성: LLM은 일관되고 컨텍스트에 적합한 텍스트를 생성하도록 설계되어 생성된 청크가 의미 있고 이해하기 쉽도록 돕습니다.

제한 사항:

  • 연산 비용이 큼: LLM을 사용한 텍스트 생성은 특히 모델이 크거나 복잡할수록 많은 연산 비용이 발생할 수 있습니다. 이로 인해 특정 애플리케이션에서는 LLM 사용의 확장성과 실용성이 제한될 수 있습니다.
  • 할루시네이션: 모델이 실제 데이터나 컨텍스트가 아닌 내부 편향이나 가정에 기반해 텍스트를 생성할 때 발생할 수 있습니다.

그렇다면 이러한 기법을 사용해 문서를 어떻게 청킹할 수 있을까요? 이러한 알고리즘과 청킹 기법을 실행할 수 있는 오픈 소스 라이브러리가 많이 존재합니다. LangChain 텍스트 분할기를 사용하는 것이 좋은 시작점입니다. 사용 가능한 특정 텍스트 분할기에 대해서는 다음 문서를 참고하세요.https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/

다음 단계

IBM에서 최신 기술 패턴, 솔루션 아키텍처, 아키텍처 관련 자료를 확인하세요.

  1. IBM Architecture Center로 이동
기고자

Haneen Bakbak, Luke Major

업데이트: 2024년 11월 15일