한국어 문서 검색 벤치 · v1 · 고정일 2026-10-18
법령검색-v1
노동법령 조문 2,346 + 판례 3,483 에서 실무 상담 말투 질문의 정답 문서 하나를 찾는다 (known-item) · 코퍼스 문서 5,714건 · 공개 문항 100 · 숨긴 문항 50
묶음별 점수
큰 숫자는 recall@10, 아래는 @1 · @5 · MRR 입니다. ‘전체’는 공개 문항 전부, ‘숨김’은 숨긴 문항만입니다(따로 셉니다). 다른 평가판과 점수를 비교하지 않습니다.
| 모델 | 전체 | 조문 | 판례 | 숨김 |
|---|---|---|---|---|
| BM25 | 0.47 0.17 · 0.30 · 0.249 | 0.46 0.14 · 0.26 · 0.214 | 0.50 0.23 · 0.40 · 0.329 | 0.42 0.12 · 0.28 · 0.211 |
| EmbeddingGemma 2 | 0.53 0.24 · 0.48 · 0.358 | 0.57 0.27 · 0.53 · 0.394 | 0.43 0.17 · 0.37 · 0.274 | 0.58 0.22 · 0.48 · 0.347 |
| EmbeddingGemma 2 GGUF | 0.54 0.24 · 0.46 · 0.358 | 0.57 0.27 · 0.51 · 0.394 | 0.47 0.17 · 0.33 · 0.274 | 0.56 0.22 · 0.48 · 0.338 |
| BGE-M3 | 0.74 0.38 · 0.62 · 0.503 | 0.74 0.40 · 0.63 · 0.518 | 0.73 0.33 · 0.60 · 0.468 | 0.78 0.38 · 0.72 · 0.538 |
| KURE-v1 | 0.81 0.42 · 0.74 · 0.553 | 0.81 0.44 · 0.73 · 0.574 | 0.80 0.37 · 0.77 · 0.505 | 0.86 0.54 · 0.78 · 0.638 |
| KURE-v2 | 0.92 0.62 · 0.83 · 0.712 | 0.90 0.59 · 0.83 · 0.686 | 0.97 0.70 · 0.83 · 0.773 | 0.94 0.66 · 0.90 · 0.749 |
묶음별 문항 수: 조문 70 · 판례 30
짝지은 검정 — McNemar
같은 문항을 두 모델이 풀었을 때, 한쪽만 맞힌 문항 수를 비교합니다(정확 이항 양측 검정). 점수가 바짝 붙은 문항은 기계·묶음에 따라 순위가 바뀔 수 있어, 두세 문항 차이는 모델 차이로 읽지 않고 이 검정을 같이 봅니다. 공개 문항 중 두 모델 모두 순위가 있는 문항만 씁니다.
숨긴 문항은 문항별 순위를 공개하지 않아 여기서 계산하지 않습니다. 숨긴 50문항은 McNemar 힘이 약해 판정 근거가 아니라 공개 점수와 크게 벌어지는지 보는 표시로만 씁니다.
| KURE-v2 대 | @1 KURE-v2만 · 상대만 · p | @5 KURE-v2만 · 상대만 · p | @10 KURE-v2만 · 상대만 · p |
|---|---|---|---|
| BM25 | 46 · 1 · p 6.8e-13 | 54 · 1 · p 3.1e-15 | 45 · 0 · p 5.7e-14 |
| EmbeddingGemma 2 | 41 · 3 · p 1.6e-9 | 38 · 3 · p 1.0e-8 | 39 · 0 · p 3.6e-12 |
| EmbeddingGemma 2 GGUF | 41 · 3 · p 1.6e-9 | 39 · 2 · p 7.8e-10 | 38 · 0 · p 7.3e-12 |
| BGE-M3 | 30 · 6 · p 7.0e-5 | 23 · 2 · p 1.9e-5 | 18 · 0 · p 7.6e-6 |
| KURE-v1 | 26 · 6 · p 5.4e-4 | 11 · 2 · p 0.022 | 13 · 2 · p 0.0074 |
흐린 글씨는 p 가 0.05 이상인 칸입니다.
이 평가판은 어떻게 쟀나
1. 시험지를 만든 법
- 노동법령 조문과 판례에서 실무 상담 말투 질문의 정답 문서 하나를 찾는 시험입니다. 공개 문항은 조문 70 · 판례 30 입니다.
- 정답 문서를 시드로 뽑고, 질문은 Claude 가 실무 상담 말투로 썼습니다. 숨긴 문항도 같은 방법이고, 법 이름·조문 번호를 질문에 쓰지 않게 했습니다.
- 숨긴 문항의 정답 문서는 공개 문항과 같은 거르기에 공개 문항 정답을 더 빼고 뽑았습니다(시드 20261018). 본문이 코퍼스에 둘 이상인 문서는 빠지므로 공개 정답과 본문이 같은 문서도 빠집니다.
- 평가판 설명의 문서 수(조문·판례)는 처음 만들 때 값입니다. 같은 사건 복사본 판례 115건을 뺀 지금 코퍼스는 5,714건입니다.
만든 기록: deoklab-content/dev/beopjido/bench/embed (2026-10-17, 시드 20261017) — 만든 방법은 그 폴더 results.md
2. 낱말 겹침
겹침 = 질문을 두 글자씩 자른 조각 가운데 정답 문서에도 나오는 조각의 비율입니다(조문은 법 이름·조 제목까지 문서로 봅니다). 0.45 이상이면 질문을 다시 썼습니다. 낱말이 많이 겹치면 낱말 검색만으로도 맞히기 쉬워져서입니다. 공개 문항 겹침: 평균 0.224 · 최대 0.440. 숨긴 문항 겹침: 평균 0.192 · 최대 0.385.
다시 쓴 문항: 공개 100문항 중 5문항을 다시 썼다(한 문항은 두 번). 숨김 50문항은 겹침 때문에 다시 쓴 문항 0, 정답이 둘로 읽혀 고친 문항 1
| 겹침 구간 | 문항 수 | BM25 r@10 | EmbeddingGemma 2 r@10 | EmbeddingGemma 2 GGUF r@10 | BGE-M3 r@10 | KURE-v1 r@10 | KURE-v2 r@10 |
|---|---|---|---|---|---|---|---|
| 0.00 이상 0.10 미만 | 12 | 0.00 | 0.25 | 0.25 | 0.67 | 0.67 | 0.83 |
| 0.10 이상 0.20 미만 | 31 | 0.35 | 0.48 | 0.48 | 0.71 | 0.74 | 0.87 |
| 0.20 이상 0.30 미만 | 30 | 0.47 | 0.63 | 0.63 | 0.80 | 0.87 | 0.93 |
| 0.30 이상 0.45 미만 | 27 | 0.81 | 0.59 | 0.63 | 0.74 | 0.89 | 1.00 |
구간별 r@10 은 공개 문항의 순위로 이 페이지에서 계산한 값입니다.
3. 모델마다 넣은 형식
- BM25
k1=1.5b=0.75낱말 기준선입니다. 한글·숫자·영문만 남기고 두 글자씩 잘라 BM25 식으로 점수를 매기고, 낱말 희소도(idf)는 그 평가판 코퍼스 하나로 셉니다.
- EmbeddingGemma 2질문:
"task: search result | query: {q}"문서:"title: {title} | text: {body}"원본 가중치입니다. 넣는 형식은 모델 카드 원문 그대로입니다. max_seq 는 카드 최대인 8192 — 2048 이면 법령검색의 긴 판례 28건이 잘립니다. dtype 은 transformers 5 기본값(auto)이 고르는 bf16 입니다.
- EmbeddingGemma 2 GGUF질문:
"task: search result | query: {q}"문서:"title: {title} | text: {body}"GGUF Q8_0 입니다. LM Studio 에 문맥 8192(-c 8192)로 올린 뒤 쟀습니다. 넣는 형식은 원본과 같습니다.
- BGE-M3질문:
"{q}"문서:"{title}\n{body}"문서(판례):"{body}"KURE-v1 의 바탕 모델입니다. KURE-v1 과 같은 설정·같은 라이브러리 버전으로 재서 한국어 미세조정이 보탠 몫을 봅니다. 모델 카드에 접두어가 없어 붙이지 않았습니다.
- KURE-v1질문:
"{q}"문서:"{title}\n{body}"문서(판례):"{body}"BGE-M3 를 미세조정한 모델로, 문서당 벡터가 하나입니다. KURE-v2 와 같은 입력 형식으로 넣었습니다 — 두 모델의 점수 차이가 방식(벡터 하나 대 토큰마다 벡터) 차이인지 보려고. max_seq 는 카드 설정 그대로입니다.
- KURE-v2질문:
"{q}"문서:"{title}\n{body}"문서(판례):"{body}"ColBERT 방식(토큰마다 벡터)입니다. 질의·문서 접두어 [Q]/[D] 와 질의 64토큰 확장은 pylate 가 카드 설정대로 붙입니다. 질의 상한이 64토큰이라 긴 질문(사연형)은 잘립니다. 판례는 본문만 넣습니다 — 법령검색 판례 본문이 사건명으로 시작해서 먼저 잰 기록과 같게 했습니다.
4. 런타임·양자화·버전
| 모델 | 런타임 · id · revision | dtype · max_seq · 차원 | 라이브러리 (requires → 실제) | 잰 시각 |
|---|---|---|---|---|
| BM25 | bm25 | — · — · — | python 3.14.7 · numpy 2.5.4 | 2026-10-19 08:22:42 |
| EmbeddingGemma 2 | stgoogle/embeddinggemma-2914f7f89142e33e77833254d9c9b90c3cef7303b | torch.bfloat16 · 8192 · 768 | sentence-transformers==6.1.0 transformers==5.19.0 torch==2.14.1 torchvision==0.29.1 pillowpython 3.14.7 · numpy 2.5.4 · torch 2.14.1 · sentence_transformers 6.1.0 · transformers 5.19.0 | 2026-10-19 08:29:30 |
| EmbeddingGemma 2 GGUF | lmstudiotext-embedding-embeddinggemma-2ggml-org/embeddinggemma-2-GGUF Q8_0 | — · — · 768 | python 3.14.7 · numpy 2.5.4 | 2026-10-18 21:41:34 |
| BGE-M3 | stBAAI/bge-m35617a9f61b028005a4858fdac845db406aefb181 | torch.float32 · 8192 · 1024 | sentence-transformers==6.1.0 transformers==5.19.0 torch==2.14.1python 3.14.7 · numpy 2.5.4 · torch 2.14.1 · sentence_transformers 6.1.0 · transformers 5.19.0 | 2026-10-19 08:36:07 |
| KURE-v1 | stnlpai-lab/KURE-v18b418a58414668e75532ed045c22d9ca018ae2b2 | torch.float32 · 8192 · 1024 | sentence-transformers==6.1.0 transformers==5.19.0 torch==2.14.1python 3.14.7 · numpy 2.5.4 · torch 2.14.1 · sentence_transformers 6.1.0 · transformers 5.19.0 | 2026-10-19 08:42:54 |
| KURE-v2 | pylatenlpai-lab/KURE-v23431f86d399d666083890dbb882aced6708873bc | — · — · — | pylate==1.6.0 transformers==5.3.0 torch==2.11.0python 3.14.7 · numpy 2.5.4 · torch 2.11.0 · sentence_transformers 5.3.0 · transformers 5.3.0 · pylate 1.6.0 | 2026-10-19 08:51:27 |
dtype 은 실행 기록에 남은 실제 값이고, 없으면 모델 파일 값입니다. ‘—’ 는 그 모델에 해당 설정이 없거나 기록되지 않은 것입니다. 실행 기록의 기계는 모두 arm64(맥북)이고, GGUF 는 LM Studio 에서 돌렸습니다.
5. 점검과 의심
- EmbeddingGemma 2 와 KURE-v2 의 차이가 커서 Gemma 쪽 실행 경로부터 의심했습니다. 원본 bf16 으로 다시 재서 같은 결과를 얻었습니다(벡터 코사인 0.996, 2026-10-17).
- 이 실행기로 옮긴 뒤, 먼저 쓰던 측정 스크립트(2026-10-17)의 숫자가 다시 나오는지 문항별 순위까지 대조했습니다.
| 모델 | 먼저 쓰던 스크립트 r@1 · @5 · @10 · MRR | 이 실행기 | 문항별 순위 |
|---|---|---|---|
| BM25 | 0.17 · 0.30 · 0.46 · 0.246 | 같음 | 100/100 같음 |
| KURE-v2 | 0.62 · 0.83 · 0.92 · 0.712 | 같음 | 100/100 같음 |
| EmbeddingGemma 2 (원본 bf16) | 0.24 · 0.48 · 0.52 · 0.357 | 같음 | 90/100 같음. 나머지 10문항은 모두 13위 밖에서 1~17칸 차이(1·5·10위 경계를 넘지 않음) |
| EmbeddingGemma 2 GGUF | 0.24 · 0.46 · 0.54 · 0.358 | 같음 | 100/100 같음 (LM Studio 에 -c 8192 로 올려 잼) |
이 대조는 같은 사건 복사본 판례를 빼기 전 코퍼스(해시 54c938f8c031, 5,829건)에서 한 것이라 지금 점수와 바로 같지 않습니다. 옮기다 틀린 것은 요약 페이지의 ‘틀렸던 것’에 있습니다.
- 숨긴 문항 하나는 같은 제목의 시행령 조문과 내용이 맞물려 정답이 하나로 좁혀지지 않을 수 있습니다. 모든 모델에 같은 조건이라 그대로 두었습니다.
6. 틀렸던 것 — 정오표
- 제외: 없음
- 정답 추가: 없음
- 정답 교체: 없음
- 중복 판례 정리: 같은 사건의 복사본 115건을 코퍼스에서 뺐습니다. 같은 판시 문장이라도 다른 사건이면 빼지 않았습니다.
- 숨긴 문항: 0문항을 고쳤습니다(어느 문항인지는 공개하지 않습니다).
7. 기계 상태
단독 측정이 아닙니다 — 측정 내내 다른 일의 LLM(Gemma 4 26B)이 메모리 약 28GB를 쓰고 있었습니다.
법령검색-v1 · 2026-10-19 08:22:36 ~ 2026-10-19 08:51:27 · M5 Max 128GB · MPS · 모델마다 빈 캐시에서 색인부터 · 모델 사이 120초 식힘
| 모델 | 색인 | 질문 하나 지연 | 메모리 최대 증가 wired / used | 저장 | r@10 |
|---|---|---|---|---|---|
| BM25 | 안 잼 | 3.0ms | 0.90 / 0.98GB | 안 잼 | 0.47 |
| EmbeddingGemma 2 | 218.5초 | 93.2ms | 31.61 / 47.95GB | 16.7MB | 0.53 |
| EmbeddingGemma 2 GGUF | 안 잼 — LM Studio 안에서 돌아 같은 방법으로 메모리를 가를 수 없음 | ||||
| BGE-M3 | 251.2초 | 20.1ms | 8.73 / 12.52GB | 22.3MB | 0.74 |
| KURE-v1 | 268.1초 | 21.2ms | 9.10 / 9.43GB | 22.3MB | 0.81 |
| KURE-v2 | 292.2초 | 111.4ms | 21.92 / 42.33GB | 492.8MB (토큰 벡터 2,018,654개) | 0.92 |
- 메모리는 색인하는 동안의 최대치입니다. 긴 판례를 묶어 넣을 때 PyTorch MPS 할당기가 잡은 양까지 들어갑니다. EmbeddingGemma 2 가 큰 것은 max_seq 8192·bf16·16건 묶음 탓으로 보이지만 확인하지 않았습니다. 질문만 받는 운영 상태의 메모리는 이보다 작을 것으로 보지만 재지 않았습니다.
- 질문 하나 지연 = 질문 하나를 넣어 코퍼스 전체의 점수를 낼 때까지 걸린 시간입니다. 질문 10개로 재서 중앙값을 냈습니다.
- KURE-v2 가 느린 것은 토큰 벡터 200만 개와의 MaxSim 을 근사 없이 직접 계산하기 때문입니다. 근사 색인(PLAID 등)을 쓰면 달라집니다.
- 값이 비어 있는 칸은 0 이 아니라 재지 않은 것입니다.
8. 다시 재는 법
uv run bench.py run --model <이름> --suite 법령검색-v1 uv run bench.py compare kure2 gemma2
- 코퍼스 해시:
c1a81d3ab051 - 고정 시점 코퍼스 해시:
c1a81d3ab051 - 고정 시점 공개 문항 해시:
599b85f99fef - 고정 시점 숨긴 문항 해시:
39d7a138dab2
해시는 각 파일 sha256 의 앞 12자입니다. 모델 revision 은 4번 표에 있습니다.
공개 문항 100개
100개 · 숫자는 모델마다 정답 문서의 순위입니다(초록 = 10위 안, 진한 초록 = 1위) · 행을 누르면 정답 문서 id 가 열립니다
정답이나 잰 방법이 틀렸다고 보이면 알려 주세요
평가판 이름·문항 번호와 이유를 적어 varkiry05@gmail.com 로 보내 주세요.