덕랩 기술연구소 · 평가판 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건로 달라서, 같은 분야 안에서 모델끼리만 비교합니다.
공개 문항
문항·정답·문항별 순위를 모두 공개합니다.
| 평가판 | BM25 | EmbeddingGemma 2 | EmbeddingGemma 2 GGUF | BGE-M3 | KURE-v1 | KURE-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문항 안팎이라 판정 근거가 아니라 공개 점수와 크게 벌어지는지 보는 표시로만 씁니다.
| 평가판 | BM25 | EmbeddingGemma 2 | EmbeddingGemma 2 GGUF | BGE-M3 | KURE-v1 | KURE-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.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 이 아니라 재지 않은 것입니다.
틀렸던 것 — 지우지 않고 남깁니다
다른 일의 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 로 고쳐 같아졌습니다.
옮기며 확인한 것 — 먼저 쓰던 측정 스크립트의 숫자가 이 실행기에서 다시 나오나
- 위 max_seq 건입니다.
- KURE 를 글자 길이 순으로 묶어 넣었더니 r@1 이 0.61 로 하나 달랐습니다. 넣은 글자는 같았습니다(토큰 벡터 수 2,072,219개로 똑같음). 먼저 잰 쪽은 토큰 길이 순으로 8건씩 묶었고, 묶음 구성이 바뀌면 MPS 에서 일부 토큰 벡터가 최대 0.095 달라졌습니다. 토큰 길이 순으로 고치니 100문항 순위가 전부 같아졌습니다. 그래서 묶는 방식도 시험 조건으로 보고 v1 에 같이 고정했습니다. 같은 길이끼리의 순서도 정하려고 정렬을 stable 로 바꿨습니다(먼저 잰 쪽은 기본 정렬이라 벡터 최대 차이 0.035 는 남습니다. 순위에는 영향이 없었습니다).
- 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
| 평가판 | 코퍼스 해시 | 문서 수 | 고정한 날 |
|---|---|---|---|
| 법령검색-v1 | c1a81d3ab051 | 5,714 | 2026-10-18 |
| 세무-v1 | a7e8fbf4ba4a | 6,445 | 2026-10-19 |
| 민사-v1 | d5a107beed92 | 4,910 | 2026-10-19 |
| 가사-v1 | ff932488147d | 1,519 | 2026-10-19 |
| 형사-v1 | 349154108e71 | 5,618 | 2026-10-19 |
| 개인정보소비자-v1 | 554ece2cfdae | 1,720 | 2026-10-19 |
| 행정-v1 | f27f24bf7642 | 4,010 | 2026-10-19 |
| 모델 | id | revision |
|---|---|---|
| BM25 | — | — |
| EmbeddingGemma 2 | google/embeddinggemma-2 | 914f7f89142e33e77833254d9c9b90c3cef7303b |
| EmbeddingGemma 2 GGUF | text-embedding-embeddinggemma-2 | ggml-org/embeddinggemma-2-GGUF Q8_0 |
| BGE-M3 | BAAI/bge-m3 | 5617a9f61b028005a4858fdac845db406aefb181 |
| KURE-v1 | nlpai-lab/KURE-v1 | 8b418a58414668e75532ed045c22d9ca018ae2b2 |
| KURE-v2 | nlpai-lab/KURE-v2 | 3431f86d399d666083890dbb882aced6708873bc |
코퍼스 해시는 corpus.jsonl 의 sha256 앞 12자입니다. 문항·숨긴 문항·정오표 파일의 해시는 평가판 페이지에 있습니다.
평가판별 페이지
- 법령검색-v1노동법령 조문 2,346 + 판례 3,483 에서 실무 상담 말투 질문의 정답 문서 하나를 찾는다 (known-item)
- 세무-v1국세 6법(기본·소득·법인·부가·상속증여·징수)과 세무 판례
- 민사-v1민법 재산편(제1~766조)·임대차·이자·제조물책임과 민사 판례
- 가사-v1민법 친족·상속편(제767~1118조)·가사소송·가족관계등록과 가사 판례
- 형사-v1형법·형사소송법·특가법·성폭력처벌법·도로교통·교통사고특례와 형사 판례
- 개인정보소비자-v1개인정보·정보통신망·전자상거래·약관·소비자기본·할부거래와 그 법을 참조한 판례
- 행정-v1행정절차·심판·소송·기본법·국가배상·정보공개와 일반행정 판례
정답이나 잰 방법이 틀렸다고 보이면 알려 주세요
평가판 이름·문항 번호와 이유를 적어 varkiry05@gmail.com 로 보내 주세요.