Knowledge Graph로 구동되는 RAG 애플리케이션에서 부모-자식 관계, 질문 기반, 주제 요약과 같은 그래프 데이터 모델을 사용하는 경우를 알아볼까요?

Retrieval-Augmented Generation(RAG) 애플리케이션을 구축할 때 문서를 벡터 또는 Graph Database에 넣고, 임베딩을 생성하고, 코사인 유사성을 실행하고 싶은 유혹이 들 수 있어요.
이 글에서는 이러한 애플리케이션을 향상시키는 데 사용할 수 있는 몇 가지 대체 그래프 데이터 모델과 각 모델이 제공하는 고유한 이점에 대해 설명할게요. 이 글을 읽기 전에 여러분이 Graph Database와 RAG에 어느 정도 익숙하다고 가정할게요.
여기에는 GitHub 저장소가 포함되어 있고, 다음을 통해 이러한 데이터 모델을 생성하고 탐색하는 코드가 들어있어요. arrows.app 또는 Neo4j 브라우저를 사용하면 자신의 애플리케이션에 대한 데이터 모델을 수정할 수 있어요.
Neo4j

Neo4j는 벡터 검색을 수행할 수 있는 벡터 인덱싱 기능이 있는 Graph Database를 제공해요. 다음을 사용해서 로컬에서 Neo4j를 사용해 볼 수 있어요: 데스크톱 버전 또는 클라우드 호스팅 환경에서 Neo4j AuraDB를 무료로 사용할 수 있어요. 데이터베이스를 초기화할 때 Neo4j 버전 ≥ 5.13을 실행해서 벡터 인덱싱 기능이 있는지 확인하세요.
Vector Embedding
Vector Embedding은 미디어를 수학적으로 나타내는 일련의 숫자예요. 이는 전통적으로 단어와 문장으로 수행되었지만 이제는 오디오, 이미지 및 비디오를 Vector Embedding으로 인코딩하는 것도 가능해요. 벡터의 길이를 차원이라고 해요.
Neo4j는 최대 4096차원의 벡터를 지원하며 일반적인 값은 768 및 1536이에요.
[0.123, -0.423, 0.519, ..., -0.942]
컨텍스트 검색
반환된 컨텍스트는 사용자 질문 임베딩과 그래프에 있는 텍스트 임베딩 간의 계산된 유사성 점수에 따라 결정돼요.
일치하는 임베딩에서 검색된 텍스트를 분리하는 것이 좋아요. 이는 원시 청크에 삽입 시 인코딩된 정보를 희석시킬 수 있는 필러 단어와 추가/충돌 정보가 포함될 가능성이 높기 때문이에요.
더 작은 및/또는 처리된 텍스트 청크를 포함함으로써 유사성 일치를 더 정확하게 만들 수 있으며, 그래프 관계를 탐색하여 응답 생성을 위해 LLM에 반환되는 텍스트를 제어할 수 있어요.
기본 그래프 데이터 모델
이 그래프 데이터 모델은 문서 `Node`에 텍스트 청크를 저장하고 반환된 텍스트에서 일치하는 임베딩을 분리하지 않아요. 문서 `Node`의 임베딩 속성에 대해 벡터 검색을 실행하여 LLM에 컨텍스트로 반환할 가장 관련성이 높은 텍스트를 찾을 수 있어요. 원한다면 `Relationship`을 탐색하여 각 텍스트 덩어리의 출처를 찾아 인용을 제공할 수도 있어요.
이 모델은 개념 증명에 적합하지만 크게 개선될 수 있으며 생산 애플리케이션에 더 나은 옵션이 있어요.
부모-자식
부모-자식 모델은 기본 모델과 유사하지만 텍스트 덩어리를 더 세분화하여 예상 질문에 더 가까운 길이를 만들어요. 이렇게 하면 질문과 일치하는 텍스트 간의 정보 세분성이 유지되므로 한 단락에 대해 몇 단어를 일치시키지 않아요.
하위 `Node` 포함 일치 항목이 있으면 `Relationship`을 탐색하여 하위 텍스트와 주변 텍스트가 포함된 상위 `Node` 텍스트를 검색할 수 있어요. 이 방법은 보다 정확한 벡터 검색 일치를 제공하는 동시에 컨텍스트가 풍부한 결과를 반환해요.
애플리케이션에서 일반적인 질문의 길이를 찾으려면 실험이 필요하지만 문서 채팅 애플리케이션에서는 140자가 표준 길이인 것으로 나타났어요.