AISmarteasy – 시맨틱 커널 포크로 개발하기 5c-1 – Worker – Memory – Chunking Strategies

llm은 훈련 되지 않은 데이터를 프롬프트에 담아 전달 받기 때문에, 어떤 데이터를 포함하느냐에 따라 답변이 달라질 수 있다. 프롬프트와 답변 텍스트 길이는 비용 청구 기준으로 사용되기도 한다.

llm 훈련에 사용되지 않은 데이터를 효과적으로 처리하는 방식으로 벡터 데이터베이스가 등장했다. 벡터 데이터베이스는 다뤄야 하는 텍스트 별로 임베딩 처리하기 때문에 한 번에 임베딩 하는 텍스트 양은 중요하다. 100쪽 pdf를 한 번에 읽어 임베딩 했다면, 쿼리 결과도 100쪽 텍스트가 나온다.

하나의 문서는 크게는 하나의 주제를 다루고 있지만, 알려주려고 하는 것은 여러 개 있을 수 있다. 알려주려고 하는 것이 문서의 여러 부분에 흩어져 있을 수 있다.

llm 연동 ai 애플리케이션은 비용이나 답변 품질을 위해, llm 훈련에 사용되지 않은 텍스트 분할에 대해 고민할 수 밖에 없다. 

 

하나의 텍스트를 좀 더 작게 나누는 것을 llm에서는 chunking이라 한다.

 

 

Chucking 전략

문서는 작성 이유나 작성자에 따라 그 크기가 달라질 수 있고 파일로 관리된다. 문서와 문서 파일이 구분되어야 한다. 

하나의 문서 파일을 여러 문서들로 나눌 수 있다. 이런 경우 나누어진 문서들은 어떤 파일을 출처로 하는 지가 추가적으로 관리되어야 할 수 있다. 추가적인 메타데이터(additional metadata).

 

llm 관련 대부분이 새로운 것이지만, Chunking은 그 중에서도 새로운 분류다.

지금은 초기 단계고 아직 최적의 방법이 등장하지 않았지만, ai 가 잘하는 것이 시행 착오의 반복을 통한 개선이니 이 분야도 ai를 활용해서 더 좋은 방법을 꾸준히 찾아 나갈 것이다.  이런 방법 중 이미 제시된 제시되고 있는 것으로 작은 방법들을 주어지면 이를 조합해서 가장 적당한 방법을 찾아내는 것과 목표를 주고 스스로 방법을 찾도록 하는 방법이 있다.

프롬프트에 대한 응답을 보고 프롬프트를 바꿔가는 과정이 있듯이, chunk 전략도 바꿔가는 과정이 필요해 보인다. chunk playground.

 

지킬 수 밖에 없다면 따라야 한다. 1. llm 서비스들의 텍스트 크기 제약은 무조건 따라야 한다. 이 제약에 따라 텍스트를 분할해야 한다.

의미를 전달하는 텍스트는 최소한 한 문자 이상으로 된 단어다. llm에서는 문자를 다루기 위해 토큰 개념을 등장 시킨다. llm에서는 텍스트 길이를 문자 수와 비슷하지만 조금 다른, 토큰 수로 다루고 이것의 개수를 제약 한다.

 

2. 문장과 문단으로 분리

사람들은 의미 전달을 위한 기본 단위로 문장을 사용한다. 여러 문장들로 문단을 만든다.

llm의 토큰 수 제약이 좀 느슨해지면, 이런 기준을 사용할 수 있다. llm 서비스들은 점점 더 많은 토큰 수를 허용해가고 있다.  문장이나 문단을 나누는 기준은 문서 작성 소프트웨어들이 갖고 있다. 그렇지 않은 경우는 텍스트 분할 기능을 만들어야 한다.

문장이나 문단을 나누는 기준은 언어 마다 다를 수 있지만, 우리는 다음과 같은 기준을 사용한다.

  • 문장  – “.” (마침표)
  • 문단 – “\n\n” (new line 두 번)

문장이나 문단은 아니지만, 문서에서 독립적으로 다루고 싶은 것은 다음과 같은 토큰 들을 사용한다.

  • “\n”  (new line)
  • ”    ” (여러 개의 공백 문자들)
  • “[characters]” (” “로 구분된 문자열)

 

문서 파일로 작성된 경우 파일 단위로 chuck할 수도 있고, 문장이나 문단으로 chunk할 수도 있다. chunk가 클 수도 있고 작을 수도 있다. llm의 토큰 제약이 없고, 비용 차이가 없다 해도, 무한정 긴 데이터를 포함한 프롬프트에 llm이 잘 따르게 할 수는 없다. 지시한 내용과 관련이 없는 내용을 잔뜩 준다고 해도 llm이 알아서 척척 한다면 이런 고민도 없어지겠지만 아직은 아니다. 지시 내용과 관련된 내용은 문서의 여기 저기에 있을 수도 있다. 작게 나누면 관련 내용을 모아야 하는 문제가 생기고, 크게 나누면 내용과 관련 없는 것들이 llm 응답의 소음으로 작용할 수 있다.

이런 이유로 chunk할 때는  의미를 갖는 단위로 나누고(보통은 문장), 3. 의미가 가까운 것(임베딩 해 보면 알 수 있다)들을 합치기가 필요하다.

 

4. 구조화된 데이터 분리

HTML이나 마크다운은 이미 구조화되어 있으니, 이 형식으로 작성된 것들은 이들 구조에 따라 분리하면 된다.

 

 

llm이 일상적으로 사용될 쯤 되면, llm 훈련에 사용하지 않은 데이터를 포함하는 문서 파일 작성 시에는, 어떤 단위로 파일을 작성해야 하는 지에 대한 가이드가 등장할 것 같다. 분리 기준으로 사용할 메타 데이터를 문서 작성할 때 작성해야 할 수도 있을 것 같다.

About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*