덕랩 기술연구소 · 평가판 7개 · 모두 v1

한국어 문서 검색 벤치

첫 판: 법률 7개 분야 · 덕랩

점수표만 내지 않고, 어떻게 쟀는지를 같이 공개합니다. 시험지를 어떻게 만들었는지, 모델마다 어떤 형식으로 넣었는지, 어떤 버전·런타임으로 돌렸는지, 결과가 이상해 보여 무엇을 의심하고 다시 쟀는지, 틀렸던 것은 무엇이었는지, 잴 때 기계 상태는 어땠는지, 같은 숫자를 다시 내려면 무엇을 돌리면 되는지까지 적었습니다. 평가판마다 페이지를 따로 두었고, 거기서 문항마다 모델별 순위를 볼 수 있습니다.

github.com/lemontia/ko-doc-retrieval-bench — 실행기·평가판·결과를 모두 공개합니다. 코드는 MIT, 문항·정답·결과는 CC BY 4.0 입니다.

점수 — recall@10

질문 하나에 정답 문서가 정해져 있고, 모델이 코퍼스 전체에서 정답 문서를 몇 위로 올리는지 봅니다. 큰 숫자는 정답이 10위 안에 든 문항의 비율(recall@10)이고, 그 아래는 1위·5위 안 비율과 MRR 입니다. 파란 칸은 그 평가판에서 가장 높은 값입니다.

주 지표를 recall@10 으로 둔 이유: 정오표에서 정답을 더 찾아 넣은 것은 세 모델이 모두 10위 밖이던 문항뿐입니다. 10위 안에 든 문항에도 정답이 둘인 것이 섞여 있을 수 있어 recall@1 은 조금 낮게 나올 수 있습니다.

분야끼리 점수를 비교하지 않습니다. 코퍼스 크기가 1,519~6,445건로 달라서, 같은 분야 안에서 모델끼리만 비교합니다.

공개 문항

문항·정답·문항별 순위를 모두 공개합니다.

평가판BM25EmbeddingGemma 2EmbeddingGemma 2 GGUFBGE-M3KURE-v1KURE-v2
법령검색-v1
100문항
0.47
@1 0.17 · @5 0.30
MRR 0.249
0.53
@1 0.24 · @5 0.48
MRR 0.358
0.54
@1 0.24 · @5 0.46
MRR 0.358
0.74
@1 0.38 · @5 0.62
MRR 0.503
0.81
@1 0.42 · @5 0.74
MRR 0.553
0.92
@1 0.62 · @5 0.83
MRR 0.712
세무-v1
99문항
0.24
@1 0.10 · @5 0.21
MRR 0.157
0.38
@1 0.13 · @5 0.30
MRR 0.212
0.39
@1 0.13 · @5 0.26
MRR 0.211
0.58
@1 0.24 · @5 0.44
MRR 0.346
0.61
@1 0.20 · @5 0.48
MRR 0.337
0.67
@1 0.32 · @5 0.60
MRR 0.453
민사-v1
99문항
0.15
@1 0.07 · @5 0.10
MRR 0.100
0.36
@1 0.11 · @5 0.27
MRR 0.191
0.37
@1 0.09 · @5 0.26
MRR 0.182
0.44
@1 0.24 · @5 0.40
MRR 0.325
0.46
@1 0.27 · @5 0.42
MRR 0.345
0.61
@1 0.30 · @5 0.56
MRR 0.404
가사-v1
99문항
0.19
@1 0.04 · @5 0.15
MRR 0.104
0.41
@1 0.11 · @5 0.25
MRR 0.194
0.41
@1 0.12 · @5 0.26
MRR 0.203
0.54
@1 0.25 · @5 0.45
MRR 0.347
0.58
@1 0.29 · @5 0.51
MRR 0.392
0.60
@1 0.30 · @5 0.55
MRR 0.411
형사-v1
100문항
0.38
@1 0.08 · @5 0.29
MRR 0.173
0.62
@1 0.31 · @5 0.52
MRR 0.411
0.61
@1 0.31 · @5 0.54
MRR 0.411
0.73
@1 0.39 · @5 0.66
MRR 0.505
0.75
@1 0.37 · @5 0.67
MRR 0.494
0.72
@1 0.43 · @5 0.62
MRR 0.525
개인정보소비자-v1
100문항
0.50
@1 0.23 · @5 0.41
MRR 0.318
0.68
@1 0.34 · @5 0.60
MRR 0.452
0.68
@1 0.34 · @5 0.62
MRR 0.451
0.87
@1 0.41 · @5 0.76
MRR 0.571
0.85
@1 0.45 · @5 0.79
MRR 0.602
0.86
@1 0.48 · @5 0.80
MRR 0.625
행정-v1
100문항
0.43
@1 0.16 · @5 0.36
MRR 0.248
0.49
@1 0.19 · @5 0.42
MRR 0.298
0.51
@1 0.18 · @5 0.45
MRR 0.293
0.63
@1 0.32 · @5 0.55
MRR 0.428
0.68
@1 0.39 · @5 0.62
MRR 0.487
0.70
@1 0.43 · @5 0.67
MRR 0.537

