문서 변환을 위한 LangChain 텍스트 분할기 활용: 문서 조각화 및 대형 언어 모델 최적화 방법

GoGoComputer·2024년 10월 30일
0

LangChain Basics

목록 보기
15/40
post-thumbnail

안녕하세요! 문서 변환기(Document Transformer)에 대한 강의에 오신 것을 환영합니다.

이번 강의에서는 긴 문서를 어떻게 작은 조각으로 분할하여 대형 언어 모델(LLM)에서 효과적으로 활용할 수 있는지 알아보겠습니다. 특히 LangChain 라이브러리의 텍스트 분할기(Text Splitter)를 사용하여 문서를 처리하는 방법을 자세히 살펴볼 것입니다.

왜 문서를 분할해야 할까요?

대형 언어 모델(LLM)은 입력 토큰의 수에 제한이 있습니다. 예를 들어, OpenAI의 최신 모델은 한 번에 최대 약 8,000개의 토큰을 처리할 수 있습니다. 이는 약 6,000단어에 해당합니다. 따라서 이보다 더 긴 문서를 모델에 입력하려면 문서를 적절히 분할해야 합니다.

또한, 전체 문서를 한 번에 모델에 입력하는 것보다 사용자의 질문과 관련된 부분만을 추출하여 모델에 제공하는 것이 더 효율적입니다. 이를 위해 문서를 작은 조각으로 분할하고, 각 조각을 벡터 임베딩하여 유사성을 비교함으로써 관련된 부분을 찾을 수 있습니다.

LangChain의 텍스트 분할기(Text Splitter)

LangChain은 문서를 효율적으로 분할하기 위한 여러 가지 도구를 제공합니다. 그 중에서도 텍스트 분할기는 문서를 특정 기준에 따라 작은 조각으로 나눌 수 있게 해줍니다.

1. 문자 기반 분할기(CharacterTextSplitter)

문자 기반 분할기는 문서를 특정 문자나 문자열(예: 두 개의 줄 바꿈 문자 '\n\n')을 기준으로 분할합니다. 기본적으로는 약 1,000개의 문자 크기로 분할하며, 이는 설정에 따라 변경할 수 있습니다.

예를 들어, 두 개의 줄 바꿈 문자를 기준으로 문서를 분할하면 문서의 각 단락이나 섹션을 기준으로 분할할 수 있습니다.

2. 토큰 기반 분할기(TokenTextSplitter)

LLM은 입력 토큰의 수에 제한이 있으므로, 토큰의 수를 기준으로 문서를 분할하는 것이 유용합니다. 토큰 기반 분할기는 문서를 지정된 토큰 수에 맞춰 분할합니다.

이를 위해 OpenAI의 tiktoken 라이브러리를 사용하여 문서를 토큰화하고, 원하는 토큰 크기에 맞춰 분할합니다.

실제 예제

이제 실제로 코드를 통해 어떻게 문서를 분할하는지 살펴보겠습니다.

준비 작업

먼저 필요한 라이브러리를 설치하고, 환경 변수를 설정합니다.

# 필요한 라이브러리 설치
!pip install langchain openai tiktoken python-dotenv

# .env 파일에서 API 키 로드
from dotenv import load_dotenv
load_dotenv()

.env 파일에는 다음과 같이 OpenAI API 키를 저장합니다.

OPENAI_API_KEY=your_openai_api_key_here

문서 불러오기

예제로 사용할 문서는 1944년 프랭클린 D. 루즈벨트 대통령의 연두교서(State of the Union)입니다.

# 텍스트 파일 열기
with open('some_data/FDR_State_of_Union_1944.txt', 'r', encoding='utf-8') as file:
    speech_text = file.read()

# 문서의 전체 길이(문자 수) 확인
print(f"문서의 전체 길이(문자 수): {len(speech_text)}")

# 문서의 단어 수 확인
print(f"문서의 단어 수: {len(speech_text.split())}")

문자 기반 분할기 사용하기

from langchain.text_splitter import CharacterTextSplitter

# 문자 기반 분할기 생성
text_splitter = CharacterTextSplitter(
    separator="\n\n",  # 두 개의 줄 바꿈 문자를 기준으로 분할
    chunk_size=1000,   # 각 조각의 최대 문자 수
    chunk_overlap=0    # 중첩 없이 분할
)

# 문서 분할
texts = text_splitter.create_documents([speech_text])

# 분할된 문서의 개수 확인
print(f"분할된 문서의 개수: {len(texts)}")

# 첫 번째 분할된 문서 확인
print("\n첫 번째 분할된 문서 내용:")
print(texts[0].page_content)

토큰 기반 분할기 사용하기

from langchain.text_splitter import TokenTextSplitter

# tiktoken 인코더 사용을 위한 준비
import tiktoken

