분할기 개요
HTMLHeaderTextSplitter
제목을 기준으로 문서의 계층 구조를 보존하고자 할 때 유용합니다.
<h1>, <h2>, <h3> 등)를 기준으로 HTML 텍스트를 분할하고, 각 청크와 관련된 각 헤더에 대한 메타데이터를 추가합니다.
기능:
- HTML 요소 수준에서 텍스트를 분할합니다.
- 문서 구조에 인코딩된 컨텍스트가 풍부한 정보를 보존합니다.
- 요소별로 청크를 반환하거나 동일한 메타데이터를 가진 요소를 결합할 수 있습니다.
HTMLSectionSplitter
<section>, <div> 또는 사용자 정의 섹션과 같이 HTML 문서를 더 큰 섹션으로 분할하고자 할 때 유용합니다.- XSLT 변환을 사용하여 섹션을 감지하고 분할합니다.
- 큰 섹션의 경우 내부적으로
RecursiveCharacterTextSplitter를 사용합니다. - 글꼴 크기를 고려하여 섹션을 결정합니다.
HTMLSemanticPreservingSplitter
구조화된 요소가 청크 간에 분할되지 않도록 하여 맥락적 관련성을 보존해야 할 때 이상적입니다.
- 테이블, 목록 및 기타 지정된 HTML 요소를 보존합니다.
- 특정 HTML 태그에 대한 사용자 정의 핸들러를 허용합니다.
- 문서의 의미적 의미가 유지되도록 보장합니다.
- 정규화 및 불용어 제거 기능이 내장되어 있습니다.
적합한 분할기 선택
HTMLHeaderTextSplitter를 사용해야 하는 경우: HTML 문서를 헤더 계층 구조에 따라 분할하고 헤더에 대한 메타데이터를 유지해야 할 때HTMLSectionSplitter를 사용해야 하는 경우: 문서를 더 크고 일반적인 섹션으로 분할해야 하며, 사용자 정의 태그나 글꼴 크기를 기준으로 할 수 있을 때HTMLSemanticPreservingSplitter를 사용해야 하는 경우: 테이블과 목록 같은 의미적 요소를 보존하면서 문서를 청크로 분할해야 할 때, 이러한 요소가 분할되지 않고 맥락이 유지되도록 보장할 때
| 기능 | HTMLHeaderTextSplitter | HTMLSectionSplitter | HTMLSemanticPreservingSplitter |
|---|---|---|---|
| 헤더 기준 분할 | 예 | 예 | 예 |
| 의미적 요소(테이블, 목록) 보존 | 아니오 | 아니오 | 예 |
| 헤더에 대한 메타데이터 추가 | 예 | 예 | 예 |
| HTML 태그에 대한 사용자 정의 핸들러 | 아니오 | 아니오 | 예 |
| 미디어(이미지, 비디오) 보존 | 아니오 | 아니오 | 예 |
| 글꼴 크기 고려 | 아니오 | 예 | 아니오 |
| XSLT 변환 사용 | 아니오 | 예 | 아니오 |
예제 HTML 문서
다음 HTML 문서를 예제로 사용하겠습니다:HTMLHeaderTextSplitter 사용
HTMLHeaderTextSplitter는 “구조 인식” 텍스트 분할기로, HTML 요소 수준에서 텍스트를 분할하고 각 청크와 “관련된” 각 헤더에 대한 메타데이터를 추가합니다. 요소별로 청크를 반환하거나 동일한 메타데이터를 가진 요소를 결합할 수 있으며, (a) 관련 텍스트를 (어느 정도) 의미론적으로 그룹화하고 (b) 문서 구조에 인코딩된 컨텍스트가 풍부한 정보를 보존한다는 목표를 가지고 있습니다. 청크 파이프라인의 일부로 다른 텍스트 분할기와 함께 사용할 수 있습니다. 마크다운 파일의 MarkdownHeaderTextSplitter와 유사합니다. 분할할 헤더를 지정하려면, 아래와 같이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 헤더를 기준으로 분할하는HTMLHeaderTextSplitter는 RecursiveCharacterTextSplitter와 같이 문자 길이를 기준으로 분할을 제한하는 다른 분할기와 함께 구성할 수 있습니다.
이는 두 번째 분할기의 .split_documents 메서드를 사용하여 수행할 수 있습니다:
제한 사항
HTML 문서마다 구조적 변화가 상당히 클 수 있으며,HTMLHeaderTextSplitter는 주어진 청크에 모든 “관련” 헤더를 첨부하려고 시도하지만 때때로 특정 헤더를 놓칠 수 있습니다. 예를 들어, 이 알고리즘은 헤더가 항상 관련 텍스트 “위”의 노드, 즉 이전 형제, 조상 및 이들의 조합에 있는 정보 계층 구조를 가정합니다. 다음 뉴스 기사(이 문서 작성 당시)에서 문서는 “h1”로 태그된 최상위 헤드라인의 텍스트가 “위”에 있을 것으로 예상되는 텍스트 요소와는 별도의 하위 트리에 있도록 구조화되어 있습니다. 따라서 “h1” 요소와 관련 텍스트가 청크 메타데이터에 표시되지 않는 것을 볼 수 있습니다(그러나 해당되는 경우 “h2”와 관련 텍스트는 볼 수 있습니다):
HTMLSectionSplitter 사용
HTMLHeaderTextSplitter와 개념적으로 유사한HTMLSectionSplitter는 요소 수준에서 텍스트를 분할하고 각 청크와 “관련된” 각 헤더에 대한 메타데이터를 추가하는 “구조 인식” 텍스트 분할기입니다. HTML을 섹션별로 분할할 수 있습니다.
요소별로 청크를 반환하거나 동일한 메타데이터를 가진 요소를 결합할 수 있으며, (a) 관련 텍스트를 (어느 정도) 의미론적으로 그룹화하고 (b) 문서 구조에 인코딩된 컨텍스트가 풍부한 정보를 보존한다는 목표를 가지고 있습니다.
xslt_path를 사용하여 HTML을 변환하는 절대 경로를 제공하면 제공된 태그를 기반으로 섹션을 감지할 수 있습니다. 기본값은 data_connection/document_transformers 디렉토리의 converting_to_header.xslt 파일을 사용하는 것입니다. 이는 HTML을 섹션을 더 쉽게 감지할 수 있는 형식/레이아웃으로 변환하기 위한 것입니다. 예를 들어, 글꼴 크기를 기반으로 한 span을 헤더 태그로 변환하여 섹션으로 감지할 수 있습니다.
HTML 문자열을 분할하는 방법:
청크 크기를 제한하는 방법:
HTMLSectionSplitter는 청크 파이프라인의 일부로 다른 텍스트 분할기와 함께 사용할 수 있습니다. 내부적으로 섹션 크기가 청크 크기보다 클 때 RecursiveCharacterTextSplitter를 사용합니다. 또한 결정된 글꼴 크기 임계값을 기반으로 텍스트의 글꼴 크기를 고려하여 섹션인지 여부를 결정합니다.
HTMLSemanticPreservingSplitter 사용
HTMLSemanticPreservingSplitter는 테이블, 목록 및 기타 HTML 구성 요소와 같은 중요한 요소의 의미적 구조를 보존하면서 HTML 콘텐츠를 관리 가능한 청크로 분할하도록 설계되었습니다. 이는 이러한 요소가 청크 간에 분할되어 테이블 헤더, 목록 헤더 등과 같은 맥락적 관련성이 손실되지 않도록 보장합니다.
이 분할기는 본질적으로 맥락적으로 관련된 청크를 생성하도록 설계되었습니다. HTMLHeaderTextSplitter를 사용한 일반적인 재귀 분할은 테이블, 목록 및 기타 구조화된 요소가 중간에 분할되어 중요한 맥락을 잃고 나쁜 청크를 생성할 수 있습니다.
HTMLSemanticPreservingSplitter는 테이블과 목록과 같은 구조화된 요소를 포함하는 HTML 콘텐츠를 분할하는 데 필수적이며, 특히 이러한 요소를 그대로 보존하는 것이 중요할 때 유용합니다. 또한 특정 HTML 태그에 대한 사용자 정의 핸들러를 정의할 수 있는 기능은 복잡한 HTML 문서를 처리하는 데 다재다능한 도구입니다.
중요: max_chunk_size는 청크의 명확한 최대 크기가 아닙니다. 최대 크기 계산은 보존된 콘텐츠가 청크의 일부가 아닐 때 발생하여 분할되지 않도록 보장합니다. 보존된 데이터를 청크에 다시 추가할 때 청크 크기가 max_chunk_size를 초과할 가능성이 있습니다. 이는 원본 문서의 구조를 유지하기 위해 중요합니다.
참고:
- 코드 블록의 내용을 재구성하기 위해 사용자 정의 핸들러를 정의했습니다.
- 전처리 시 특정 HTML 요소를 분해하고 해당 내용을 제거하기 위해 거부 목록을 정의했습니다.
- 요소의 비분할을 시연하기 위해 의도적으로 작은 청크 크기를 설정했습니다.
테이블과 목록 보존
이 예제에서는HTMLSemanticPreservingSplitter가 HTML 문서 내에서 테이블과 큰 목록을 어떻게 보존할 수 있는지 보여줍니다. 청크 크기는 50자로 설정되어 분할기가 정의된 최대 청크 크기를 초과하더라도 이러한 요소가 분할되지 않도록 보장하는 방법을 설명합니다.
설명
이 예제에서HTMLSemanticPreservingSplitter는 전체 테이블과 순서 없는 목록(<ul>)이 각각의 청크 내에 보존되도록 보장합니다. 청크 크기가 50자로 설정되어 있더라도 분할기는 이러한 요소가 분할되어서는 안 된다는 것을 인식하고 그대로 유지합니다.
이는 데이터 테이블이나 목록을 다룰 때 특히 중요합니다. 콘텐츠를 분할하면 맥락이 손실되거나 혼란을 초래할 수 있기 때문입니다. 결과 Document 객체는 이러한 요소의 전체 구조를 유지하여 정보의 맥락적 관련성이 유지되도록 보장합니다.
사용자 정의 핸들러 사용
HTMLSemanticPreservingSplitter를 사용하면 특정 HTML 요소에 대한 사용자 정의 핸들러를 정의할 수 있습니다. 일부 플랫폼에는 BeautifulSoup이 기본적으로 파싱하지 않는 사용자 정의 HTML 태그가 있으며, 이 경우 사용자 정의 핸들러를 활용하여 형식 논리를 쉽게 추가할 수 있습니다.
이는 <iframe> 태그나 특정 ‘data-’ 요소와 같이 특별한 처리가 필요한 요소에 특히 유용할 수 있습니다. 이 예제에서는 iframe 태그를 마크다운 스타일의 링크로 변환하는 사용자 정의 핸들러를 만들어 보겠습니다.
설명
이 예제에서는iframe 태그를 마크다운 스타일의 링크로 변환하는 사용자 정의 핸들러를 정의했습니다. 분할기가 HTML 콘텐츠를 처리할 때 이 사용자 정의 핸들러를 사용하여 iframe 태그를 변환하면서 테이블과 목록과 같은 다른 요소를 보존합니다. 결과 Document 객체는 제공한 사용자 정의 로직에 따라 iframe이 어떻게 처리되는지 보여줍니다.
중요: 링크와 같은 항목을 보존할 때는 구분자에 .을 포함하지 않거나 구분자를 비워두도록 주의해야 합니다. RecursiveCharacterTextSplitter는 마침표로 분할하므로 링크가 반으로 잘립니다. . 을 포함하는 구분자 목록을 제공해야 합니다.
사용자 정의 핸들러를 사용하여 LLM으로 이미지 분석
사용자 정의 핸들러를 사용하면 모든 요소에 대한 기본 처리를 재정의할 수도 있습니다. 이에 대한 좋은 예는 문서 내의 이미지에 대한 의미 분석을 청크 플로우에 직접 삽입하는 것입니다. 함수는 태그가 발견될 때 호출되므로<img> 태그를 재정의하고 preserve_images를 끄면 청크에 포함하려는 모든 콘텐츠를 삽입할 수 있습니다.
설명:
HTML의<img> 요소에서 특정 필드를 추출하도록 작성된 사용자 정의 핸들러를 사용하면 에이전트를 통해 데이터를 추가로 처리하고 결과를 청크에 직접 삽입할 수 있습니다. 그렇지 않으면 <img> 필드의 기본 처리가 수행되므로 preserve_images가 False로 설정되어 있는지 확인하는 것이 중요합니다.
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.