숨긴 문항

질문·정답은 공개하지 않고 점수만 냅니다. 공개 문항과 같은 방법으로 만들었습니다. 50문항 안팎이라 판정 근거가 아니라 공개 점수와 크게 벌어지는지 보는 표시로만 씁니다.

평가판BM25EmbeddingGemma 2EmbeddingGemma 2 GGUFBGE-M3KURE-v1KURE-v2
법령검색-v1
50문항
0.42
@1 0.12 · @5 0.28
MRR 0.211
0.58
@1 0.22 · @5 0.48
MRR 0.347
0.56
@1 0.22 · @5 0.48
MRR 0.338
0.78
@1 0.38 · @5 0.72
MRR 0.538
0.86
@1 0.54 · @5 0.78
MRR 0.638
0.94
@1 0.66 · @5 0.90
MRR 0.749
세무-v1
50문항
0.24
@1 0.06 · @5 0.16
MRR 0.122
0.48
@1 0.18 · @5 0.38
MRR 0.276
0.48
@1 0.18 · @5 0.36
MRR 0.278
0.64
@1 0.20 · @5 0.54
MRR 0.345
0.68
@1 0.28 · @5 0.54
MRR 0.413
0.76
@1 0.34 · @5 0.70
MRR 0.514
민사-v1
50문항
0.30
@1 0.20 · @5 0.26
MRR 0.239
0.38
@1 0.24 · @5 0.30
MRR 0.278
0.38
@1 0.24 · @5 0.30
MRR 0.276
0.46
@1 0.24 · @5 0.40
MRR 0.325
0.62
@1 0.34 · @5 0.56
MRR 0.422
0.68
@1 0.42 · @5 0.64
MRR 0.512
가사-v1
50문항
0.34
@1 0.10 · @5 0.26
MRR 0.191
0.52
@1 0.16 · @5 0.38
MRR 0.267
0.50
@1 0.16 · @5 0.38
MRR 0.264
0.74
@1 0.30 · @5 0.58
MRR 0.419
0.74
@1 0.42 · @5 0.60
MRR 0.500
0.80
@1 0.48 · @5 0.68
MRR 0.559
형사-v1
50문항
0.26
@1 0.06 · @5 0.24
MRR 0.140
0.54
@1 0.18 · @5 0.44
MRR 0.302
0.56
@1 0.22 · @5 0.40
MRR 0.317
0.66
@1 0.36 · @5 0.58
MRR 0.470
0.80
@1 0.48 · @5 0.68
MRR 0.567
0.76
@1 0.48 · @5 0.74
MRR 0.597
개인정보소비자-v1
50문항
0.46
@1 0.22 · @5 0.38
MRR 0.304
0.58
@1 0.26 · @5 0.50
MRR 0.375
0.58
@1 0.26 · @5 0.52
MRR 0.382
0.82
@1 0.42 · @5 0.66
MRR 0.546
0.82
@1 0.56 · @5 0.80
MRR 0.659
0.84
@1 0.60 · @5 0.76
MRR 0.675
행정-v1
49문항
0.33
@1 0.08 · @5 0.22
MRR 0.161
0.43
@1 0.16 · @5 0.33
MRR 0.250
0.43
@1 0.14 · @5 0.33
MRR 0.240
0.63
@1 0.29 · @5 0.45
MRR 0.366
0.69
@1 0.35 · @5 0.61
MRR 0.453
0.82
@1 0.51 · @5 0.80
MRR 0.642

상용 API 는 약관을 확인하지 못해 넣지 않았습니다.

