전처리가 BM25에는 듣고 dense에는 안 듣는 자리: 남은 것은 소문자화 하나였다
소문자화·구두점 제거·불용어 제거를 BM25와 dense에 각각 걸어 영어와 한국어에서 쟀다. 값을 한 것은 영어 BM25의 소문자화 하나뿐이었고, 그것마저 dense 토크나이저가 이미 공짜로 하고 있었다.
PALDYN RESEARCH
논문을 읽고, 도구를 비교하고, 작은 실험으로 직접 확인한 것을 남깁니다.
소문자화·구두점 제거·불용어 제거를 BM25와 dense에 각각 걸어 영어와 한국어에서 쟀다. 값을 한 것은 영어 BM25의 소문자화 하나뿐이었고, 그것마저 dense 토크나이저가 이미 공짜로 하고 있었다.
KorQuAD 질의 5,774개를 앞에서부터 4~28토큰으로 잘라 가며 Recall@1을 쟀다. 어디까지가 사실상 공짜인지 찾으려 했는데, 마지막 12%의 꼬리를 자른 28토큰조차 신뢰구간이 0을 배제했다.
같은 검색 결과에 다섯 지표를 전부 적용해 1위가 뒤바뀌는 자리를 전수로 찾고, 짝지은 부트스트랩으로 판정했다. 반전 하나는 진짜였고 하나는 300질의가 만든 잡음이었다. 앞선 글들의 결론도 이 자로 다시 쟀다.
HNSW·IVF·Annoy·ScaNN을 크기와 차원이 똑같은 두 코퍼스에 걸었다. 파라미터를 한 글자도 바꾸지 않았는데 recall이 3.3배 갈렸고, 난수 쪽에서는 ANN이 완전탐색을 이기는 칸이 하나도 없었다.
같은 LangChain 분할기가 마크다운에서 1.9%, 줄바꿈 없는 평문에서 95.8% 문장을 자른다. 그리고 400질의 부트스트랩에서 그 95.8%는 검색 점수를 바꾸지 못했다.
KLUE STS와 KorQuAD 검색을 같은 CPU에서 함께 재니 두 순위가 어긋났다. 갈라놓은 것은 모델의 품질이 아니라 max_seq_length였고, 창이 512 이상인 셋은 서로 구분되지 않았다.
계획은 게이트된 모델을 비교에서 뺄 셈이었다. 같은 저장소에서 config.json은 GatedRepoError로 죽고 LICENSE는 7,550자가 그대로 내려왔다. 비교를 막은 것은 게이트가 아니라 약관 파일 자체가 없는 다섯이었다.
2차 출처의 deprecation_date 554개로 은퇴 달력을 세우려 했더니 38.8%가 이미 지난 날짜였다. 문서와 대조 가능한 15개는 예외 없이 폐기 통보일이 아니라 은퇴일이었고, 강제 이전 일곱 경로 중 하나는 청구액이 4배가 됐다.
배치 할인율은 문서 표 8행과 2차 출처 109행에서 정확히 0.5였다. 흔들리는 것은 할인율이 아니라 그 위에 겹친 캐시다. 문서가 밝힌 배치 캐시 적중률 30~98%의 아래쪽 절반에서는 캐시를 켠 쪽이 더 비싸다.
모델 3,040개의 입력·출력 상한을 전수로 재니 창이 1M 이상인 363행의 배율 중앙값이 15.6이었다. 1M은 넣을 수 있는 양이지 받을 수 있는 양이 아니고, 한국어로 환산하면 문서가 암시하는 400만 자가 아니라 132만 자다.
캐시 손익분기를 닫힌 식으로 풀어 벤더 문서의 서술과 대조했다. 식은 문서와 정확히 맞았지만, 진짜 분기점은 읽기 횟수가 아니라 TTL을 넘는 요청 간격이다 — 그 자리에서 캐시는 안 쓰느니만 못해진다.
openai·anthropic·google-genai 파이썬 SDK를 가짜 서버에 붙여 재시도 횟수·백오프·타임아웃 기본값을 직접 쟀다. 같은 인자 이름이 세 SDK에서 다른 뜻이고, 한 SDK는 재시도 상수를 정의해 두고 쓰지 않는다.
Anthropic과 Google의 가격 문서는 둘 다 4자를 1토큰으로 환산한다. 우리 글 168만 자로 재니 1.12~2.27자였고, 같은 작업의 청구서가 문서 환산의 1.76~3.58배로 나왔다. 200K 경계도 80만 자가 아니라 22만 자에서 온다.
같은 한국어 문단을 토크나이저 아홉 개에 넣어 재니 자/토큰이 0.89에서 2.67까지 3배로 벌어졌다. 어휘 크기와의 상관은 0.078로 사실상 0이었고, 2.0자를 넘긴 것은 한국어를 따로 학습한 둘뿐이다.
MT-Bench 인간 판정 3,355건으로 GPT-4 심판의 일치도를 직접 계산했다. 논문의 85%는 재현되지만 같은 데이터가 무승부 처리에 따라 66.17%에서 88.40%까지 움직인다. 우연 보정을 걸면 카파는 0.4827이다.
논문 Table 1의 69개 모델을 원문에서 긁어 다시 계산했다. 40~70%대 23개가 전부 하락한다는 주장도, 최전선 모델이 안 떨어진다는 주장도 그대로 재현된다. 그런데 유의한 34개는 Bonferroni에서 16개로 줄고, 프롬프트를 바꾸면 다섯 모델의 부호가 뒤집힌다.
재적합 계수는 실제 Chinchilla 70B를 3.2% 오차로 맞히는데 원논문 Approach 3 계수는 40.3B를 내놓는다. 덤으로 원논문이 보고한 a의 점추정 0.4565가 자기가 보고한 구간 [0.454, 0.455] 밖에 있다는 것도 잡혔다.
세 접근법이 낸 예측을 표에서 직접 나눠 봤다. 토큰/파라미터가 20 근처에 머무는 것은 Approach 1 열뿐이고 파라메트릭 적합 열은 23에서 142까지 간다. 세 예측은 실험을 돌린 구간에서 7% 안이지만 예산을 열 자릿수 밀면 2.6배로 벌어진다.
논문 Table 3을 HTML에서 직접 파싱해 스무 행을 복원하고, params가 적힌 열 행의 파라미터 수를 shape 산술로 다시 셌다. 논문이 §5.1에 적은 어휘 37,000으로는 어느 행도 맞지 않는다. 아홉 행은 40,932~41,160이라는 한 창에서 동시에 성립하고 big 한 행만 35,296~36,272를 요구해 교집합을 깬다.
Malkov & Yashunin(arXiv:1603.09320)의 M 권장 범위와 메모리 공식을 scifact 5,183 벡터에서 다시 쟀다. 범위 5~48은 이 규모에서도 성립했지만 §4.2.3의 공식은 M=64에서 실측보다 9.4% 크다. 원인은 위층 층수를 mL로 잡은 자리이고, 같은 논문의 레벨 생성 규칙에서 나오는 값은 1/(M−1)이다.
MRL(arXiv:2205.13147)은 앞 m차원만 써도 된다고 말한다. 손실만 다른 mpnet 두 개를 scifact에서 재니 절단 유지율이 여섯 자리 중 다섯에서 동률이었고, 갈린 곳은 훈련 중첩 차원의 맨 아래인 64차원 하나였다. 그리고 MRL 아닌 모델은 PCA가 절단을 거의 모든 자리에서 이겼다.
순위 융합 논문(Cormack 외, SIGIR 2009)은 제목이 곧 주장이다 — RRF가 Condorcet과 개별 시스템을 이긴다. KorQuAD 문단 960개·질의 5,774개에서 시스템 셋을 융합해 다시 재니 RRF가 네 융합 방식 중 꼴찌였다. Condorcet이 R@1에서 0.0521 앞섰고, RRF는 최고 단독 시스템보다도 0.0402 낮았다.
iid 좌표에서 차원이 오르면 최근접과 최원접이 같아진다는 Beyer(1999)의 상대대비를 재현하니 384차원 균등난수에서 0.25까지 떨어졌다. 그런데 같은 지표를 scifact 실제 임베딩 384차원에 재니 0.83으로, iid 64차원 수준이었다. 정규화 때문이 아니다 — PCA로 잰 내재 차원이 참여율 65, 두 측정이 같은 수를 가리켰다.
BEIR 논문(arXiv:2104.08663) Table 2를 직접 세니 BM25는 DPR을 18개 중 17개에서, ANCE를 14개에서 이긴다. 그런데 우리 실험대에서 scifact를 다시 재니 BM25 0.6617과 dense 0.6451의 차이는 300질의 부트스트랩 구간 [-0.022, +0.055] 안이었다. '제로샷에서 BM25가 이긴다'가 참인 경계는 dense의 세대였다.