Splitter 개요
HTMLHeaderTextSplitter
문서의 heading 기반 계층 구조를 보존하고 싶을 때 유용합니다.
<h1>, <h2>, <h3> 등)를 기준으로 HTML 텍스트를 분할하고, 각 청크에 관련된 header 메타데이터를 추가합니다.
기능:
- HTML element 수준에서 텍스트를 분할합니다.
- 문서 구조에 인코딩된 풍부한 컨텍스트 정보를 보존합니다.
- 요소별로 청크를 반환하거나 동일한 메타데이터를 가진 요소들을 결합할 수 있습니다.
HTMLSectionSplitter
<section>, <div> 또는 사용자 정의된 큰 섹션 단위로 HTML 문서를 분할하고 싶을 때 유용합니다.- 섹션을 감지하고 분할하기 위해 XSLT 변환을 사용합니다.
- 내부적으로 큰 섹션에는
RecursiveCharacterTextSplitter를 사용합니다. - 섹션 판별을 위해 폰트 크기를 고려합니다.
HTMLSemanticPreservingSplitter
구조화된 요소를 청크 간에 분할하지 않도록 하여 문맥적 관련성을 보존해야 할 때 이상적입니다.
- 테이블, 리스트 및 기타 지정된 HTML 요소를 보존합니다.
- 특정 HTML 태그에 대해 커스텀 핸들러를 허용합니다.
- 문서의 시맨틱 의미가 유지되도록 보장합니다.
- 내장 정규화 및 불용어 제거
적합한 Splitter 선택하기
HTMLHeaderTextSplitter를 사용할 때: HTML 문서를 header 계층 구조에 따라 분할하고 header에 대한 메타데이터를 유지해야 할 때.HTMLSectionSplitter를 사용할 때: 사용자 정의 태그나 폰트 크기를 기반으로 문서를 더 크고 일반적인 섹션으로 분할해야 할 때.HTMLSemanticPreservingSplitter를 사용할 때: 테이블과 리스트 같은 시맨틱 요소를 보존하면서, 이들이 분할되지 않고 문맥이 유지되도록 HTML 문서를 청크로 나눠야 할 때.
| 기능 | HTMLHeaderTextSplitter | HTMLSectionSplitter | HTMLSemanticPreservingSplitter |
|---|---|---|---|
| 헤더 기반 분할 | 예 | 예 | 예 |
| 시맨틱 요소 보존(테이블, 리스트) | 아니오 | 아니오 | 예 |
| 헤더 메타데이터 추가 | 예 | 예 | 예 |
| HTML 태그용 커스텀 핸들러 | 아니오 | 아니오 | 예 |
| 미디어(이미지, 비디오) 보존 | 아니오 | 아니오 | 예 |
| 폰트 크기 고려 | 아니오 | 예 | 아니오 |
| XSLT 변환 사용 | 아니오 | 예 | 아니오 |
예제 HTML 문서
다음 HTML 문서를 예제로 사용해 보겠습니다:HTMLHeaderTextSplitter 사용하기
HTMLHeaderTextSplitter는 HTML element 수준에서 텍스트를 분할하고, 임의의 청크에 대해 “관련”된 각 header에 대한 메타데이터를 추가하는 “structure-aware” text splitter입니다. 요소별로 청크를 반환하거나 동일한 메타데이터를 가진 요소들을 결합할 수 있으며, (a) 관련 텍스트를 시맨틱하게(대략) 함께 묶고 (b) 문서 구조에 인코딩된 풍부한 컨텍스트 정보를 보존하는 것을 목표로 합니다. 청크 생성 파이프라인의 일부로 다른 text splitter와 함께 사용할 수 있습니다. 이는 markdown 파일을 위한 MarkdownHeaderTextSplitter와 유사합니다. 분할할 header를 지정하려면 아래와 같이HTMLHeaderTextSplitter를 인스턴스화할 때 headers_to_split_on을 지정하세요.
HTMLHeaderTextSplitter를 인스턴스화할 때 return_each_element=True를 지정하세요:
Document로 반환됩니다:
URL 또는 HTML 파일에서 분할하는 방법:
URL에서 직접 읽으려면 URL 문자열을split_text_from_url 메서드에 전달하세요.
마찬가지로, 로컬 HTML 파일은 split_text_from_file 메서드에 전달할 수 있습니다.
청크 크기를 제한하는 방법:
HTML header 기반으로 분할하는HTMLHeaderTextSplitter는 RecursiveCharacterTextSplitter처럼 문자 길이에 기반하여 분할을 제한하는 다른 splitter와 조합할 수 있습니다.
이는 두 번째 splitter의 .split_documents 메서드를 사용하여 수행할 수 있습니다:
제한 사항
HTML 문서마다 구조적 변이가 상당히 있을 수 있으며,HTMLHeaderTextSplitter가 임의의 청크에 모든 “관련” header를 연결하려고 시도하더라도 때로는 특정 header를 놓칠 수 있습니다. 예를 들어, 알고리즘은 header가 항상 관련 텍스트 “위”의 노드(즉, 앞선 형제, 조상, 그리고 그 조합)에 존재하는 정보 계층을 가정합니다. 다음 뉴스 기사(이 문서를 작성하는 시점 기준)에서는 문서가 최상위 헤드라인의 텍스트가 “h1”으로 태그되어 있지만, 우리가 기대하는 텍스트 요소들보다 구별되는(distinct) 서브트리에 위치해 있도록 구조화되어 있습니다. 따라서 “h1” 요소와 그에 관련된 텍스트가 청크 메타데이터에 나타나지 않음을 관찰할 수 있습니다(하지만 해당되는 경우 “h2”와 그 관련 텍스트는 보입니다):
HTMLSectionSplitter 사용하기
HTMLHeaderTextSplitter와 개념적으로 유사하게,HTMLSectionSplitter는 element 수준에서 텍스트를 분할하고 임의의 청크에 대해 “관련”된 각 header에 대한 메타데이터를 추가하는 “structure-aware” text splitter입니다. HTML을 섹션 단위로 분할할 수 있게 해줍니다.
요소별로 청크를 반환하거나 동일한 메타데이터를 가진 요소들을 결합할 수 있으며, (a) 관련 텍스트를 시맨틱하게(대략) 함께 묶고 (b) 문서 구조에 인코딩된 풍부한 컨텍스트 정보를 보존하는 것을 목표로 합니다.
xslt_path를 사용해 HTML을 변환할 절대 경로를 제공하여, 지정된 태그를 기반으로 섹션을 감지할 수 있도록 합니다. 기본값은 data_connection/document_transformers 디렉터리의 converting_to_header.xslt 파일을 사용하는 것입니다. 이는 섹션 감지를 더 쉽게 할 수 있도록 HTML을 포맷/레이아웃으로 변환하기 위함입니다. 예를 들어, 폰트 크기에 기반한 span을 header 태그로 변환하여 섹션으로 감지할 수 있습니다.
HTML 문자열을 분할하는 방법:
청크 크기를 제한하는 방법:
HTMLSectionSplitter는 청크 생성 파이프라인의 일부로 다른 text splitter와 함께 사용할 수 있습니다. 내부적으로, 섹션 크기가 청크 크기보다 큰 경우 RecursiveCharacterTextSplitter를 사용합니다. 또한 텍스트의 폰트 크기를 고려하여, 설정된 폰트 크기 임계값을 기준으로 섹션 여부를 판단합니다.
HTMLSemanticPreservingSplitter 사용하기
HTMLSemanticPreservingSplitter는 테이블, 리스트 및 기타 HTML 구성 요소와 같은 중요한 요소의 시맨틱 구조를 보존하면서 HTML 콘텐츠를 관리 가능한 청크로 분할하도록 설계되었습니다. 이를 통해 테이블 헤더, 리스트 헤더 등의 문맥적 관련성을 잃게 만드는, 요소의 청크 간 분할을 방지합니다.
이 splitter는 본질적으로 문맥적으로 관련성 높은 청크를 만들도록 설계되었습니다. HTMLHeaderTextSplitter로 일반적인 재귀 분할을 수행하면, 테이블, 리스트 및 기타 구조화된 요소가 중간에서 분할되어 중요한 컨텍스트를 잃고 좋지 않은 청크를 만들 수 있습니다.
HTMLSemanticPreservingSplitter는 특히 테이블과 리스트 같은 구조화된 요소를 포함한 HTML 콘텐츠를 분할할 때, 이 요소들을 온전히 보존하는 것이 중요할 때 필수적입니다. 또한 특정 HTML 태그에 대한 커스텀 핸들러를 정의할 수 있는 기능 덕분에 복잡한 HTML 문서를 처리하는 데 유연한 도구가 됩니다.
중요: max_chunk_size는 청크의 절대 최대 크기를 의미하지 않습니다. 보존 대상 콘텐츠가 청크에서 분리되어 있을 때 최대 크기를 계산하여 분할이 일어나지 않도록 한 후, 보존 데이터를 다시 청크에 추가하면 max_chunk_size를 초과할 수 있습니다. 이는 원본 문서의 구조를 유지하기 위해 매우 중요합니다.
참고:
- 코드 블록의 콘텐츠를 재포맷하기 위해 커스텀 핸들러를 정의했습니다.
- 특정 HTML 요소에 대한 deny 리스트를 정의하여, 전처리 단계에서 해당 요소와 그 내용을 제거했습니다.
- 요소 분할 방지 효과를 보여주기 위해 의도적으로 작은 청크 크기를 설정했습니다.
테이블과 리스트 보존
이 예시에서는HTMLSemanticPreservingSplitter가 HTML 문서 내의 테이블과 큰 리스트를 어떻게 보존하는지 보여줍니다. 청크 크기를 50자로 설정하여, 최대 정의된 청크 크기를 초과하더라도 이러한 요소가 분할되지 않도록 보장하는 방식을 설명합니다.
설명
이 예시에서HTMLSemanticPreservingSplitter는 전체 테이블과 순서 없는 리스트(<ul>)가 각자의 청크 내에서 보존되도록 합니다. 청크 크기가 50자로 설정되어 있더라도, splitter는 이러한 요소가 분할되어서는 안 된다는 것을 인식하고 그대로 유지합니다.
이는 데이터 테이블이나 리스트를 다룰 때 특히 중요합니다. 콘텐츠가 분할되면 문맥 손실이나 혼란을 초래할 수 있기 때문입니다. 결과 Document 객체는 이러한 요소의 전체 구조를 유지하여 정보의 문맥적 관련성을 보장합니다.
커스텀 핸들러 사용하기
HTMLSemanticPreservingSplitter는 특정 HTML 요소에 대한 커스텀 핸들러를 정의할 수 있습니다. 일부 플랫폼은 BeautifulSoup에서 기본적으로 파싱되지 않는 커스텀 HTML 태그를 사용합니다. 이 경우, 커스텀 핸들러를 사용하여 포맷팅 로직을 쉽게 추가할 수 있습니다.
이는 <iframe> 태그나 특정 ‘data-’ 요소처럼 특별한 처리가 필요한 요소에 유용할 수 있습니다. 이 예시에서는 iframe 태그를 Markdown 유사 링크로 변환하는 커스텀 핸들러를 만들어 보겠습니다.
설명
이 예시에서는iframe 태그를 Markdown 유사 링크로 변환하는 커스텀 핸들러를 정의했습니다. splitter가 HTML 콘텐츠를 처리할 때, 이 커스텀 핸들러를 사용하여 iframe 태그를 변환하는 동시에 테이블과 리스트 같은 다른 요소는 보존합니다. 결과 Document 객체는 여러분이 제공한 커스텀 로직에 따라 iframe이 처리되는 방식을 보여줍니다.
중요: 링크와 같은 항목을 보존할 때는 구분자에 .을 포함하지 않거나, 구분자를 비워 두지 않도록 주의해야 합니다. RecursiveCharacterTextSplitter는 마침표를 기준으로 분할하므로 링크가 절반으로 잘릴 수 있습니다. 대신 . 를 포함한 구분자 목록을 제공하세요.
커스텀 핸들러로 LLM을 사용해 이미지 분석하기
커스텀 핸들러를 사용하면 임의의 요소에 대한 기본 처리를 재정의할 수 있습니다. 좋은 예는 문서 내 이미지에 대한 시맨틱 분석을 청크 생성 흐름에 직접 삽입하는 것입니다. 함수가 태그를 발견할 때 호출되므로,<img> 태그를 재정의하고 preserve_images를 끄면 청크에 임베드하고 싶은 임의의 콘텐츠를 삽입할 수 있습니다.
설명:
HTML의<img> 요소에서 특정 필드를 추출하도록 작성된 커스텀 핸들러를 통해, 해당 데이터를 agent로 추가 처리하고 결과를 청크에 직접 삽입할 수 있습니다. preserve_images가 False로 설정되어 있는지 확인하는 것이 중요합니다. 그렇지 않으면 <img> 필드에 대한 기본 처리가 수행됩니다.
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.