[RAG] Llmaindex
색인과 질의
- 색인 (indexing): 데이터를 정리하는 과정
- 데이터의 관련성 결정: 전체 데이터 중 어떤 데이터가 중요한지 판단
- 색인 방법
- 원본 데이터 색인
- 데이터 요약 및 데이터 요약본 색인
- 질의 (querying): 질문에 대한 적절한 답을 찾는 과정 (적절한 인덱스로부터 데이터를 가져오는 과정)
- 검색 (retrieval): 제공 받은 여러 서로 다른 인덱스에서 질문에 대한 답변과 가장 관련성이 높은 정보, 질문에 대한 답을 찾는데 도움이 되는 정보를 가장 잘 찾을 수 있는 인덱스를 결정
- 이 과정에서 외부 도구에서 정보를 검색할 수도 있음
- 응답 합성 (response synthesis): 검색된 데이터를 답변으로 전환
- 질문이 여러 개의 서로 다른 하위 질문들로 구성되어 있는 경우 여러 하위 질의에 대한 답변을 결합하여 하나의 답변으로 생성
- 답변을 원하는 형태로 변환
- 검색 (retrieval): 제공 받은 여러 서로 다른 인덱스에서 질문에 대한 답변과 가장 관련성이 높은 정보, 질문에 대한 답을 찾는데 도움이 되는 정보를 가장 잘 찾을 수 있는 인덱스를 결정
도메인 객체
- 도메인 객체
- 문서 (doucument): 데이터 소스를 담는 컨테이너
- 노드 (node): 문서의 하위 클래스, 문서의 청크
- 텍스트 데이터의 경우 텍스트 청크
- 메타데이터 (meatadata): 문서와 노드가 포함할 수 있는 데이터
- 인덱스 (index): 쿼리와 관련된 데이터(컨텍스트)를 빠르게 검색할 수 있게 해주는 데이터 구조
- RAG의 핵심 개념
- 문서로부터 인덱스를 구축하고, 구축한 인덱스는 데이터에 대한 질문, 답변, 채팅을 가능하게 하는 엔진(쿼리 엔진 및 채팅 엔진) 구축에 사용됨
- 인덱스는 노드에 데이터를 저장함
- 인덱스로부터 검색기를 가져올 수 있음
- 검색기 (retriever): 사용자 쿼리(또는 채팅 메시지)가 주어졌을 때 가장 관련성이 높은 컨텍스트를 가져오는 일을 수행
- 관련 컨텍스트를 검색하기 위한 쿼리 엔진(및 채팅 엔진)에서 핵심적인 빌딩 블록으로 사용됨
- 검색기는 쿼리가 주어졌을 때 인덱스에서 관련 컨텍스트를 효율적으로 검색하는 방법을 정의함
- 검색 전략은 검색된 데이터의 관련성과 검색의 효율성을 결정하는 핵심 요소임
- 도메인 객체 간 관계
- 데이터는 문서로 변환됨
- 문서는 노드로 분할됨
- 문서와 노드는 메타데이터를 포함함
- 데이터를 문서로 변환하면 인덱스 데이터 구조가 생성됨
- 문서로부터 인덱스를 구축할 수 있음
- 문서는 노드로 분할되며, 노드는 인덱스 데이터 구조에 저장됨
- 생성된 인덱스 데이터 구조에 새 문서를 삽입하고, 기존 문서를 갱신, 삭제, 새로고침할 수 있음
인덱스의 종류
- 요약 인덱스
- 벡터 인덱스
- 트리 인덱스
- 키워드 테이블 인덱스
문서 관리
- 삽입: 처음 인덱스를 구축한 후 새 문서를 인덱스 데이터 구조에 삽입
- 삽입의 기본 메커니즘은 색인 구조에 따라 다름
- 요약 인덱스의 경우 새 문서가 목록에 추가 노드로 삽입됨
- 벡터 저장소 인덱스의 경우 새 문서(및 임베딩)가 기본 문서/임베딩 저장소에 삽입됨
- 삽입의 기본 메커니즘은 색인 구조에 따라 다름
- 삭제: 문서 ID를 지정하여 인덱스 데이터 구조에서 문서를 삭
- 문서에 해당하는 모든 노드가 삭제됨
- 갱신: 문서가 이미 인덱스 내에 있는 경우, 동일한 문서 ID를 가진 문서를 갱신할 수 있음
- 예: 문서에 있는 정보가 변경된 경우
- 새로고침: 데이터를 로드할 때 각 문서의 문서 ID를 설정하면 인덱스를 자동으로 새로고침할 수 있음
- 새로고침은 문서 ID는 같지만 문서의 텍스트 내용이 다른지 확인하여, 텍스트 내용이 다른 문서는 업데이트하고, 인덱스에 전혀 없는 문서는 새로운 문서 ID로 새로 삽입함
- 새로고침은 새로운 정보가 지속적으로 업데이트되는 문서를 읽을 때 유용함
데이터 처리 과정
- 데이터 로딩 및 수집(ingestion): 다양한 형태의 데이터(텍스트, 이미지, 오디오, 비디오 등)를 문서 객체로 변환하는 과정
- 문서: 모든 데이터 소스에 대한 일반적인 컨테이너
- 데이터와 해당 데이터에 대한 메타데이터의 집합
- 문서는 추가적인 속성을 포함함
- 메타데이터: 문서에 추가할 수 있는 주석 사전
- 관계: 다른 문서/노드와의 관계를 포함하는 사전
- 노드: 문서의 하위 클래스, 문서의 청크
- 문서와 마찬가지로 메타데이터와 다른 노드와의 관계 정보를 포함함
- 메타데이터: 응답의 출처 등 응답에 관한 추가적인 정보를 나타내는데 도움을 줌
- 예: 파일 이름, 데이터 카테고리
- 각 문서의 메타데이터 사전에 설정된 모든 정보는 문서로부터 생성된 각 노드의 메타데이터에도 표시됨
- 메타데이터는 노드에 포함되어 인덱스가 쿼리 및 응답에 활용할 수 있도록 도와줌
- 기본적으로 메타데이터는 임베딩 및 LLM 모델 호출 모두에 대해 텍스트에 삽입됨
- 데이터 처리(process) 및 변환(transformation): 데이터를 처리 및 변환하여 저장소에 넣는 과정 (데이터를 색인하는 과정)
- 데이터 처리 과정
- 청킹 (chunking): 문서를 노드로 분할
- 청킹을 수행하는 것: 노드 파서(node parser), 스플리터(splitter)
- 텍스트 문서의 경우 문단, 문장, 토큰 단위로 데이터를 분할
- 메타데이터 추출 및 추가: 문서와 노드에 추가할 메타데이터를 추출 및 추가
- 메타데이터를 추출하는 것: 메타데이터 추출기 (metadata extractor)
- 메타데이터 추출
- 메타데이터 추가
- 청크 임베딩 (chunk embedding)
- 청킹 (chunking): 문서를 노드로 분할
- 변환: 문서 객체 배열을 입력으로 받아 올바르게 구문 분석하여 노드로 분할
- 문서를 문서와 유사하지만 상위 문서와 관계가 있는 노드로 분할
- 변환의 입력 및 출력: 노드(node) 객체
- 문서를 분할하는 방식을 더 세밀하게 제어할 수 있음
- 임베딩: 벡터 저장소에 데이터를 저장하기 위해서는 노드를 임베딩해야 함
- 저장: 결과 노드를 벡터 스토어에 저장
- 데이터 처리 과정
- 문서: 모든 데이터 소스에 대한 일반적인 컨테이너
- 데이터 인덱싱
- 데이터 임베딩
- 데이터 저장
- 데이터 질의
프로퍼티 그래프
- 프로퍼티 그래프: 레이블이 있는 노드들의 집합
- 그래프 구축: 각각의 청크에 kg_extractor를 수행하고 각 인덱스 노드에 엔티티와 관계를 메타데이터로 첨부함
Property Graph Index
- 삽입 시 두 개의 노드가 그래프에 삽입됨
- EntityNode: 레이블이 지정된 사람, 장소 또는 사물을 포함
- ChunkNode: 엔티티 또는 관계의 출처가 되는 소스 텍스트를 포함
MENTIONS
관계는 일반적으로 텍스트 청크와 엔티티 노드 간에 설정됩니다. 이는 특정 텍스트 청크가 특정 엔티티를 언급하고 있음을 나타내기 위해 사용됩니다. 예를 들어, 문서의 특정 부분이 사람, 장소, 또는 조직과 같은 엔티티를 언급할 때, 해당 청크 노드와 엔티티 노드 사이에MENTIONS
관계가 생성됩니다.- 참고
- https://www.llamaindex.ai/blog/introducing-the-property-graph-index-a-powerful-new-way-to-build-knowledge-graphs-with-llms
- Neo4j: https://docs.llamaindex.ai/en/stable/examples/property_graph/property_graph_neo4j/
Property Graph Index + Neo4j
- 구현 방법
- https://docs.llamaindex.ai/en/stable/examples/property_graph/property_graph_neo4j/
- Neo4jPGStore
GraphRAG 구현 방법
- LLMPathExtractor + PropertyGraphIndex
- Graph RAG 커스텀 구현
쿼리
- Property Graph Index 쿼리
- 기본적으로 두 개의 리트리버 사용
- 참고
- https://docs.llamaindex.ai/en/stable/examples/property_graph/property_graph_basic/#querying
채팅 엔진
- 개인 히스토리 구별
- https://github.com/run-llama/llama_index/issues/15035
- 채팅 엔진 + 주석
- 참고
- https://github.com/run-llama/llama_index/tree/main/llama-index-packs/llama-index-packs-cohere-citation-chat
- https://github.com/run-llama/llama_index/pull/11100
- 참고
참고
- 프롬프트 엔지니어링
- https://docs.llamaindex.ai/en/stable/examples/prompts/advanced_prompts/#2-prompt-template-variable-mappings
- https://docs.llamaindex.ai/en/stable/examples/prompts/prompts_rag/
- 도큐먼트
- https://docs.llamaindex.ai/en/stable/module_guides/loading/documents_and_nodes/usage_documents/
- Neo4j 메타데이터 필터링
- https://docs.llamaindex.ai/en/stable/examples/vector_stores/neo4j_metadata_filter/
- LLM Path Extractors
- https://docs.llamaindex.ai/en/stable/examples/property_graph/Dynamic_KG_Extraction/#2-dynamicllmpathextractor
- https://github.com/run-llama/llama_index/pull/14357
- 프로퍼티 그래프
- https://docs.llamaindex.ai/en/stable/examples/property_graph/graph_store/
- 쿼리: https://docs.llamaindex.ai/en/stable/examples/property_graph/property_graph_basic/#querying
- 스키마를 통한 그래프 구축: https://docs.llamaindex.ai/en/stable/examples/property_graph/property_graph_advanced/#graph-construction
- Graph RAG 커스텀 구현
- https://docs.llamaindex.ai/en/stable/examples/cookbooks/GraphRAG_v2/
- 데이터 에이전트
- https://medium.com/llamaindex-blog/data-agents-eed797d7972f
Comments