Bldev's Blog

라마인덱스

[RAG] Llmaindex

2025. 3. 12.

색인과 질의

  • 색인 (indexing): 데이터를 정리하는 과정
    • 데이터의 관련성 결정: 전체 데이터 중 어떤 데이터가 중요한지 판단
    • 색인 방법
      • 원본 데이터 색인
      • 데이터 요약 및 데이터 요약본 색인
  • 질의 (querying): 질문에 대한 적절한 답을 찾는 과정 (적절한 인덱스로부터 데이터를 가져오는 과정)
    • 검색 (retrieval): 제공 받은 여러 서로 다른 인덱스에서 질문에 대한 답변과 가장 관련성이 높은 정보, 질문에 대한 답을 찾는데 도움이 되는 정보를 가장 잘 찾을 수 있는 인덱스를 결정
      • 이 과정에서 외부 도구에서 정보를 검색할 수도 있음
    • 응답 합성 (response synthesis): 검색된 데이터를 답변으로 전환
      • 질문이 여러 개의 서로 다른 하위 질문들로 구성되어 있는 경우 여러 하위 질의에 대한 답변을 결합하여 하나의 답변으로 생성
      • 답변을 원하는 형태로 변환

도메인 객체

  • 도메인 객체
    • 문서 (doucument): 데이터 소스를 담는 컨테이너
    • 노드 (node): 문서의 하위 클래스, 문서의 청크
      • 텍스트 데이터의 경우 텍스트 청크
    • 메타데이터 (meatadata): 문서와 노드가 포함할 수 있는 데이터
    • 인덱스 (index): 쿼리와 관련된 데이터(컨텍스트)를 빠르게 검색할 수 있게 해주는 데이터 구조
      • RAG의 핵심 개념
      • 문서로부터 인덱스를 구축하고, 구축한 인덱스는 데이터에 대한 질문, 답변, 채팅을 가능하게 하는 엔진(쿼리 엔진 및 채팅 엔진) 구축에 사용됨
      • 인덱스는 노드에 데이터를 저장함
      • 인덱스로부터 검색기를 가져올 수 있음
    • 검색기 (retriever): 사용자 쿼리(또는 채팅 메시지)가 주어졌을 때 가장 관련성이 높은 컨텍스트를 가져오는 일을 수행
      • 관련 컨텍스트를 검색하기 위한 쿼리 엔진(및 채팅 엔진)에서 핵심적인 빌딩 블록으로 사용됨
      • 검색기는 쿼리가 주어졌을 때 인덱스에서 관련 컨텍스트를 효율적으로 검색하는 방법을 정의함
      • 검색 전략은 검색된 데이터의 관련성과 검색의 효율성을 결정하는 핵심 요소임
  • 도메인 객체 간 관계
    • 데이터는 문서로 변환됨
    • 문서는 노드로 분할됨
    • 문서와 노드는 메타데이터를 포함함
    • 데이터를 문서로 변환하면 인덱스 데이터 구조가 생성됨
    • 문서로부터 인덱스를 구축할 수 있음
    • 문서는 노드로 분할되며, 노드는 인덱스 데이터 구조에 저장됨
    • 생성된 인덱스 데이터 구조에 새 문서를 삽입하고, 기존 문서를 갱신, 삭제, 새로고침할 수 있음

인덱스의 종류

  • 요약 인덱스
  • 벡터 인덱스
  • 트리 인덱스
  • 키워드 테이블 인덱스

