문서 변환기
LangChain의 문서 변환기는 주로 텍스트 내용을 세분화하여 대량의 기사를 여러 작은 콘텐츠 단편으로 분할하는 기능을 수행합니다. 이는 대형 모델이 보통 프롬프트의 길이에 제한을 두기 때문에 모든 내용을 AI에 전달할 수 없기 때문입니다. 일부 대형 모델은 매우 긴 프롬프트 길이를 허용하지만, 비용적인 측면에서는 너무 긴 콘텐츠를 AI에 전달하는 것이 현실적이지 않습니다. 어떤 경우에는 길이가 더 길어질수록 API 호출 비용이 더 높아지기 때문입니다 (로컬에 배포된 오픈 소스 모델의 경우에도 긴 콘텐츠는 더 많은 GPU 메모리를 필요로 하고 추론 속도가 느려집니다). 합리적인 접근 방법은 AI 모델을 요청할 때 백그라운드 정보와 프롬프트로 사용할 관련 콘텐츠 단편을 연결하는 것입니다.
LangChain은 쉽게 문서 콘텐츠를 분할, 결합 및 필터링할 수 있는 많은 내장 문서 변환기를 보유하고 있습니다.
텍스트 분할기
대량의 텍스트를 처리할 때 텍스트를 청크로 나눠야 합니다. 간단한 것처럼 들릴 수 있지만, 이곳에는 많은 잠재적인 복잡성이 존재합니다. 이상적으로는 의미론적으로 연결된 텍스트 세그먼트를 함께 유지하고 싶습니다. "의미론적으로 관련된"이란 여기서는 텍스트의 유형에 따라 달라질 수 있습니다.
높은 수준에서 텍스트 분할기는 다음과 같은 방식으로 작동합니다:
- 텍스트를 작고 의미 있는 블록(보통 문장)으로 나눕니다.
- 이러한 작은 블록을 특정 크기까지 결합하여 큰 블록을 만듭니다 (어떤 기능에 의해 측정됨).
- 이 크기에 도달하면 블록을 자체 텍스트 세그먼트로 취급하고 일정한 중첩으로 새로운 텍스트 블록을 만들어서 (블록 간의 연속성을 유지하기 위해) 맥락을 유지합니다.
따라서 텍스트 분할기를 두 가지 다른 축을 따라 사용자 정의할 수 있습니다:
- 텍스트를 어떻게 나눌 것인가
- 블록의 크기를 어떻게 측정할 것인가
예시
기본 권장 텍스트 분할기는 RecursiveCharacterTextSplitter입니다. 이 텍스트 분할기는 문자 목록을 받습니다. 첫 번째 문자를 기준으로 블록을 생성하려고 시도하지만, 블록이 너무 크면 다음 문자로 계속 이동하게 됩니다. 기본적으로 분할을 시도하는 문자는 ["\\n\\n", "\\n", " ", ""]
입니다.
분할 가능한 문자를 제어하는 것 외에도 여러 가지 다른 사항을 제어할 수 있습니다:
-
length_function
: 블록의 길이를 어떻게 계산할 것인가. 기본적으로 문자 수만 카운트하지만 여기에는 토큰 카운터가 자주 전달됩니다. -
chunk_size
: 블록의 최대 크기 (길이 함수에 의해 측정됨). -
chunk_overlap
: 블록 간의 최대 중첩. 일부 중첩을 유지하면 블록 간의 연속성을 유지하는 데 도움이 됩니다 (예: 슬라이딩 창 수행). -
add_start_index
: 참조 원본 문서에서 각 블록의 시작 위치를 메타데이터에 포함할 것인가.
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='..ignored text..' metadata={'start_index': 0}
page_content='..ignored text..' metadata={'start_index': 82}
기타 변환:
중복 문서 필터링, 문서 번역, 메타데이터 추출 및 기타
문서를 분할하는 것 외에도 문서 콘텐츠에 대해 다른 변환 작업을 수행할 수 있습니다. 'EmbeddingsRedundantFilter'를 사용하여 유사한 문서를 식별하고 중복 콘텐츠를 필터링할 수 있습니다. doctran과 같은 통합을 통해 한 언어에서 다른 언어로 문서를 번역하거나 필요한 속성을 추출하여 메타데이터에 추가하거나 대화를 Q/A 형식의 문서 세트로 변환하는 작업을 수행할 수 있습니다.