콘텐츠로 이동

RAG 한국어 chunking

RAG에서 바른 형태소 분석을 활용한 한국어 chunking

RAG(검색 증강 생성) 파이프라인의 품질은 문서를 어떻게 쪼개느냐(chunking) 에서 절반이 결정됩니다. 글자 수나 문자 단위로 무작정 자르면 한국어는 명사구 중간이나 조사 한가운데가 끊겨, 검색 임베딩이 의미를 제대로 잡지 못합니다. 바른의 형태소 분석을 청크 경계 판단에 끼워 넣으면 의미 단위를 보존한 chunking 이 가능합니다.

문제 상황

고정 길이 분할은 한국어에서 다음과 같은 문제를 일으킵니다.

  • 인공지능기반자연어처리 같은 복합명사가 청크 경계에서 잘려 검색에 걸리지 않습니다.
  • 조사·어미가 앞뒤 청크에 흩어져, 임베딩 벡터가 불필요한 기능 형태소에 영향을 받습니다.
  • 문장 중간에서 끊긴 청크는 LLM에 넘겼을 때 맥락이 깨집니다.

바른을 어떻게 적용하나

바른은 어절을 체언(N)·조사(J)·용언(V)·어미(E)8대 형태 단위로 분해하고, 등재된 복합명사를 더 작은 명사로 나눠줍니다(복합명사 분해). 이 성질을 두 가지 방식으로 활용합니다.

graph TD
  DOC[원문 문서] --> SPLIT[문장 분할];
  SPLIT --> TAG[바른 형태소 분석];
  TAG --> NOUN[명사·복합명사 추출];
  NOUN --> BOUND[명사 밀도로 청크 경계 판단];
  BOUND --> CHUNK[의미 보존 청크];
  CHUNK --> EMB[임베딩·벡터 DB];
  1. 명사 기반 청크 경계: 문장 단위로 자르되, 명사가 거의 없는 짧은 문장은 앞 청크에 붙여 "내용 밀도"가 비슷한 청크를 만듭니다.
  2. 복합명사 분해 색인: 청크 본문은 그대로 두고, 검색용 키워드로는 분해된 명사를 함께 저장해 자연어처리자연어, 처리 양쪽 질의에 모두 걸리게 합니다.
from bareunpy import Tagger

# API KEY는 https://bareun.ai 에서 발급("koba-...")
tagger = Tagger("koba-XXXX-...", "localhost")

def chunk_keywords(sentence: str):
    """문장에서 청크 색인용 명사 키워드를 뽑습니다."""
    res = tagger.tags([sentence])
    # nouns()는 체언(NNG, NNP 등)만 돌려줍니다.
    return res.nouns()

text = "인공지능기반 자연어처리 기술은 검색 품질을 크게 높입니다."
print(chunk_keywords(text))
['인공지능', '기반', '자연어', '처리', '기술', '검색', '품질']

복합명사 자연어처리자연어처리로 분해되어, 사용자가 어느 쪽으로 검색해도 매칭됩니다.

결과와 이점

방식 청크 경계 검색 재현율
고정 길이 분할 글자 수 기준(의미 무시) 낮음
문장 분할만 문장 끝 기준 보통
바른 명사 기반 명사 밀도 + 복합명사 분해 높음

정리

바른으로 명사를 뽑아 청크 경계를 잡고 복합명사를 분해해 색인하면, 검색 단계에서 더 정확하게 관련 청크를 찾아 LLM에 넘길 수 있습니다.

자주 묻는 질문

Q. 청크 본문까지 형태소로 바꿔야 하나요?

아니요. 본문은 원문 그대로 두는 것이 좋습니다. LLM은 자연스러운 문장에서 더 잘 답합니다. 형태소 분석 결과는 검색용 키워드·색인에만 활용하세요.

Q. 복합명사가 너무 잘게 쪼개지면 어떻게 하나요?

자연어처리처럼 한 단어로 다뤄야 하는 용어는 사용자 사전의 복합명사 사전에 등록하면 하나의 명사로 유지됩니다. 분해가 필요한 경우만 복합명사 분리 사전에 ^로 분리 지점을 표시하세요.

Q. 긴 문서도 처리되나요?

네. 문장 단위로 나눠 tags()에 넘기면 됩니다. 위치 정보가 필요하면 입력 순서를 보존하는 AnalyzeSyntaxList 계열을 사용하세요.

관련 문서

Q. 한국어 RAG에 굳이 형태소 분석기를 써야 하나요? LLM 토크나이저로 안 되나요?

LLM 토크나이저는 의미가 아니라 빈도 기반 서브워드로 텍스트를 쪼개므로, 한국어 명사구나 복합명사의 경계와 맞지 않습니다. 바른 형태소 분석은 어절을 8대 형태 단위로 분해하고 복합명사를 분리해 줘서, 청크 경계와 검색 키워드를 의미 단위로 맞출 수 있습니다. 두 가지를 함께 쓰는 것이 검색 품질에 가장 좋습니다.

도움이 되었나요?