hyungi
a41adb63a0
fix(search): Phase 2Q variants bug fix + Phase 3 3 measurement 박제
...
Phase 3 cold 측정 1차에서 NDCG 0.033 catastrophic 발견 — 모든 query 에 동일 variants
반환. root cause = _call_llm 이 user 메시지 1개에 prompt template 전체 박음. LLM 이
actual query 인식 못 함. fixture request_body 형식 (system=prompt / user=query) 과
mismatch. fixture-first invariant 위반.
fix:
- app/services/search/query_rewriter.py _call_llm — system/user 메시지 분리.
fixture request_body 와 단일 source-of-truth. _render_prompt 는 [deprecated] 유지.
- tests/test_query_rewriter.py — Phase 3 regression test 2:
· _call_llm 가 system + user 분리 호출 verify (httpx.AsyncClient monkeypatch)
· qwen backend = response_format 미사용 verify
- 32/32 unit test PASS.
Phase 3 측정 (fix 후 재측정, 51 case × 3 candidate × cold/warm = 5 run):
- baseline_rebaseline (rewrite_backend=null): NDCG 0.659 = Phase 2A 0.659, diff 0.000 PASS
- cand_multi_query_macmini cold: NDCG 0.927 (Δ +0.268), p50 2757ms / p95 9684ms
- cand_multi_query_macmini warm: NDCG 0.927 동일, p50 998ms (cache hit -64%)
- cand_multi_query_macbook cold: NDCG 0.919 (Δ +0.260), p50 3647ms / p95 5202ms
- cand_multi_query_macbook warm: NDCG 0.919 동일, p50 873ms (cache hit -76%)
핵심 약점 회복 (gemma / qwen):
- mixed 0.39 → 0.57 / 0.65
- korean_only 0.51 → 0.71 / 0.67
- standards 0.87 → 1.44 / 1.31
- exam 0.74 → 1.11 / 1.04
decision = H1 (both backends 유의미 net 개선). LLM 선택 = Phase 4 decision md 별 step.
산출물:
- reports/v0_2_phase2q_*.csv (5 raw run_eval output)
- tests/search_eval/baselines/v0_2_phase2q_results_2026-05-24.json (요약 + incident 박제)
follow-up:
- rerank 413 Payload Too Large 다수 관찰 (RRF fallback 작동, NDCG 영향 없음). Apply PR 전 별 chore — chunk dedup 또는 reranker batch cap 검토.
- p95 cold 9684ms 매우 큼. production rollout 시 cache prewarm 정책 필수.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-24 00:51:56 +00:00
hyungi
076c0e1802
feat(eval): Phase 2B Reranker Diagnose — dispatcher + gte 측정 + decision (H3 bge-reranker-v2-m3 유지)
...
round-2-review-mighty-starfish.md v2.1 (Phase 2B Reranker Diagnose) plan 실행.
Phase 2A 의 CANDIDATE_BACKEND_MAP 패턴 재사용 + RERANKER_BACKEND_MAP 신규.
코드 변경 (4 파일):
- app/services/search/rerank_service.py:
- RERANKER_BACKEND_MAP allowlist (baseline / cand_gte_ml_base, slug-based resolve)
- _resolve_reranker(slug) → endpoint URL or None
- _rerank_via_candidate_endpoint() — 후보 TEI POST /rerank
- rerank_chunks() 시그니처에 reranker_backend + snapshot_*_id_max 추가 + dispatch log
- app/services/search/search_pipeline.py: run_search() threading
- app/api/search.py: reranker_backend Query parameter + 400 unknown_reranker_backend 에러 매핑
- tests/search_eval/run_eval.py: --reranker-backend flag + call_search/evaluate threading
infra:
- docker-compose.override.rerank-cand.yml: 3 후보 service (gte_ml_base / mxbai_large / bge_v2_gemma_2b),
profile 'rerank-cand' 격리, restart=unless-stopped
측정 산출물 (51 case, scored=46, failure=5):
- reports/v0_2_phase2b_baseline_snapshot_2026-05-23.csv (NDCG 0.659, Phase 2A 와 일치 = 재현성 PASS)
- reports/v0_2_phase2b_gte_ml_base_2026-05-23.csv
- tests/search_eval/baselines/v0_2_phase2b_{baseline_snapshot,gte_ml_base}_2026-05-23.json
- reports/phase_2b_reranker_decision_2026-05-23.md
- tests/fixtures/tei_rerank_response.json (G0-1 한국어+영어 mixed sample sanity PASS)
후보 TEI 1.7 호환성 (Phase 1 smoke gate):
- cand_gte_ml_base : ✅ PASS (xlm-roberta-based, TEI 호환)
- cand_mxbai_large : ❌ deberta-v2 미지원 → Phase 2B-Extended (sentence-transformers wrapper)
- cand_bge_v2_gemma_2b : ❌ LLM-based reranker, 1_Pooling/config.json 부재 → Phase 2B-Extended (FlagEmbedding wrapper)
결과 (1 후보 측정 + baseline rebaseline):
| Candidate | NDCG | Δ baseline | mixed | korean | exam | p50 ms |
|------------------------------------|------:|-----------:|------:|-------:|------:|-------:|
| bge-reranker-v2-m3 (baseline) | 0.659 | — | 0.39 | 0.51 | 0.74 | 454 |
| cand_gte_ml_base | 0.604 | -0.055 | 0.38 | 0.41 | 0.62 | 345 |
Decision (H3): bge-reranker-v2-m3 유지. gte 의 reranker quality 가 production 보다 약함 (korean_only -0.10, exam -0.12, overall -0.055).
후속 PR 백로그 (6건):
- PR-Search-Query-Rewrite-1 (Phase 2Q, korean_only/mixed 보완 권고)
- PR-2B-Extended-Mxbai-Large (sentence-transformers wrapper)
- PR-2B-Extended-Bge-V2-Gemma (FlagEmbedding LayerwiseReranker wrapper)
- PR-2B-Extended-Jina-V2-ML (license 결정 후, 개인 비영리 가정)
- PR-2B-Cloud-Reranker-Scaffold-1 (Cohere scaffold-only, 선택)
- PR-2B-Rerank-Cand-Cleanup-1 (1주 후 cand 컨테이너 정리)
production 영향:
- production reranker (bge-reranker-v2-m3) 변경 0
- config.yaml ai.models.rerank.endpoint 변경 0
- embedding (bge-m3 ollama) 변경 0 (Phase 2A 결정 보존)
- documents / document_chunks 변경 0 (21365 docs / 30605 chunks 그대로)
- 4 smoke PASS (baseline / baseline+snapshot / cand_gte_ml_base / cand_invalid → 400)
- dispatch log 박제 verify (endpoint + snapshot id)
closure gate: 16 항목 PASS (flex closure 조항 적용 — 1 후보 측정, 2 후보 TEI 호환 탈락 사유 명시).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 08:37:42 +00:00
hyungi
3092e3009d
feat(eval): Phase 2A Diagnose Phase 3+4 — dispatcher + 3 측정 + decision (H3 bge-m3 유지)
...
phase-2a-embedding-diagnose.md v4 § 6 (dispatcher) + § 7 Phase 3 (51 case 측정) + § 7 Phase 4 (decision)
Round 2 review: round-2-review-mighty-starfish.md (R2-2 + R2-B1 페어 invariant + slug-based resolve)
코드 변경:
- app/services/search/retrieval_service.py:
- CANDIDATE_BACKEND_MAP allowlist (baseline / cand_me5_large_inst / cand_snowflake_l_v2)
- _resolve_backend(slug) → docs_table/chunks_table/embed_endpoint or None
- _embed_query_via_tei() — candidate TEI 엔드포인트 호출 (cache 미사용)
- _VALID_DOCS_TABLE + _VALID_CHUNKS_TABLE regex (R2-B1 2단계 gate)
- _search_vector_docs / _search_vector_chunks: docs_table/chunks_table + snapshot_*_id_max 파라미터
- search_vector + search_vector_multilingual: embedding_backend + snapshot_*_id_max 파라미터 + dispatch log
- app/services/search/search_pipeline.py: run_search() 시그니처 + 4 search_vector* 호출 threading
- app/api/search.py: 3 Query parameter + ValueError → HTTP 400 (allowed list 응답)
- tests/search_eval/run_eval.py: --embedding-backend + --snapshot-doc-id-max + --snapshot-chunk-id-max
+ call_search/call_search_full/evaluate threading + main 3 asyncio.run threading
측정 산출물 (51 case, scored=46, failure=5):
- reports/v0_2_phase2a_baseline_snapshot_2026-05-23.csv (snapshot filter 적용 production path)
- reports/v0_2_phase2a_me5_large_inst_2026-05-23.csv
- reports/v0_2_phase2a_snowflake_l_v2_2026-05-23.csv
- tests/search_eval/baselines/v0_2_phase2a_{baseline_snapshot,me5_large_inst,snowflake_l_v2}_2026-05-23.json (3개)
결과:
| Candidate | NDCG | Δ vs baseline | mixed | korean_only | p50 ms |
|------------------------------------|-----:|--------------:|------:|------------:|-------:|
| bge-m3 (baseline snapshot) | 0.659| — | 0.39 | 0.51 | 464 |
| cand_me5_large_inst | 0.477| -0.182 | 0.17 | 0.47 | 194 |
| cand_snowflake_l_v2 | 0.616| -0.043 | 0.35 | 0.52 | 254 |
Decision (H3): bge-m3 유지. 둘 다 net 회귀.
- mE5-large-instruct: 전 카테고리 회귀 (-0.182). prefix 미적용 변수 — 별 PR PR-2A-mE5-Prefix-Retry 후보.
- snowflake_l_v2: 가벼운 회귀 (-0.043). korean_only +0.01 미세 개선 신호.
- korean_only/mixed 약점 보완은 Phase 2B (Reranker) 또는 Phase 2Q (Query rewrite) 권고.
Decision report: reports/phase_2a_embedding_decision_2026-05-23.md (§ 1~8 포함, Closure gate 16 항목 모두 PASS).
후속 PR 백로그:
- PR-2A-mE5-Prefix-Retry (별 PR)
- PR-2A-Extended-Bge-Mgemma2 (별 PR, v3 결정)
- PR-2A-Cloud-Embedding-Scaffold-1 (Cohere/Voyage scaffold-only, 선택)
- PR-Search-Query-Rewrite-1 (Phase 2Q)
- PR-Search-Reranker-V2-Diagnose (Phase 2B)
- PR-2A-Chunks-Cand-Cleanup-1 (1주 후 cand 테이블 DROP)
production 영향:
- documents / document_chunks 컬럼/row 변경 0
- config.yaml 변경 0 (ollama bge-m3 unchanged)
- 추가된 endpoint = query parameter opt-in (미지정 시 production path 회귀 0)
- smoke 4건 PASS (baseline / baseline+snapshot / cand_me5 / cand_invalid → HTTP 400)
- dispatch log 박제 verify (snapshot_doc/chunk_id_max 박제)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-23 06:55:13 +00:00
Hyungi Ahn
224843ba25
ops(reports): local research M1/M2/M3 baseline 등록 (2026-05-02)
...
- M1: ProcessingQueue throughput baseline (GPU DB pkm, read-only)
- M2: MLX gemma-4 26b-a4b 동시 처리 capacity (Mac mini :8801)
- M3: bge-m3 batch embedding throughput (GPU Ollama :11434)
3 보고서 모두 4.0 가드 준수 (compose/migration/queue/worker restart/source_channel insert/SearXNG 도입 0건). trade-in 직전 untracked sync.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 07:25:27 +09:00
Hyungi Ahn
b8575084b1
docs(search): DS-Mac-mini-26B-Priority-Gate-1 (B-1) closure 보고서
...
priority separation 완료. FIFO Semaphore → heap + inflight fair queueing.
10 site (FG 6 + BG 4) 교체. 동시성 1 유지, 모델 라우팅 변경 0.
검증 (V0~V4 all PASS):
- V0 사전 grep: query_analyzer = BACKGROUND 확정 (fire-and-forget only)
- V1 unit 6/6 PASS (FIFO / FG jump / preemption X / mixed / backward compat /
cancelled waiter skip)
- V2 PR-1 Layer 1 fixture 회귀 0 (10/10 HTTP 200, p50=11.1s 자연 회복)
- V3 synthetic FG jump: bg0 release → fg dispatch (bg1~4 jump). dispatch log
`mlx_gate dispatch priority=FOREGROUND seq=5 wait_ms=1502 queue_len=4`
- V4 legacy grep: user-facing 코드 잔재 0, Semaphore-like 패턴 0
후속 = Phase 2 (digest/briefing Semaphore 통합 + verifier/call_triage gate 안 +
starvation aging) + B-2 (throughput).
closure 4 필수 단락 포함: query_analyzer 판정 / study_explanation owner /
preemption 한계 / starvation WARN (post-deploy follow-up, closure gate 아님).
plan: ~/.claude/plans/hermes-polymorphic-rossum.md
2026-05-17 08:58:38 +09:00
Hyungi Ahn
7e346d2d3f
docs(search): DS-Synthesis-Timeout-Calibration-1 (B-3) closure 보고서
...
5곳 LLM_TIMEOUT_MS + 2곳 outer wait_for align (classifier 30s 와 동일 정책).
synthesis/evidence/verifier/query_analyzer 모두 동시 부하 시 30s 까지 필요.
Regression fixture 결과: 10/10 HTTP 200 + 5/5 search + 3/3 failure injection
모두 PASS (회귀 0). 응답 시간 +4~20s 증가 (안정성 ↑ 의도된 trade-off).
p95 12s gate 는 여전히 FAIL — B-1 Throughput-1 (priority queue / 모델 분리)
별 plan 으로 latency 단축 방향 진입.
2026-05-17 08:07:51 +09:00
Hyungi Ahn
117597c8aa
docs(hermes): PR-Hermes-Skill-Curl-Refine-2 (SHIPPED) + MaxTokens-Followup (PARTIAL+REVERTED)
...
Curl-Refine-2 (SHIPPED): 3 SKILL.md 본문 "Tool 선택 (필독)" 단락 추가 — terminal
direct curl 강조 + execute_code Python wrap 금지. E2E: Gemma 1st turn
execute_code → terminal 전환 + DS API 도달 0→1 + real corpus citations
("test-voice-memo", "The Good List") 첫 성공. Hard-Enforcement-1 의 hook 와
시너지 (1 call cap + 1st 정상 path).
MaxTokens-Followup 1차 (PARTIAL+REVERTED): agent.disabled_toolsets 15 toolsets
비활성 → stream 102KB→80KB 22% 감소. BUT Gemma terminal tool_call 시
"invalid tool call" 회귀 발생 → revert. toolset dependency graph 조사 후
minimal safe disabled list 결정 = 별 트랙 PR-Hermes-MaxTokens-Investigation-1.
A 카테고리 6 PR + 부산 Curl-Refine-2 모두 SHIPPED. PR-1/2 user-facing E2E 완성.
2026-05-17 07:51:02 +09:00
Hyungi Ahn
9458bea595
docs(hermes): PR-Hermes-MultiTurn-Hard-Enforcement-1 closure 보고서
...
Polish-1 의 prompt-only enforcement (PARTIAL) escalate. Shell hook
(~/.hermes/agent-hooks/docsrv_repeat_block.py) + config.yaml hooks.pre_tool_call.
execute_code/terminal tool_input 의 DS endpoint URL regex 검출 후 session-별
카운트 ≥ 1 면 silent block.
검증:
- Unit smoke 4/4 PASS
- E2E hook 매칭 2건 정확: 1st execute_code (Python wrap) allow → 2nd terminal
(direct curl) block. state={"docsrv_ask": 1}.
부산 발견: Gemma 의 1st turn code generation quality (Python f-string + curl
wrap → SyntaxError) 으로 DS API 실 호출 0 — Hermes/Adapter A 무관, 별 트랙
PR-Hermes-Skill-Curl-Refine-2 (P3).
2026-05-17 07:35:07 +09:00
Hyungi Ahn
dffc8b24dd
docs(hermes): PR-Hermes-Skill-Polish-1 closure 보고서
...
3 SKILL.md (docsrv_memo/search/ask) frontmatter 표준화 — prerequisites.env →
required_environment_variables (agentskills.io 표준). skill_view 시 자동
register_env_passthrough 발화 + config-level terminal.env_passthrough 와
이중 안전망.
docsrv_ask 본문: Multi-Turn 차단 정책 + Response Format verbatim 강화.
검증:
- Layer 1 fixture 회귀 0 (5/5 raw_leak, 3/3 finish_reason 동일)
- E2E: pre-polish 4 turn → post-polish 3 turn (25% 감소, but 목표 1 turn 도달 X)
— prompt-only enforcement 한계 명확화
결정:
- Skill-Curl-Refine-1 (frontmatter) = SHIPPED
- Multi-Turn-Refinement-1 (prompt) = PARTIAL — plugin-level escalate
- 신규 트랙 PR-Hermes-MultiTurn-Hard-Enforcement-1 (P2) 박힘 (Answer-Policy-1
과 통합 검토)
2026-05-17 07:13:53 +09:00
Hyungi Ahn
bd89d07b70
docs(hermes): PR-Hermes-Sandbox-Env-Propagation-1 closure 보고서
...
PR-Hermes-Docsrv-Search-1 / PR-Hermes-WebSearch-1 의 user-facing E2E 마지막 조각.
Adapter A 후 잔존한 401: execute_code/terminal 샌드박스가 HERMES_DOCSRV_TOKEN
strip. 해결 = ~/.hermes/config.yaml terminal.env_passthrough 1줄 추가.
검증:
- Direct: is_env_passthrough("HERMES_DOCSRV_TOKEN")=True, CLAUDE_API_KEY=False
(GHSA-rhgp-j443-p4rf provider blocklist 유지)
- E2E: Hermes chat → DS API 200 → conf=medium completeness=full + real corpus
citations ("test-voice-memo", "The Good List: 6 Things to Add Joy to Your Day")
PR-1/2 user-facing E2E unlock 완료 — Discord smoke 검증 진입 가능
(가족 onboarding 전 hyungi 채널 한정).
2026-05-17 06:37:35 +09:00
Hyungi Ahn
d3bc378c21
docs(hermes): PR-Hermes-ToolCall-Adapter-1 closure 보고서
...
mlx-proxy _stream_mlx 에 SSE filter 추가 — Gemma 4 raw <|tool_call> 토큰 leak
suppression + 구조화 tool_calls 시 finish_reason 'stop'→'tool_calls' override.
Layer 1 fixture (5 case): 5/5 raw_leak suppressed + 3/3 finish_reason override.
Hermes chat multi-turn agent loop unlocked (이전 hallucinated 종결 → tool 실행).
후속 = PR-Hermes-Sandbox-Env-Propagation-1 (execute_code 가
HERMES_DOCSRV_TOKEN inherit 못 함 — PR-1/2 user-facing E2E 마지막 조각).
2026-05-16 20:42:34 +09:00
Hyungi Ahn
e5345d7832
docs(hermes): PR-Hermes-WebSearch-1 closure 보고서
...
ddgs (DuckDuckGo) provider 활성. Layer 1 fixture 4/4 results (p95 12.3s, ddgs raw
latency 한계).
SearXNG (LocalScout PR-A 잔존) 활성화는 PR-2B 로 분리 — LAN-only bind 로 Mac mini
Tailscale 접근 불가. ddgs 1주 사용 후 SearXNG swap ROI 판정 예정.
channel_prompts 9줄 통합 (PR-1 4줄 + PR-2 web 분기 5줄). LLM tool-call 실제
실행은 Adapter A blocker — Layer 2/3 user-facing E2E 는 Adapter A closure 후.
2026-05-16 20:22:43 +09:00
Hyungi Ahn
d14064b225
docs(hermes): PR-Hermes-Docsrv-Search-1 closure 보고서
...
Hermes 의 첫 read-only orchestrator (docsrv_search + docsrv_ask skill) 구현 + DS-side
Mac mini 26B concurrent load 5건 fix closure.
핵심:
- Layer 1 curl-direct fixture 10/10 HTTP 200 + failure 3/3 PASS
- DS-side 5 commit 으로 race condition 해소 (LLM_TIMEOUT, gate, wait_for, config)
- Layer 2 Hermes CLI invoke 는 Gemma 4 tool-call leak 으로 hallucinated — Adapter A blocker
- Layer 3 Discord smoke 도 동일 — 사용자 검증은 Adapter A closure 후 이월
후속 5 별 트랙 명시.
2026-05-16 20:07:18 +09:00
hyungi
03a37c4b01
chore(reports): Phase 1/2 baseline + 2026-04~05 평가·관측 자료 보존
...
Phase 1.1a~1.3 / Phase 2.1~2.3 평가셋 측정 결과 + regression baseline + D9 STT 후속 VRAM 피크 관측 데이터.
project_search_v2 메모리에 Phase 2 평가셋 v0.2 baseline용 보존 명시.
2026-05-15 04:45:56 +00:00
Hyungi Ahn
08e7fed984
ops(search): reranker drift fix 사후 재측정 (postfix observation)
2026-05-13 12:06:20 +09:00
Hyungi Ahn
8f7871b443
ops(search): PR-RAG-Time-1 1주 후 재측정 PASS
...
baseline (2026-05-03) + week1 (2026-05-12) 두 측정 결과 JSON/MD 합본.
회귀 판정 4신호 모두 통과:
- top3 doc_id 변동: 0/6 쿼리
- freshness_ms max: 0.54ms (임계 10ms)
- total_ms max: 413ms (임계 500ms, warmup 후)
- policy 분포: 9/30 동일
별 이슈: reranker 404 drift 발견 (config.yaml endpoint = ollama 호출, 실제는 TEI 컨테이너). PR-RAG-Time-1 본질 회귀와 분리. 별 incident 트랙.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-12 15:41:40 +09:00
Hyungi Ahn
768fc36746
docs(storage): Storage PR-1 — read-only inventory + 정책 문서
...
Storage Backbone NAS 트랙의 첫 PR. plan v6 명시대로 read-only inventory PR
— 운영 변경 / mount 변경 / file_path 갱신 / asset 이동 모두 0건. 문서만.
산출물:
- docs/storage_layout.md 영구 정책 문서 (정책 / 마운트 매트릭스 / NFS 옵션 baseline)
- reports/storage_inventory_2026-05-11.md 측정 결과 snapshot
핵심 인사이트:
1. NAS binary layer 는 이미 잘 분리되어 있음 — PKM/extracted_images/
study_question_images 모두 이미 NAS. 추가 이관 PR-3/4 작업량 거의 없음.
2. 현 GPU NFS mount = plan v6 권고안 baseline 과 정확히 같음
(soft, vers=4.1, timeo=10, retrans=3) — PR-2 는 mount 옵션 변경 아닌
애플리케이션 layer (정규화 wrapper / 장애 처리 / uid 매핑) 에 집중.
3. fastapi 만 NAS rw, worker 는 ro — 원본 안전 분리 OK.
4. Postgres pgdata = 1.1GB (DB 본체 이관 안 함, plan 결정 = GPU 잔류).
5. PR-4 도입 시 extracted_emails/ 신규 디렉토리 추가 예정 (Storage PR-5 합류).
실측 명령: SSH 100.111.160.84 → df/mount/du/docker volume ls/docker run
-v ... alpine du. 모두 read-only. 운영 영향 0.
2026-05-11 07:23:28 +09:00
Hyungi Ahn
120db86d74
docs(search): Phase 2 최종 측정 보고서 (phase2_final.md + csv A/B)
...
## 결과 요약
Phase 1.3 baseline vs Phase 2 final A/B (평가셋 v0.1, 23 쿼리):
- Recall@10: 0.730 → 0.737 (+0.007)
- NDCG@10: 0.663 → 0.668 (+0.005)
- Top-3 hit: 0.900 → 0.900 (0)
- p95 latency: 171ms → 256ms (+85)
- news_crosslingual NDCG: 0.27 → 0.37 (+0.10 ✓)
- exact_keyword / natural_language_ko: 완전 유지 (회귀 0)
## Phase 2 게이트: 2/6 통과
✓ news_crosslingual NDCG ≥ 0.30
✓ latency p95 < 400ms
❌ Recall@10 ≥ 0.78 (0.737)
❌ Top-3 hit ≥ 0.93 (0.900)
❌ crosslingual_ko_en NDCG ≥ 0.65 (0.53, bge-m3 한계)
❌ 평가셋 v0.2 작성 (후속)
## 핵심 성과 (게이트 미달이지만 견고한 기반)
1. QueryAnalyzer async-only 아키텍처 (retrieval 차단 0)
2. semaphore concurrency=1 (MLX single-inference queue 폭발 방지)
3. multilingual narrowing (news/global 한정 → 회귀 0 + news 개선)
4. soft_filter boost 보수적 설정 (0.01, domain only)
5. prewarm 15개 → cache hit rate 70%+
## infra_inventory.md soft lock 준수
- config.yaml / Ollama / compose restart 변경 0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 15:52:21 +09:00
Hyungi Ahn
8021a1debd
test(search): Phase 0.5 fusion 전략 A/B 비교 결과
...
23개 평가셋 × 3 전략(legacy/rrf/rrf_boost) 측정 + 분석.
핵심 발견:
- 전체 NDCG: legacy 0.705 → rrf 0.699 → rrf_boost 0.700 (미세 차이)
- RRF가 약간 나쁜 이유: kw_001(산업안전보건법 제6장)에서 RRF가 4041
(근로기준법 안전과 보건)을 false positive로 promotion. NDCG 1.000→0.906.
- boost가 가치 입증한 사례: news_004(guerre en Iran)에서 RRF의 미스를
완벽 보정해 legacy NDCG 복원.
- RRF의 진짜 가치는 Phase 1+ 다중 신호(trigram, reranker, multi-query)
통합 시 발휘됨. 현 평가셋은 너무 단순해서 차이가 noise에 묻힘.
결정: rrf_boost를 default로 유지. Phase 1 후 재측정.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-07 09:25:49 +09:00
Hyungi Ahn
ec36ea3d6d
test(search): Phase 0.2 baseline 측정 결과
...
23개 쿼리에 대한 현재 검색(FTS+ILIKE+Vector hybrid) baseline.
Phase 1+ 개선 비교 기준점으로 보존.
전체: Recall@10 0.788 / NDCG@10 0.705 / Top-3 0.95 / p95 1695ms
핵심 약점 (Phase 1+ 타겟):
- news_crosslingual catastrophic (Recall 0.14) → domain-aware 필수
- failure-case precision 0/3 → confidence threshold 부재
- p95 1695ms (목표 500ms의 3배) → trigram/parallel retrieval
- nl 쿼리 top-3 ordering 약함 → chunk-level + reranker
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-07 08:22:53 +09:00