# 토큰 기반 분할기 생성
tokenizer = tiktoken.get_encoding('gpt2')  # 사용하려는 모델의 토크나이저 지정
text_splitter = TokenTextSplitter(
    encoding_name='gpt2',  # 모델의 인코딩 이름
    chunk_size=500,        # 각 조각의 최대 토큰 수
    chunk_overlap=0        # 중첩 없이 분할
)

# 문서 분할
texts = text_splitter.create_documents([speech_text])

# 분할된 문서의 개수 확인
print(f"분할된 문서의 개수: {len(texts)}")

# 첫 번째 분할된 문서 확인
print("\n첫 번째 분할된 문서 내용:")
print(texts[0].page_content)

응용 분야

분할된 문서는 벡터 스토어(예: ChromaDB)에 임베딩되어 저장될 수 있으며, 사용자의 질문과 유사한 문서 조각을 효율적으로 검색할 수 있습니다. 이를 통해 LLM에 필요한 컨텍스트를 제공하고, 보다 정확한 답변을 생성할 수 있습니다.

전체 실습 코드

아래는 위에서 설명한 내용을 모두 포함한 전체 코드입니다.

# 필요한 라이브러리 설치
# !pip install langchain openai tiktoken python-dotenv

# .env 파일에서 API 키 로드
from dotenv import load_dotenv
load_dotenv()

import os
import tiktoken
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter

# OpenAI API 키 설정
import openai
openai.api_key = os.getenv('OPENAI_API_KEY')

# 텍스트 파일 열기
with open('some_data/FDR_State_of_Union_1944.txt', 'r', encoding='utf-8') as file:
    speech_text = file.read()

# 문서의 전체 길이(문자 수) 확인
print(f"문서의 전체 길이(문자 수): {len(speech_text)}")

# 문서의 단어 수 확인
print(f"문서의 단어 수: {len(speech_text.split())}")

# 문자 기반 분할기 생성
char_text_splitter = CharacterTextSplitter(
    separator="\n\n",  # 두 개의 줄 바꿈 문자를 기준으로 분할
    chunk_size=1000,   # 각 조각의 최대 문자 수
    chunk_overlap=0    # 중첩 없이 분할
)

# 문자 기반으로 문서 분할
char_texts = char_text_splitter.create_documents([speech_text])

# 분할된 문서의 개수 확인
print(f"\n[문자 기반 분할] 분할된 문서의 개수: {len(char_texts)}")

# 첫 번째 분할된 문서 확인
print("\n[문자 기반 분할] 첫 번째 분할된 문서 내용:")
print(char_texts[0].page_content)

# 토큰 기반 분할기 생성
token_text_splitter = TokenTextSplitter(
    encoding_name='gpt2',  # 모델의 인코딩 이름
    chunk_size=500,        # 각 조각의 최대 토큰 수
    chunk_overlap=0        # 중첩 없이 분할
)

# 토큰 기반으로 문서 분할
token_texts = token_text_splitter.create_documents([speech_text])

# 분할된 문서의 개수 확인
print(f"\n[토큰 기반 분할] 분할된 문서의 개수: {len(token_texts)}")

# 첫 번째 분할된 문서 확인
print("\n[토큰 기반 분할] 첫 번째 분할된 문서 내용:")
print(token_texts[0].page_content)

코드 설명

  • 라이브러리 설치 및 로드: 필요한 패키지를 설치하고, .env 파일에서 OpenAI API 키를 로드합니다.
  • 문서 불러오기: 예제 문서를 텍스트로 불러옵니다.
  • 문서 정보 출력: 문서의 전체 길이(문자 수)와 단어 수를 출력하여 문서의 크기를 확인합니다.
  • 문자 기반 분할: CharacterTextSplitter를 사용하여 문서를 문자 수와 특정 구분자(두 개의 줄 바꿈 문자)를 기준으로 분할합니다.
  • 토큰 기반 분할: TokenTextSplitter를 사용하여 문서를 토큰 수를 기준으로 분할합니다. 이를 위해 tiktoken 라이브러리의 토크나이저를 사용합니다.
  • 결과 출력: 분할된 문서의 개수와 첫 번째 분할된 문서의 내용을 출력하여 분할 결과를 확인합니다.

결론

문서를 효과적으로 분할함으로써 대형 언어 모델에서의 활용성을 높일 수 있습니다. 분할된 문서를 벡터화하여 임베딩하고, 사용자 쿼리와의 유사성을 비교함으로써 필요한 컨텍스트를 모델에 제공할 수 있습니다.

이러한 방법은 문서 요약, 질의 응답 시스템, 챗봇 등 다양한 NLP 응용 분야에서 유용하게 활용될 수 있습니다.


이상으로 문서 변환기와 텍스트 분할기에 대한 자세한 설명과 실습 코드를 제공해드렸습니다. 이 코드를 기반으로 다양한 문서를 처리하고, 원하는 방식으로 모델에 활용해보시길 바랍니다.

profile
IT를 좋아합니다.

0개의 댓글