문서 관리

  • 삽입: 처음 인덱스를 구축한 후 새 문서를 인덱스 데이터 구조에 삽입
    • 삽입의 기본 메커니즘은 색인 구조에 따라 다름
      • 요약 인덱스의 경우 새 문서가 목록에 추가 노드로 삽입됨
      • 벡터 저장소 인덱스의 경우 새 문서(및 임베딩)가 기본 문서/임베딩 저장소에 삽입됨
  • 삭제: 문서 ID를 지정하여 인덱스 데이터 구조에서 문서를 삭
    • 문서에 해당하는 모든 노드가 삭제됨
  • 갱신: 문서가 이미 인덱스 내에 있는 경우, 동일한 문서 ID를 가진 문서를 갱신할 수 있음
    • 예: 문서에 있는 정보가 변경된 경우
  • 새로고침: 데이터를 로드할 때 각 문서의 문서 ID를 설정하면 인덱스를 자동으로 새로고침할 수 있음
    • 새로고침은 문서 ID는 같지만 문서의 텍스트 내용이 다른지 확인하여, 텍스트 내용이 다른 문서는 업데이트하고, 인덱스에 전혀 없는 문서는 새로운 문서 ID로 새로 삽입함
    • 새로고침은 새로운 정보가 지속적으로 업데이트되는 문서를 읽을 때 유용함

데이터 처리 과정

  • 데이터 로딩 및 수집(ingestion): 다양한 형태의 데이터(텍스트, 이미지, 오디오, 비디오 등)를 문서 객체로 변환하는 과정
    • 문서: 모든 데이터 소스에 대한 일반적인 컨테이너
      • 데이터와 해당 데이터에 대한 메타데이터의 집합
      • 문서는 추가적인 속성을 포함함
        • 메타데이터: 문서에 추가할 수 있는 주석 사전
        • 관계: 다른 문서/노드와의 관계를 포함하는 사전
    • 노드: 문서의 하위 클래스, 문서의 청크
      • 문서와 마찬가지로 메타데이터와 다른 노드와의 관계 정보를 포함함
    • 메타데이터: 응답의 출처 등 응답에 관한 추가적인 정보를 나타내는데 도움을 줌
      • 예: 파일 이름, 데이터 카테고리
      • 각 문서의 메타데이터 사전에 설정된 모든 정보는 문서로부터 생성된 각 노드의 메타데이터에도 표시됨
      • 메타데이터는 노드에 포함되어 인덱스가 쿼리 및 응답에 활용할 수 있도록 도와줌
      • 기본적으로 메타데이터는 임베딩 및 LLM 모델 호출 모두에 대해 텍스트에 삽입됨
    • 데이터 처리(process) 및 변환(transformation): 데이터를 처리 및 변환하여 저장소에 넣는 과정 (데이터를 색인하는 과정)
      • 데이터 처리 과정
        • 청킹 (chunking): 문서를 노드로 분할
          • 청킹을 수행하는 것: 노드 파서(node parser), 스플리터(splitter)
          • 텍스트 문서의 경우 문단, 문장, 토큰 단위로 데이터를 분할
        • 메타데이터 추출 및 추가: 문서와 노드에 추가할 메타데이터를 추출 및 추가
          • 메타데이터를 추출하는 것: 메타데이터 추출기 (metadata extractor)
          • 메타데이터 추출
          • 메타데이터 추가
        • 청크 임베딩 (chunk embedding)
      • 변환: 문서 객체 배열을 입력으로 받아 올바르게 구문 분석하여 노드로 분할
        • 문서를 문서와 유사하지만 상위 문서와 관계가 있는 노드로 분할
        • 변환의 입력 및 출력: 노드(node) 객체
        • 문서를 분할하는 방식을 더 세밀하게 제어할 수 있음
      • 임베딩: 벡터 저장소에 데이터를 저장하기 위해서는 노드를 임베딩해야 함
      • 저장: 결과 노드를 벡터 스토어에 저장
  • 데이터 인덱싱
  • 데이터 임베딩
  • 데이터 저장
  • 데이터 질의

프로퍼티 그래프

  • 프로퍼티 그래프: 레이블이 있는 노드들의 집합
  • 그래프 구축: 각각의 청크에 kg_extractor를 수행하고 각 인덱스 노드에 엔티티와 관계를 메타데이터로 첨부함

Property Graph Index

Property Graph Index + Neo4j

GraphRAG 구현 방법

  1. LLMPathExtractor + PropertyGraphIndex
  2. Graph RAG 커스텀 구현

쿼리

채팅 엔진


참고