콘텐츠로 이동

PageIndex 통합

PageIndex는 Vectorless, Reasoning-based RAG 시스템입니다.

기존 Vector RAGPageIndex
청킹 → 임베딩 → 벡터DB문서 → 계층적 트리 인덱스
유사도 기반 검색추론 기반 검색
고정 크기 청크자연스러운 섹션 단위
설명 불가능추론 경로 추적 가능
  • 인사이트 리포트, 모니터링 리포트 등 장문 콘텐츠 심층 분석
  • ES 단순 검색 결과의 품질 향상
  • 특정 질의에 대한 정확한 섹션 탐색
파일설명
app/services/pageindex_client.pyPageIndex 클라이언트
app/routes/pageindex.pyPageIndex API 라우터
app/data/indexes/트리 인덱스 캐시 저장소

문서 입력
┌───────────────────────────────────────┐
│ 1. 트리 인덱스 생성 │
│ ┌─────────────────────────────────┐ │
│ │ { │ │
│ │ "title": "인사이트 리포트", │ │
│ │ "nodes": [ │ │
│ │ { "node_id": "001", │ │
│ │ "title": "서론", │ │
│ │ "summary": "...", │ │
│ │ "sub_nodes": [...] │ │
│ │ }, │ │
│ │ ... │ │
│ │ ] │ │
│ │ } │ │
│ └─────────────────────────────────┘ │
└───────────────────────────────────────┘
│ (캐시 저장)
┌───────────────────────────────────────┐
│ 2. 사용자 질의 입력 │
│ "서울시 고령화 추이는?" │
└───────────────────────────────────────┘
┌───────────────────────────────────────┐
│ 3. 추론 기반 섹션 검색 │
│ - LLM이 트리 구조 분석 │
│ - 관련 노드 추론 │
│ - 검색 reasoning 생성 │
└───────────────────────────────────────┘
┌───────────────────────────────────────┐
│ 4. 결과 반환 │
│ - relevant_nodes: ["003", "007"] │
│ - reasoning: "고령화 관련 섹션..." │
│ - confidence: 0.85 │
└───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 사용자 검색 쿼리 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 1. Elasticsearch 검색 │
│ - 콜렉션 전체에서 관련 문서 검색 │
│ - 결과: 인사이트 리포트 nid:1234 외 5건 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 2. PageIndex 심층 분석 (선택적) │
│ - 장문 콘텐츠(인사이트/모니터링 리포트)에 적용 │
│ - 해당 문서 내 관련 섹션 정확히 탐색 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 결과 반환 │
│ - 문서 목록 + 관련 섹션 하이라이트 │
└─────────────────────────────────────────────────────────────┘

from app.services import get_pageindex_client
client = get_pageindex_client()
# 문서 내용으로 트리 인덱스 생성
tree = await client.build_tree_index(
content="문서 본문 내용...",
doc_id="insight_report_001",
title="2024 서울시 인구 인사이트"
)

출력 예시:

{
"doc_id": "insight_report_001",
"title": "2024 서울시 인구 인사이트",
"description": "서울시 인구 변화와 고령화 추이 분석 리포트",
"nodes": [
{
"node_id": "001",
"title": "서론",
"summary": "연구 배경과 목적 소개",
"sub_nodes": []
},
{
"node_id": "002",
"title": "인구 현황",
"summary": "2024년 서울시 인구 통계",
"sub_nodes": [
{
"node_id": "002-1",
"title": "구별 인구 분포",
"summary": "25개 구별 인구 현황"
},
{
"node_id": "002-2",
"title": "연령별 인구 구조",
"summary": "연령대별 인구 비율"
}
]
},
{
"node_id": "003",
"title": "고령화 추이",
"summary": "서울시 고령화율 변화 분석",
"sub_nodes": [...]
}
],
"model": "gpt-4o"
}
# 트리 인덱스에서 관련 섹션 검색
result = await client.search_tree(
tree=tree,
query="강남구 고령 인구 비율은?",
content="원본 문서 내용..."
)

출력 예시:

{
"query": "강남구 고령 인구 비율은?",
"doc_id": "insight_report_001",
"relevant_nodes": ["002-1", "003"],
"reasoning": "강남구 인구 분포는 '구별 인구 분포' 섹션에, 고령 인구 관련 정보는 '고령화 추이' 섹션에서 찾을 수 있습니다.",
"confidence": 0.85,
"suggested_answer_sections": ["구별 인구 분포", "고령화 추이"]
}
# 문서 분석 전체 과정
result = await client.analyze_document(
content="문서 본문...",
doc_id="insight_001",
query="서울시 인구 감소 원인은?",
title="인구 인사이트 리포트"
)

콘텐츠 타입건수적합도이유
인사이트 리포트6★★★★★장문, 계층 구조, 심층 분석
모니터링 리포트43★★★★☆정기 보고서, 섹션 구분 명확
조사데이터48★★★☆☆조사 결과 구조화
지도로 본 서울196★★☆☆☆단순 설명 위주
통계로 본 서울73★★☆☆☆짧은 콘텐츠
  1. 인사이트 리포트 심층 질의

    • “서울시 1인가구 증가 원인 분석”
    • “고령화 대응 정책 제언”
  2. 모니터링 리포트 특정 지표 검색

    • “2023년 4분기 미세먼지 현황”
    • “교통사고 발생 추이”
  3. 복합 질의 처리

    • “강남구와 강북구의 인구 구조 차이”
    • “코로나 전후 서울 경제 변화”

  • 저장 위치: app/data/indexes/{doc_id}_tree.json
  • 캐시 키: 문서 ID (nid 또는 고유 식별자)
  • 유효 기간: 문서 수정 시까지 영구 보관
# 캐시된 트리 목록
cached = client.get_cached_trees()
# ['insight_001', 'monitoring_2024_q1', ...]
# 캐시 삭제
client.delete_cache('insight_001')
# 강제 재생성
tree = await client.build_tree_index(
content=content,
doc_id=doc_id,
force_rebuild=True
)

작업평균 토큰예상 비용 (gpt-4o)
트리 인덱스 생성~2,500~$0.01
추론 검색~800~$0.003
전체 분석~3,300~$0.013
  1. 캐싱 활용: 동일 문서 재분석 시 트리 생성 비용 절감
  2. 선별적 적용: 장문 콘텐츠에만 PageIndex 적용
  3. 모델 선택: 간단한 트리 생성은 gpt-4o-mini 사용 가능

측면Vector RAGPageIndex
정확도유사도 기반 (부정확할 수 있음)추론 기반 (높은 정확도)
설명 가능성블랙박스추론 경로 제공
내부 참조처리 어려움”Appendix 참조” 추적 가능
맥락 유지청크 단위로 손실문서 전체 맥락 유지
인프라벡터DB 필요추가 인프라 불필요
  • 문서 단위 분석 (콜렉션 전체 검색은 ES 담당)
  • 초기 트리 생성에 시간/비용 소요
  • 매우 긴 문서는 토큰 제한 고려 필요