공통 — 어떻게 쟀나

  • 순위 매기는 법. 문서를 조각으로 나눠 조각마다 점수를 내고, 문서 점수는 그 문서 조각 중 가장 높은 값으로 합니다. 정답 문서가 몇 위인지 셉니다. 점수가 같은 문서가 있으면 정답을 뒤로 셉니다(정답에 불리하게). 정답이 여럿인 문항은 그중 가장 높은 순위를 씁니다.
  • 정오표. 문항 파일은 처음 쓴 그대로 두고, 고칠 것은 정오표에만 더해 읽을 때 적용합니다. 그때까지 잰 세 모델(BM25 · EmbeddingGemma 2 · KURE-v2)이 모두 10위 밖이던 법 분야 문항 216개를 분야별로 정답과 상위 3개 문서 전문을 놓고 다시 판정했습니다. 유효 171 · 정답이 더 있음 41 · 문항 불량 4 로 나왔고, 정답이 더 있는 문항은 정답을 더하고, 불량 문항은 이유를 남기고 뺐습니다. 판례가 바뀐 문항 하나는 정답을 새 판례로 바꿨습니다. 같은 사건의 복사본 판례는 하나만 남겼습니다(같은 판시 문장이라도 다른 사건이면 빼지 않음). 평가판마다 무엇을 고쳤는지는 평가판 페이지의 ‘틀렸던 것’에 있습니다.
  • 숨긴 문항. 평가판마다 공개 문항과 별도로 숨긴 문항을 두었습니다(문항 수는 위 표에). 질문·정답·문항별 순위는 내보내지 않고 점수만 공개합니다. 실행할 때 공개 문항과 숨긴 문항을 따로 넣습니다 — 질문도 묶어서 벡터로 바꾸므로 섞으면 묶음이 달라져 공개 문항 값이 흔들립니다. ‘전체’ 점수는 공개 문항만으로 냅니다.
  • v1 고정. 판을 공개한 뒤에는 코퍼스·문항·정답·채점 방법·넣는 형식을 바꾸지 않습니다. 묶어 넣는 방식·dtype·max_seq 도 시험 조건으로 같이 고정했습니다. 바꾸면 v2 이고, 다른 판의 점수와 한 표에 섞지 않습니다. 고정한 날과 파일 해시는 평가판 페이지에 있습니다.
  • 모델 6개. BM25 는 낱말 기준선입니다. EmbeddingGemma 2 는 원본 가중치(bf16)와 GGUF Q8_0(LM Studio) 두 가지로 쟀습니다. BGE-M3 는 KURE-v1 의 바탕 모델이라 같은 설정으로 재서 한국어 미세조정이 보탠 몫을 봅니다. KURE-v1 은 문서당 벡터 하나, KURE-v2 는 토큰마다 벡터를 두는 ColBERT 방식입니다.

기계 상태 — 색인 시간·지연·메모리 (법령검색-v1 만)

단독 측정이 아닙니다 — 측정 내내 다른 일의 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.0ms0.90 / 0.98GB안 잼0.47
EmbeddingGemma 2218.5초93.2ms31.61 / 47.95GB16.7MB0.53
EmbeddingGemma 2 GGUF안 잼 — LM Studio 안에서 돌아 같은 방법으로 메모리를 가를 수 없음
BGE-M3251.2초20.1ms8.73 / 12.52GB22.3MB0.74
KURE-v1268.1초21.2ms9.10 / 9.43GB22.3MB0.81
KURE-v2292.2초111.4ms21.92 / 42.33GB492.8MB (토큰 벡터 2,018,654개)0.92
  • 메모리는 색인하는 동안의 최대치입니다. 긴 판례를 묶어 넣을 때 PyTorch MPS 할당기가 잡은 양까지 들어갑니다. EmbeddingGemma 2 가 큰 것은 max_seq 8192·bf16·16건 묶음 탓으로 보이지만 확인하지 않았습니다. 질문만 받는 운영 상태의 메모리는 이보다 작을 것으로 보지만 재지 않았습니다.
  • 질문 하나 지연 = 질문 하나를 넣어 코퍼스 전체의 점수를 낼 때까지 걸린 시간입니다. 질문 10개로 재서 중앙값을 냈습니다.
  • KURE-v2 가 느린 것은 토큰 벡터 200만 개와의 MaxSim 을 근사 없이 직접 계산하기 때문입니다. 근사 색인(PLAID 등)을 쓰면 달라집니다.
  • 값이 비어 있는 칸은 0 이 아니라 재지 않은 것입니다.

