딥러닝

[SpringAI] TokenTextSplitter 파라미터 텍스트 세부 분할 옵션

BEOTIZA♥ 2024. 10. 27. 12:38

TokenTextSplitter의 파라미터들이 코드에 고정된 값으로 사용되어, 문서마다 분할 설정을 유연하게 변경하기 어려웠다.

문서 크기와 내용에 따라 최적의 조각 크기를 찾기 위해 defaultChunkSize나 minChunkSizeChars와 같은 값들이 상황에 맞게 조정될 필요가 있었다. 코드 수정 없이 설정을 쉽게 관리할 방법이 필요해, 프로퍼티 파일을 통해 파라미터를 외부에서 제어할 수 있는 구조를 검토하게 되었다.

TokenTextSplitter

는 문서를 여러 조각으로 분할하여 벡터화하기 쉽게 만드는 도구다. AI 모델이 텍스트를 이해하고 처리하기 적합한 방식으로 문서를 나눌 수 있다. 주로 벡터 저장소에 삽입하기 전, 문서의 특정 길이를 기반으로 분할한다.

 

1. TokenTextSplitter 주요 파라미터

 

  • defaultChunkSize: 문서의 기본 조각 크기를 결정. 예를 들어 defaultChunkSize=1000이면 한 조각이 약 1000자 길이.
  • minChunkSizeChars: 문서 조각의 최소 문자 길이. 기본 조각 크기보다 작을 경우, 최소 문자 길이 기준에 맞추어 조각을 생성.
  • minChunkLengthToEmbed: 임베딩을 위해 요구되는 최소 길이. 이 값보다 짧은 조각은 임베딩하지 않는다.
  • maxNumChunks: 최대 조각 개수를 제한한다. 조각의 개수를 제한함으로써 저장소 용량과 검색 속도를 제어할 수 있다.
  • keepSeparator: 구분자를 유지할지 여부를 결정. true로 설정 시, 문장의 구분자와 함께 분할하여 더 자연스러운 조각을 생성.

2. 유연한 파라미터 설정의 필요성

기본 설정 값이 코드 내에서 하드코딩되면 문서 크기나 내용에 따라 조정하기 어려운 문제가 있다. 이를 해결하기 위해 프로퍼티 파일에 값을 설정하고, @Value 어노테이션을 활용해 유연하게 파라미터를 관리하도록 개선할 수 있다.

 

3. 개선된 코드 예시

아래는 파라미터를 프로퍼티 파일에서 설정하고 TokenTextSplitter 인스턴스에 반영하는 코드다.

// 기존 코드 (파라미터 미지정, 기본값 사용)

TokenTextSplitter textSplitter = new TokenTextSplitter();
List<Document> splitDocuments = textSplitter.apply(documents);

 

 

 

// 개선 코드
// TokenTextSplitter 객체를 초기화할 때 여러 파라미터를 사용하여 텍스트를 분할하는 옵션을 세밀하게 설정

// TokenTextSplitter 설정: 다양한 옵션을 통해 텍스트 조각화를 유연하게 설정
int defaultChunkSize = 1000; // 기본 조각 크기 설정
int minChunkSizeChars = 200; // 최소 조각 크기 설정
int minChunkLengthToEmbed = 50; // 임베딩할 최소 길이 설정
int maxNumChunks = 10; // 최대 조각 수 설정
boolean keepSeparator = true; // 구분자 유지 여부 설정

// TokenTextSplitter 인스턴스 생성 및 설정된 파라미터 적용
TokenTextSplitter textSplitter = new TokenTextSplitter(
        defaultChunkSize,
        minChunkSizeChars,
        minChunkLengthToEmbed,
        maxNumChunks,
        keepSeparator
);

// 문서 전체에 분할 적용
List<Document> splitDocuments = textSplitter.apply(documents);
log.info("분할된 텍스트 조각 수: {}", splitDocuments.size());​

 

  • defaultChunkSize (1000):
    기본적으로 한 번에 분할되는 텍스트의 최대 길이입니다. 즉, 문서 텍스트가 1000자 단위로 나뉘게 됩니다.
  • minChunkSizeChars (200):
    분할된 조각의 최소 문자 길이로 설정됩니다. 이 값을 통해 너무 짧은 조각은 분할되지 않도록 합니다.
  • minChunkLengthToEmbed (50):
    텍스트 조각을 임베딩(벡터화)하기 위한 최소 길이로 설정합니다. 50자보다 짧은 조각은 벡터화 대상에서 제외됩니다.
  • maxNumChunks (10):
    한 문서를 분할할 때 생성할 수 있는 최대 조각 수입니다. 예를 들어, 한 문서가 여러 조각으로 분할될 경우 최대 10개까지만 생성합니다.
  • keepSeparator (true):
    분할 시 구분자를 유지할지 여부를 설정합니다. 구분자(문장 부호 등)를 분할 조각에 남겨둠으로써 문장 간의 자연스러운 연결을 유지할 수 있습니다.

4. 마무리

Python에서는 문서 임베딩과 텍스트 분할(TextSplitter) 그리고 벡터화 및 저장 과정이 간편하게 이뤄지는 편이다. 그러나 Spring을 사용해 동일한 과정을 구현하려면 TokenTextSplitter를 설정하고 벡터화 저장소를 초기화하며, 설정을 세부적으로 관리해야 한다. 이러한 복잡성은 확장성과 통합 관리 측면에서 장점이 있지만, 초기 설정과 구성 과정에서 상당한 노력이 필요하다.