관심분야/생성형AI

Parent Child Chunking

을량 2025. 2. 18. 18:38

조대협님이 LLM까지 하실줄이야 너무 좋은자료라 공유한다. RAG의 저장방법은 이게 답일듯... 부분발췌

Langchain을 이용한  LLM 애플리케이션 개발 #9 - RAG를 이용한 문서 참조. 문서 저장하기

출처: https://bcho.tistory.com/1415 [조대협의 블로그:티스토리]

 

Parent Child Chunking

문서들을 작은 Chunk 단위로 나눠서 벡터 임베딩 데이터베이스 (Vector Embedding DB)에 저장하는 과정은 같다. 이때, 필드에 임베딩과 문장의 내용을 저장하는 것이 아니라, 이 문장이 속해 있는 문서의 인덱스를 저장한다. 각 문서는 redis나 DB, 파일 시스템등에 저장해놓는다.

<그림. 부모/자식 검색 구조를 위해서 임베딩과 원본 문서를 분리 저장하는 구조>

다음으로 문서를 검색할때는 벡터 임베딩 데이터 베이스에서 해당 문장과 유사한 문장을 찾은 후에, 저장된 문서의 인덱스 값을 이용하여, redis에서 문서 전체를 추출한 후, 이 문서 전체 내용을 LLM 프롬프트에 컨텍스트로 사용하여 질의하는 방식이다.

<그림. 부모 문서를 검색해서 LLM 프롬프트에 삽입하는 구조>

Chunk summarization

다른 방식으로는 문서를 문단 단위로 잘라낸 다음에, 일정 크기 이하로 요약하는 방법이다. 즉 Context-Aware Chunking(시멘틱청킹으로 이해하자)을 이용하여, 문단을 추출한후, LLM을 통하여 OOO자 이하로 요약을 하게 한 후에, 이 요약된 문장으로 임베딩 인덱스를 만드는 방법이다.

문장이 중간에 잘리지 않는 장점이 있지만 반대로 요약 과정에서 정보가 유실될 수 있는 단점이 있다. 

 

Context-Aware Chunking

텍스트를 의미 있는 단위로 나누는 방법인데, 단순히 길이나 구분자로 나누는 것이 아니라 문맥을 고려하여 나누는 방식입니다.

간단한 예시로 설명하면:

1. 일반적인 chunking:

"나는 오늘 학교에 갔다. 점심을 먹었다. 친구를 만났다."

→ 단순히 문장 단위로 나누기

2. Context-Aware Chunking:

"나는 오늘 학교에 갔다. 점심을 먹었다. 친구를 만났다."

→ "나는 오늘 학교에 갔다. 점심을 먹었다." (학교에서의 활동)

→ "친구를 만났다." (사회적 활동)

 

Extract candidate question
요약과 유사하게 문서 (문장도 가능)를 LLM에 컨택스트로 제공한후, 해당 문서(또는 문장)에서 예상되는 질문 N개를 추출하도록 한후에, 이 질문으로 임베딩 인덱스를 생성하는 방법이다.
이 방법은 챗봇이나 Q&A 시스템등에 효율적으로 사용될 수 있다.