본문 바로가기
기타

[We-Co] RAG 검색과 응답 최적화 - Chunking

by 위기의코딩맨 2025. 7. 8.
반응형

안녕하세요. 위기의 코딩맨입니다.

오늘은 RAG의 검색과 응답을 최적화하는 방법 중 하나인 Chunking에 대해서

간단하게 알아보도록 하겠습니다.

 

일단 청킹 작업은 관련 문서를 가져오는

Retrieval에서 개선할 수 있는 요소 중 하나라고 생각해주시면 됩니다.

벡터화된 문서를 검색하는 과정을 조 금더 정확하게 검색되도록 최적화 하는 방법을 알아보는 것입니다!

 

[ chunking ]

문서를 검색하려면, 해당 문서를 가공하여 최적화된 상태로 변환하는 과정이 필요합니다.

이러한 전처리 과정 중 핵심적인 과정이 청킹 입니다. 

문서를 분할하는 단계로 보시면 됩니다. 

  • 관리에 용이함
  • 검색 정확도가 높아짐
  • 일관성 유지

 

기본적으로 청킹 작업을 진행하게되면 문자 수를 기반으로 분할으로 진행됩니다.

  • 구조가 고려되지 않음
  • 중요한 정보가 분할되어 저장
  • 최적화하기 어려울수 있음

이러한 장단점이 있지만, 단점을 보안하기 위해

부모-자식 분할 방식이 있는데

해당 방식에 대해서 알아보겠습니다.

 

[ parent-child chunking ]

부모-자식 분할은 정보를 구조적으로 나누어 정확도를 높일수 있는 방법입니다.

문서의 계층 구조를 유지하면서 세부적인 내용을 저장하는 방식으로 보시면 될 것같습니다.

  1. 부모 문서로 나눈다
  2. 자식 문서로 세분화 한다.

자식 문서는 벡터 데이터 베이스에 저장되고,

부모 문서는 별도의 저장소에 원본 형태로 보관하여 진행됩니다.

 

사용자가 검색하게되면, 

자식 문서를 기반으로 유사성을 검색 ->  자식 문서가 속한 부모 문서 반환

형태로 검색이 진행됩니다.

 

간단한 Python 소스로도 설명해보겠습니다.

from lanchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.storage import InMemoryStore
from lanchain_community.bectorstores import Chroma
from lanchain_openai import OpenAIEmbeddings
from lanchain.retrievers import ParentDocumentRetriever


# 부모
parent_split = RecursiveCharacterTextSplitter(chunk_size = 1000)
# 자식
child_split = RecursiveCharacterTextSplitter(chunk_size = 200)

# 벡터 저장소
vector_store = Chroma(collection_name = 'split_parents', embedding_function = OpenAIEmbeddings())
# 부모 저장소
store = InMemoryStore()

# ParentDocumentRetriever
retriever = ParentDocumentRetriever(
	vectorstore = vector_store,
    docstore = store,
    child_splitter = child_split,
    parent_splitter = parent_split
)

# 설정한 ParentDocumentRetriever에 문서를 저장
# docs는 문서 파일
retriever.add_documents(docs)

 

위에서 설명한 내용을 그대로 코드를 만들어봤습니다.

부모, 자식을 분할하여 저장하면 구조적으로 나뉘어

검색에 대한 결과가 정확도가 높아지는 장점이 있으니, 알아두시면 좋을 것 같습니다.

반응형