fix: 28.4k 문서 도그푸딩이 잡은 결함 3건 + eval 회귀 게이트 #233
Reference in New Issue
Block a user
Delete Branch "fix/lance-compaction"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
요약
나무위키 18,282 + Apache Jira 10,145 = 28,427 문서 / 600,808 청크 코퍼스로 종단 도그푸딩을 돌렸다. 기존 최대 규모(620 문서)의 46배라 그 규모에서는 드러날 수 없던 결함 3개가 나왔고, 셋 다 여기서 고친다. 더불어 골든셋이 실제로 무언가를 막을 수 있도록
eval compare에 회귀 게이트를 붙였다.상세 evidence 와 수치는
tasks/HOTFIXES.md의 2026-08-16 엔트리에 있다.1. Lance fragment 무한 누적 (이슈 #230 제안 2)
upsert가 asset 1건당merge_insert를 1회 호출하고 Lance 는 그때마다 새 테이블 버전 + fragment 를 만든다. manifest 는 그 시점의 전 fragment 를 나열하므로 N번째 쓰기가 N줄짜리 manifest 를 새로 쓴다 — 쓰기 비용이 문서 수에 비례하고 manifest 총량은 제곱으로 는다. 코드베이스 전체에optimize/compact_files/cleanup_old_versions호출이 0건이었다._versions/이슈 #230 이 11,229 문서에서 잰 메타/실데이터 비율은 2.5배였는데 16,828 문서에서는 7.2배였다 — 제곱 증가가 두 지점으로 확인됐다. 기존 테이블 1회 압축은 153초에 15 GB → 1.7 GB(행 365,991 보존)로 끝나므로, #230 본문의 "회복 수단이
reset --vector-only밖에 없다"는 서술은 사실이 아니다.같은 이슈의 삭제 경로 배치화(제안 1) · geodatafusion(제안 3) · doctor 지표(제안 4)는 미해결이라 #230 은 열어 둔다.
2. 묶음 인용 마커가
answer.v1에서 조용히 사라짐마커 추출 정규식이 괄호 하나에 마커 하나만 인정해서, 모델이 한 주장에 여러 근거를 다는
[#2, #10]형태를 못 잡았다.citations는 추출 마커와 packed entry 의 교집합이라 그 근거들이 배열에서 빠지고, 본문에는[#2]가 남아 사용자도 agent 도 해소할 수 없는 인용이 된다.SYSTEM_PROMPT_RAG_V4는[#번호]로 귀속하라고만 하고 한 괄호에 하나씩 쓰라고 지시한 적이 없으므로 모델 잘못이 아니다.실측(28.4k KB, "Spark shuffle OOM"): 본문 인용
1,2,6,7,8,9,10vscitations1,8,9,10→ 3건 끊김. 수정 후 7/7 해소.기존 엄격함(
vec![1]·[1]·[ #1 ]·[#foo]·[#1234]불인정)은 유지했다 — 답변에 Rust 코드가 섞일 때의 오탐 방지가 원래 목적이고 기존 테스트가 그걸 고정한다.3. ollama 요���이
max_tokens를 전송하지 않음GenerateRequest::max_tokens를 RAG 파이프라인이 계산해 넘기는데OllamaOptions가temperature/seed/num_ctx/stop만 직렬화하고 그 값을 버렸다. ollama 기본num_predict는 -1(무제한)이고 컨텍스트가 차면 창을 밀어 계속 생성한다. 연결에 바이트가 계속 흐르므로request_timeout_secs로도 못 막는다.eval run --with-rag216 질의가 1시간 45분에 21개만 끝냈고, 붙잡고 있던 질의 하나가 13 MB 를 받은 상태였다(15초에 142 KB 유입, ollama runner 198% CPU).num_predict전송 후 같은 216 질의가 31분에 완료됐다.4.
eval compare --fail-under(신규)이전에는 delta 만 출력하고 exit code 가 항상 0 이라 "회귀했는가"를 기계가 판정할 수 없었다.
empty_result_rate는 반대 방향으로 검사하고, A 에서 재던 지표가 B 에서 NaN 이 되면 위반으로 잡는다 — 골든셋이 ground truth 를 잃은 경우가 정확히 그 모양이라 조용히 통과시키면 안 된다.검증
num_predict1 ·--fail-under4citation_coverage1.0clippy는kebab-parse-code의 기존question_mark지적으로 red 인데 main 도 동일하며 이 PR 이 건드리지 않은 크레이트다 (rust 1.97.0 clippy 기준)시험 항목 (Test Plan)
cargo test --workspace --no-fail-fastcargo clippy -p {kebab-store-vector,kebab-rag,kebab-llm-local}통과cargo fmt --check— 변경 크레이트에 신규 지적 0 (kebab-rag 는 main 기준 이미 62건 있어 재포맷하지 않음)eval compare --fail-under통과/실패 양쪽 경로비범위
refusal_correctness 0.1667— 코퍼스에 없는 질의 6개 중 1개만 거절한다.grounded가 "마커를 달았는가"만 보기 때문이고, 방어 장치인rag.nli_threshold는 기본값이 0(꺼짐)이다. NLI 를 켜고 재측정하는 것이 후속 과제--fail-under는 신규 CLI flag 이므로 다음 release 는 minor bump 대상Assisted-by: Claude Code