|
| 1 | +# Phase A-2: 대규모 문서 스트레스 테스트 — M3 실행 가이드 |
| 2 | + |
| 3 | +> **목적**: RLV 10/10 결과가 작은 문서(35K chars)에 대한 overfitting인지 검증 |
| 4 | +> **방법**: 1.3MB 문서 (37× 규모)에서 20개 질문 실행 |
| 5 | +> **기대 시간**: ~80분 (Phi-3.5 Q8_0, 20질문 × ~4분) |
| 6 | +
|
| 7 | +--- |
| 8 | + |
| 9 | +## 배경 |
| 10 | + |
| 11 | +현재 RLV 성과: |
| 12 | +- **Acme** (1.9K chars, 5 sections): 7/7 ✅ |
| 13 | +- **Wikitext-small** (35K chars, 3 articles, 23 chunks): 19/20 ✅ |
| 14 | + |
| 15 | +**우려**: 문서가 작아서 BM25 IDF가 쉽게 작동하고, 토픽이 3개뿐이라 locator가 쉽게 구별. |
| 16 | + |
| 17 | +**검증**: 1.3MB wikitext2_test.txt (63개 기사, 2754 chunks, ~310K tokens)에서 동일 파이프라인 테스트. |
| 18 | + |
| 19 | +--- |
| 20 | + |
| 21 | +## 실행 순서 |
| 22 | + |
| 23 | +### 1. 코드 최신화 |
| 24 | +```bash |
| 25 | +cd ~/dev/quantcpp_test # 또는 프로젝트 경로 |
| 26 | +git pull origin main |
| 27 | +``` |
| 28 | + |
| 29 | +커밋 `a922806` (test: add 1.3MB large-doc stress test) 포함 확인. |
| 30 | + |
| 31 | +### 2. 모델 확인 |
| 32 | +```bash |
| 33 | +ls -lh models/Phi-3.5-mini-instruct-Q8_0.gguf |
| 34 | +# 3.8GB — 없으면 다운로드: |
| 35 | +# curl -L -o models/Phi-3.5-mini-instruct-Q8_0.gguf \ |
| 36 | +# "https://huggingface.co/bartowski/Phi-3.5-mini-instruct-GGUF/resolve/main/Phi-3.5-mini-instruct-Q8_0.gguf" |
| 37 | +``` |
| 38 | + |
| 39 | +### 3. unified 서버 빌드 |
| 40 | +```bash |
| 41 | +cc -O2 -o build_metal/quant-server-unified tools/quant_server_unified.c -lm -lpthread |
| 42 | +``` |
| 43 | + |
| 44 | +### 4. 서버 동작 확인 (30초) |
| 45 | +```bash |
| 46 | +./build_metal/quant-server-unified models/Phi-3.5-mini-instruct-Q8_0.gguf -p 8421 -j 8 & |
| 47 | +sleep 5 |
| 48 | +curl -s http://127.0.0.1:8421/v1/chat/completions \ |
| 49 | + -H "Content-Type: application/json" \ |
| 50 | + -d '{"model":"default","messages":[{"role":"user","content":"What is 2+2?"}],"max_tokens":10,"temperature":0}' | python3 -m json.tool |
| 51 | +pkill -f quant-server-unified |
| 52 | +``` |
| 53 | + |
| 54 | +기대 출력: `"content": "4"` (또는 유사한 정확한 답변) |
| 55 | + |
| 56 | +### 5. 기존 테스트 regression 확인 (선택, ~15분) |
| 57 | +```bash |
| 58 | +# 기존 19/20 결과 유지되는지 확인 |
| 59 | +python3 bench/rlv/eval/eval_wikitext.py --systems rlv |
| 60 | +``` |
| 61 | + |
| 62 | +### 6. 대규모 문서 스트레스 테스트 실행 |
| 63 | +```bash |
| 64 | +# 전체 20문제 (~80분 예상) |
| 65 | +python3 bench/rlv/eval/eval_wikitext_large.py 2>&1 | tee /tmp/eval_large.log |
| 66 | +``` |
| 67 | + |
| 68 | +시간이 부족하면 5개만 먼저: |
| 69 | +```bash |
| 70 | +# 빠른 확인 (5문제, ~20분) |
| 71 | +for i in 1 4 8 12 16; do |
| 72 | + python3 bench/rlv/eval/eval_wikitext_large.py --only $i |
| 73 | +done |
| 74 | +``` |
| 75 | + |
| 76 | +### 7. 실패 질문 디버깅 |
| 77 | +```bash |
| 78 | +# 실패한 질문 번호로 verbose 실행 |
| 79 | +python3 bench/rlv/eval/eval_wikitext_large.py --only <번호> --verbose |
| 80 | +``` |
| 81 | + |
| 82 | +verbose 출력에서 확인할 것: |
| 83 | +- `[locator]` — 올바른 chunk를 골랐는지 (chunk_id와 head_text) |
| 84 | +- `[lookup]` — 올바른 문장을 선택했는지 |
| 85 | +- `[verifier]` — CONFIDENT/UNSURE/CONTRADICTED 판정 근거 |
| 86 | +- `[researcher]` — 재시도 횟수와 결과 |
| 87 | + |
| 88 | +--- |
| 89 | + |
| 90 | +## 질문 분포 |
| 91 | + |
| 92 | +| 카테고리 | 질문 수 | 기사 | |
| 93 | +|---|---|---| |
| 94 | +| 기존 회귀 체크 | 3 | Boulter, Du Fu, Kiss You | |
| 95 | +| 군사 역사 | 4 | Ise급 전함, Naktong 전투, 장갑함 | |
| 96 | +| 스포츠 | 4 | Rifenburg, Kershaw, Ben Amos | |
| 97 | +| 과학/기상 | 4 | Dvorak 기법, 1933 허리케인, 양서류 | |
| 98 | +| 문학/예술 | 3 | 이미지즘, Little Gidding, Portage | |
| 99 | +| 지리/역사 | 2 | NY Route 31B, Osbert de Bayeux | |
| 100 | + |
| 101 | +난이도: single-hop 16개, multi-hop 4개 |
| 102 | + |
| 103 | +--- |
| 104 | + |
| 105 | +## 성공 기준 |
| 106 | + |
| 107 | +| 등급 | 정확도 | 의미 | |
| 108 | +|---|---|---| |
| 109 | +| **A (돌파)** | ≥ 17/20 (85%) | 대규모 문서에서도 RLV가 작동 — overfitting 아님 | |
| 110 | +| **B (양호)** | 14-16/20 (70-80%) | 기본은 작동하지만 locator 개선 필요 | |
| 111 | +| **C (미달)** | < 14/20 (< 70%) | 확장성 문제 심각 — 아키텍처 재설계 필요 | |
| 112 | + |
| 113 | +### 비교 포인트 |
| 114 | +- 기존 소문서: 19/20 = 95% |
| 115 | +- 대문서 목표: ≥ 85% (10% 이내 하락은 허용 — 37× 규모 증가 감안) |
| 116 | + |
| 117 | +--- |
| 118 | + |
| 119 | +## 예상 실패 패턴 |
| 120 | + |
| 121 | +1. **Locator confusion**: 유사 토픽 기사 간 chunk 혼동 (예: 군사 기사들 간 "battle" 키워드 겹침) |
| 122 | +2. **BM25 IDF 약화**: 2754 chunks에서 일반 단어의 IDF가 낮아져 구별력 저하 |
| 123 | +3. **Chunk 세분화**: paragraph chunker가 짧은 단락마다 chunk 생성 → 맥락 부족 |
| 124 | +4. **LLM 호출 타임아웃**: 긴 문서의 gist 생성 + 다수 retry로 총 시간 초과 |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +## 결과 커밋 |
| 129 | +```bash |
| 130 | +# 결과를 phase3 문서에 기록하고 커밋 |
| 131 | +git add bench/rlv/eval/eval_wikitext_large.py docs/phase3_rlv_challenge.md |
| 132 | +git commit -m "phase 3 phase-a2: large doc stress test results (1.3MB, 2754 chunks)" |
| 133 | +git push origin main |
| 134 | +``` |
| 135 | + |
| 136 | +--- |
| 137 | + |
| 138 | +## Dry-run 예비 결과 (이 머신에서 LLM 없이) |
| 139 | + |
| 140 | +Locator keyword-only 정확도: **7/8 (87.5%)** on 2754-chunk doc. |
| 141 | + |
| 142 | +단 1개 실패: "Clayton Kershaw drafted year" — "2006"이 다른 기사에도 등장 가능. |
| 143 | +BM25+RRF 하이브리드로 LLM 실행 시 개선 예상. |
0 commit comments