웹 크롤링과 문서 인덱싱 영역에서는 검색 성능과 관련성을 최적화하기 위해 효과적인 청킹 방법론이 매우 중요합니다. HTML 웹 페이지나 PDF를 처리할 때 사용하는 전략은 검색 애플리케이션의 효율성과 정확도에 큰 영향을 미칠 수 있습니다. 다음은 특히 Elasticsearch를 벡터 스토어로 사용하는 환경에서 다양한 상황에 적용할 수 있는 효과적인 청킹 방법론에 대한 종합 가이드입니다.
웹 페이지는 크기와 구조가 매우 다양합니다. 효율적인 처리를 위해 다음을 고려합니다.
웹 크롤링에 오래된 HTML 코드가 포함되는 경우 Elasticsearch 인덱싱을 위해 추출되는 청크의 품질에 상당한 영향을 줄 수 있습니다. 다음은 주요 과제와 완화 전략입니다.
비표준 태그 및 속성:
중첩 및 사용 중단된 요소:
인라인 스타일 및 서식:
일관성 없는 문서 구조:
인코딩 및 문자 문제:
스크립트 및 동적 콘텐츠:
Elasticsearch 인덱싱을 위한 웹 크롤링 과정에서 오래된 HTML 코드가 청크 품질에 미치는 영향을 완화하려면 다음 전략을 고려하세요.
이러한 과제를 사전에 해결하면 오래된 HTML 페이지에서 추출되는 콘텐츠 청크의 품질을 향상시킬 수 있으며, 그 결과 Elasticsearch 기반 검색 애플리케이션의 전반적인 효과성과 관련성을 높일 수 있습니다.
요약하면 웹 크롤링 또는 PDF 인덱싱과 함께 Elasticsearch를 사용할 때의 최적의 청킹 전략은 콘텐츠를 관리 가능한 단위(문서, 페이지, 섹션)로 분해하여 인덱싱과 쿼리에서 세분성과 효율성의 균형을 맞추는 것입니다. 콘텐츠 소스의 특성(예: 웹 페이지와 PDF)과 검색 애플리케이션의 특정 요구 사항에 따라 전략을 조정하십시오. 이러한 방법론을 구현하면 검색 엔진의 성능과 정확도를 향상시키고 사용자에게 더 관련성 높고 정확한 결과를 제공할 수 있습니다.
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을 사용하면 일관되고 컨텍스트에 적합할 뿐 아니라 모델의 목표와 의도에도 부합하는 텍스트 청크를 생성하는 것을 목표로 합니다.
강점:
제한 사항:
그렇다면 이러한 기법을 사용해 문서를 어떻게 청킹할 수 있을까요? 이러한 알고리즘과 청킹 기법을 실행할 수 있는 오픈 소스 라이브러리가 많이 존재합니다. LangChain 텍스트 분할기를 사용하는 것이 좋은 시작점입니다. 사용 가능한 특정 텍스트 분할기에 대해서는 다음 문서를 참고하세요.https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/
업데이트: 2024년 11월 15일