LLM 엔지니어링7장 · 자체 임베딩과 벡터DB, 검색 품질8 / 22← 이전목차다음 →MetaContents

7장. 자체 임베딩과 벡터DB, 검색 품질

문서 나누기(청킹)

피자를 나눌 때 너무 잘게 자르면 토핑이 흩어지고, 너무 크게 자르면 한 조각을 들기 어렵습니다. 문서 조각도 너무 작으면 뜻이 끊기고, 너무 크면 여러 주제가 섞여 임베딩이 흐려집니다.

너무 작게, 알맞게, 너무 크게 나눈 조각을 견준 세 카드

왼쪽은 너무 작게 나눠 문장이 반으로 갈라진 조각, 가운데는 주제 하나가 한 조각에 든 알맞은 조각, 오른쪽은 주제 서너 개가 한 조각에 섞인 큰 조각입니다. 큰 조각의 임베딩은 여러 주제의 평균이 되어, 어느 질문과도 어중간하게 가까워집니다. 여기서 피자 조각이 문서 조각, 토핑이 그 안의 주제입니다.

나누는 방법과 크기

방법예좋은 점아쉬운 점
구조(제목, 조항) 단위## 제목 마다주제 하나가 한 조각구조가 없는 문서에는 못 쓴다
글자 수 단위100글자, 300글자마다어디에나 쓴다주제가 갈라지거나 섞인다
겹쳐 자르기100글자, 30글자 겹침갈라진 곳을 살린다조각 수가 는다
문장 단위로 묶기문장 3~5개씩문장이 잘리지 않는다주제 경계와 어긋날 수 있다

제목 단위로 나누기

이 장의 IT 지원 안내는 ## 제목 으로 주제가 나뉘어 있어 제목에서 끊습니다.

Python
text = "# 안내\n소개\n\n## 계정 잠김\n5번 틀리면 잠깁니다.\n\n## 보안 인쇄\n사원증을 대야 나옵니다.\n"
# "\n## " 에서 나누고 맨 앞(문서 제목과 소개)은 뺀다. 나눌 때 사라진 "## " 는 다시 붙인다
chunks = ["## " + s.strip() for s in text.split("\n## ")[1:]]
print(chunks)

['## 계정 잠김\n5번 틀리면 잠깁니다.', '## 보안 인쇄\n사원증을 대야 나옵니다.'] 이 나옵니다. 제목을 조각 안에 남겨 두면 제목의 낱말도 임베딩에 들어갑니다.

코드에 나오는 함수

코드쉬운 뜻
text.split("\n## ")줄바꿈 뒤에 ## 가 오는 곳마다 글을 자른다. 자른 자리의 \n## 는 사라진다
[1:]잘린 조각 가운데 맨 앞(문서 제목과 소개)을 빼고 나머지만 남긴다
s.strip()조각 앞뒤의 빈칸과 줄바꿈을 지운다
"## " + ...자를 때 사라진 ## 를 다시 붙여 제목 줄을 되살린다

이 코드가 뜻하는 것

피자를 미리 그어 둔 칼집을 따라 자르는 것과 같습니다. 여기서 칼집이 ## 제목 줄, 피자 조각이 문서 조각입니다.

줄하는 일쉽게 말하면
text = "# 안내\n소개\n\n## 계정 잠김..."제목 둘이 든 짧은 문서칼집이 두 줄 난 피자
text.split("\n## ")제목 앞에서 자른다. 결과는 "소개", "계정 잠김…", "보안 인쇄…" 세 조각이다칼집을 따라 자른다
[1:]맨 앞의 소개 부분을 뺀다가장자리 빵 부분은 덜어 낸다
"## " + s.strip()조각을 다듬고 제목 표시를 다시 붙인다조각마다 이름표를 꽂는다

결과 두 조각은 각각 주제 하나만 담고 있습니다. 이것이 그림 가운데 "알맞게" 나눈 조각입니다.

글자 수로 겹쳐 자르기

제목이 없는 글은 글자 수로 자릅니다. 표의 "겹쳐 자르기"가 어떻게 되는지 14글자짜리 글을 5글자씩 잘라 봅니다.

Python
text = "가나다라마바사아자차카타파하"          # 14글자짜리 글
size, overlap = 5, 2
step = size - overlap                             # 다음 조각은 3글자 뒤에서 시작
chunks = [text[i:i + size] for i in range(0, len(text), step)]
print("겹침 없이:", [text[i:i + size] for i in range(0, len(text), size)])
print("2글자 겹침:", chunks)
출력
겹침 없이: ['가나다라마', '바사아자차', '카타파하']
2글자 겹침: ['가나다라마', '라마바사아', '사아자차카', '차카타파하', '파하']
결과읽는 법
겹침 없이 3조각5글자마다 끊어서 "마"와 "바" 사이처럼 경계가 딱 잘립니다. 문장이 거기서 끊기면 뜻이 반으로 갈라집니다
2글자 겹침 5조각다음 조각이 앞 조각의 끝 두 글자("라마")를 다시 품고 시작합니다. 경계에 걸린 글이 어느 한 조각에는 온전히 남습니다
끝의 "파하"마지막은 남은 글자만큼 짧은 조각이 됩니다. 너무 짧은 꼬리는 앞 조각에 붙이기도 합니다

겹쳐 자르면 같은 14글자인데 조각이 3개에서 5개로 늘었습니다. 표의 "조각 수가 는다"가 이것입니다.

주의할 점

  • 알맞은 크기는 문서와 임베딩 모델마다 다르므로 여러 크기로 나눠 검색 품질을 재 보고 고릅니다(실습 5).
  • 조각이 너무 크면 검색은 되어도 LLM 에 붙일 글이 길어집니다. 검색 단위와 LLM 에 붙일 단위를 따로 정하기도 합니다(작은 조각으로 찾고, 그 조각이 든 큰 단락을 붙인다).
← 이전 절7장 · FAISS 와 Chroma다음 절 →7장 · 검색 품질 평가