PageIndex 통합
PageIndex 통합
섹션 제목: “PageIndex 통합”1. 개요
섹션 제목: “1. 개요”1.1 PageIndex란?
섹션 제목: “1.1 PageIndex란?”PageIndex는 Vectorless, Reasoning-based RAG 시스템입니다.
| 기존 Vector RAG | PageIndex |
|---|---|
| 청킹 → 임베딩 → 벡터DB | 문서 → 계층적 트리 인덱스 |
| 유사도 기반 검색 | 추론 기반 검색 |
| 고정 크기 청크 | 자연스러운 섹션 단위 |
| 설명 불가능 | 추론 경로 추적 가능 |
1.2 목적
섹션 제목: “1.2 목적”- 인사이트 리포트, 모니터링 리포트 등 장문 콘텐츠 심층 분석
- ES 단순 검색 결과의 품질 향상
- 특정 질의에 대한 정확한 섹션 탐색
1.3 구현 파일
섹션 제목: “1.3 구현 파일”| 파일 | 설명 |
|---|---|
app/services/pageindex_client.py | PageIndex 클라이언트 |
app/routes/pageindex.py | PageIndex API 라우터 |
app/data/indexes/ | 트리 인덱스 캐시 저장소 |
2. 아키텍처
섹션 제목: “2. 아키텍처”2.1 PageIndex 작동 흐름
섹션 제목: “2.1 PageIndex 작동 흐름”문서 입력 │ ▼┌───────────────────────────────────────┐│ 1. 트리 인덱스 생성 ││ ┌─────────────────────────────────┐ ││ │ { │ ││ │ "title": "인사이트 리포트", │ ││ │ "nodes": [ │ ││ │ { "node_id": "001", │ ││ │ "title": "서론", │ ││ │ "summary": "...", │ ││ │ "sub_nodes": [...] │ ││ │ }, │ ││ │ ... │ ││ │ ] │ ││ │ } │ ││ └─────────────────────────────────┘ │└───────────────────────────────────────┘ │ │ (캐시 저장) ▼┌───────────────────────────────────────┐│ 2. 사용자 질의 입력 ││ "서울시 고령화 추이는?" │└───────────────────────────────────────┘ │ ▼┌───────────────────────────────────────┐│ 3. 추론 기반 섹션 검색 ││ - LLM이 트리 구조 분석 ││ - 관련 노드 추론 ││ - 검색 reasoning 생성 │└───────────────────────────────────────┘ │ ▼┌───────────────────────────────────────┐│ 4. 결과 반환 ││ - relevant_nodes: ["003", "007"] ││ - reasoning: "고령화 관련 섹션..." ││ - confidence: 0.85 │└───────────────────────────────────────┘2.2 ES와 PageIndex 연계
섹션 제목: “2.2 ES와 PageIndex 연계”┌─────────────────────────────────────────────────────────────┐│ 사용자 검색 쿼리 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 1. Elasticsearch 검색 ││ - 콜렉션 전체에서 관련 문서 검색 ││ - 결과: 인사이트 리포트 nid:1234 외 5건 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 2. PageIndex 심층 분석 (선택적) ││ - 장문 콘텐츠(인사이트/모니터링 리포트)에 적용 ││ - 해당 문서 내 관련 섹션 정확히 탐색 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────┐│ 결과 반환 ││ - 문서 목록 + 관련 섹션 하이라이트 │└─────────────────────────────────────────────────────────────┘3. 주요 기능
섹션 제목: “3. 주요 기능”3.1 트리 인덱스 생성
섹션 제목: “3.1 트리 인덱스 생성”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"}3.2 추론 기반 검색
섹션 제목: “3.2 추론 기반 검색”# 트리 인덱스에서 관련 섹션 검색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": ["구별 인구 분포", "고령화 추이"]}3.3 전체 파이프라인
섹션 제목: “3.3 전체 파이프라인”# 문서 분석 전체 과정result = await client.analyze_document( content="문서 본문...", doc_id="insight_001", query="서울시 인구 감소 원인은?", title="인구 인사이트 리포트")4. 적용 대상
섹션 제목: “4. 적용 대상”4.1 PageIndex 적합 콘텐츠
섹션 제목: “4.1 PageIndex 적합 콘텐츠”| 콘텐츠 타입 | 건수 | 적합도 | 이유 |
|---|---|---|---|
| 인사이트 리포트 | 6 | ★★★★★ | 장문, 계층 구조, 심층 분석 |
| 모니터링 리포트 | 43 | ★★★★☆ | 정기 보고서, 섹션 구분 명확 |
| 조사데이터 | 48 | ★★★☆☆ | 조사 결과 구조화 |
| 지도로 본 서울 | 196 | ★★☆☆☆ | 단순 설명 위주 |
| 통계로 본 서울 | 73 | ★★☆☆☆ | 짧은 콘텐츠 |
4.2 권장 사용 시나리오
섹션 제목: “4.2 권장 사용 시나리오”-
인사이트 리포트 심층 질의
- “서울시 1인가구 증가 원인 분석”
- “고령화 대응 정책 제언”
-
모니터링 리포트 특정 지표 검색
- “2023년 4분기 미세먼지 현황”
- “교통사고 발생 추이”
-
복합 질의 처리
- “강남구와 강북구의 인구 구조 차이”
- “코로나 전후 서울 경제 변화”
5. 캐싱 전략
섹션 제목: “5. 캐싱 전략”5.1 트리 인덱스 캐시
섹션 제목: “5.1 트리 인덱스 캐시”- 저장 위치:
app/data/indexes/{doc_id}_tree.json - 캐시 키: 문서 ID (nid 또는 고유 식별자)
- 유효 기간: 문서 수정 시까지 영구 보관
5.2 캐시 관리
섹션 제목: “5.2 캐시 관리”# 캐시된 트리 목록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)6. 비용 고려사항
섹션 제목: “6. 비용 고려사항”6.1 API 호출 비용
섹션 제목: “6.1 API 호출 비용”| 작업 | 평균 토큰 | 예상 비용 (gpt-4o) |
|---|---|---|
| 트리 인덱스 생성 | ~2,500 | ~$0.01 |
| 추론 검색 | ~800 | ~$0.003 |
| 전체 분석 | ~3,300 | ~$0.013 |
6.2 비용 최적화
섹션 제목: “6.2 비용 최적화”- 캐싱 활용: 동일 문서 재분석 시 트리 생성 비용 절감
- 선별적 적용: 장문 콘텐츠에만 PageIndex 적용
- 모델 선택: 간단한 트리 생성은 gpt-4o-mini 사용 가능
7. Vector RAG 대비 장점
섹션 제목: “7. Vector RAG 대비 장점”7.1 PageIndex 강점
섹션 제목: “7.1 PageIndex 강점”| 측면 | Vector RAG | PageIndex |
|---|---|---|
| 정확도 | 유사도 기반 (부정확할 수 있음) | 추론 기반 (높은 정확도) |
| 설명 가능성 | 블랙박스 | 추론 경로 제공 |
| 내부 참조 | 처리 어려움 | ”Appendix 참조” 추적 가능 |
| 맥락 유지 | 청크 단위로 손실 | 문서 전체 맥락 유지 |
| 인프라 | 벡터DB 필요 | 추가 인프라 불필요 |
7.2 PageIndex 한계
섹션 제목: “7.2 PageIndex 한계”- 문서 단위 분석 (콜렉션 전체 검색은 ES 담당)
- 초기 트리 생성에 시간/비용 소요
- 매우 긴 문서는 토큰 제한 고려 필요
8. 관련 문서
섹션 제목: “8. 관련 문서”- 00_개요.md - 프로젝트 개요
- 02_OpenAI_클라이언트.md - OpenAI API 클라이언트
- 05_API_엔드포인트.md - PageIndex API 명세
- 07_비교테스트_결과.md - ES vs PageIndex 비교
9. 참고 자료
섹션 제목: “9. 참고 자료”- PageIndex GitHub: https://github.com/VectifyAI/PageIndex
- PageIndex Blog: https://pageindex.ai/blog/pageindex-intro
- FinanceBench 벤치마크: 98.7% 정확도 달성