틀렸던 것 — 지우지 않고 남깁니다

  • 다른 일의 llama-server 28GB 와 LM Studio Gemma 4 가 떠 있었다
    이렇게 둘로 적었는데 틀렸습니다. 같은 것이었습니다 — llama-server 는 LM Studio 가 모델을 돌리는 내부 프로세스입니다.
  • EmbeddingGemma 2 의 max_seq 를 2048 로 옮겼다
    이렇게 옮겼는데 틀렸습니다. 다른 곳에서 쓰던 운영값을 그대로 가져왔는데, 법령검색에는 2048 토큰을 넘는 판례가 있어 28건이 잘렸습니다(먼저 잰 벡터와 코사인 최소 0.961, 길이와 상관 -0.48). 결과도 @5 0.47 · MRR 0.356 으로 달랐습니다. 모델 카드 최대인 8192 로 고쳐 같아졌습니다.

옮기며 확인한 것 — 먼저 쓰던 측정 스크립트의 숫자가 이 실행기에서 다시 나오나

  1. 위 max_seq 건입니다.
  2. KURE 를 글자 길이 순으로 묶어 넣었더니 r@1 이 0.61 로 하나 달랐습니다. 넣은 글자는 같았습니다(토큰 벡터 수 2,072,219개로 똑같음). 먼저 잰 쪽은 토큰 길이 순으로 8건씩 묶었고, 묶음 구성이 바뀌면 MPS 에서 일부 토큰 벡터가 최대 0.095 달라졌습니다. 토큰 길이 순으로 고치니 100문항 순위가 전부 같아졌습니다. 그래서 묶는 방식도 시험 조건으로 보고 v1 에 같이 고정했습니다. 같은 길이끼리의 순서도 정하려고 정렬을 stable 로 바꿨습니다(먼저 잰 쪽은 기본 정렬이라 벡터 최대 차이 0.035 는 남습니다. 순위에는 영향이 없었습니다).
  3. EmbeddingGemma 2 는 bf16 으로 돕니다. transformers 5 의 기본 dtype 이 auto 라 모델 설정의 bf16 으로 올라옵니다. 정규화한 벡터 길이가 1 에서 ±0.4% 벗어난 것으로 알아챘습니다. 모델 파일에 dtype: bfloat16 을 적고, 실제 dtype 을 기록에 남기게 했습니다.

이 확인은 법령검색에서 같은 사건 복사본 판례를 빼기 전 코퍼스(해시 54c938f8c031, 5,829건)에서 한 것입니다. 지금 점수와 바로 같지는 않습니다.

다시 재는 법

레포를 받아 평가판 폴더와 모델 파일을 두고 아래 명령을 돌립니다. 모델마다 필요한 라이브러리 버전이 달라, 실행기가 모델 파일에 적힌 버전으로 임시 환경을 띄워 그 안에서 돕니다.

uv run bench.py run --model <이름>           # 평가판 전부. --suite 세무-v1 처럼 하나만
uv run bench.py compare kure2 gemma2         # 평가판별 지표 + McNemar (각 모델의 가장 최근 기록)

모델 이름: bm25gemma2gemma2-ggufbge-m3kure1kure2

평가판코퍼스 해시문서 수고정한 날
법령검색-v1c1a81d3ab0515,7142026-10-18
세무-v1a7e8fbf4ba4a6,4452026-10-19
민사-v1d5a107beed924,9102026-10-19
가사-v1ff932488147d1,5192026-10-19
형사-v1349154108e715,6182026-10-19
개인정보소비자-v1554ece2cfdae1,7202026-10-19
행정-v1f27f24bf76424,0102026-10-19
모델idrevision
BM25——
EmbeddingGemma 2google/embeddinggemma-2914f7f89142e33e77833254d9c9b90c3cef7303b
EmbeddingGemma 2 GGUFtext-embedding-embeddinggemma-2ggml-org/embeddinggemma-2-GGUF Q8_0
BGE-M3BAAI/bge-m35617a9f61b028005a4858fdac845db406aefb181
KURE-v1nlpai-lab/KURE-v18b418a58414668e75532ed045c22d9ca018ae2b2
KURE-v2nlpai-lab/KURE-v23431f86d399d666083890dbb882aced6708873bc

코퍼스 해시는 corpus.jsonl 의 sha256 앞 12자입니다. 문항·숨긴 문항·정오표 파일의 해시는 평가판 페이지에 있습니다.

평가판별 페이지

정답이나 잰 방법이 틀렸다고 보이면 알려 주세요

평가판 이름·문항 번호와 이유를 적어 varkiry05@gmail.com 로 보내 주세요.