coredot.today
도구는 넷, 자리는 넷 — BM25·임베딩·Jev·코드를 적재적소에 쓰는 한국어 검색 실측 (한국어 검색 스택 8편)
블로그로 돌아가기
TypeSafeJevBM25임베딩하이브리드 검색라우팅메타데이터 필터제외 질문Self-QueryQwen3-EmbeddingBGE-M3한국어 검색RAGOllama한국어 검색 스택실측 벤치마크

도구는 넷, 자리는 넷 — BM25·임베딩·Jev·코드를 적재적소에 쓰는 한국어 검색 실측 (한국어 검색 스택 8편)

6편에서 Jev는 리랭커로 강했고, 7편에서는 환각 검문소로 강했습니다. 그렇다면 검색의 모든 단계를 Jev에 맡기면 될까요? 이 글은 한국어 질문 134개를 다섯 가족(키워드·의미·제외 조건·두 주제·날짜·카테고리)으로 나눠 BM25, 임베딩 둘, 하이브리드, Jev, 그리고 정규식 몇 줄짜리 코드 필터를 열세 가지 방식으로 조합해 실측했습니다. 질문의 종류가 바뀌면 이기는 도구가 바뀌었습니다. '쿠버네티스는 빼고'라고 하면 임베딩과 BM25는 쿠버네티스 글을 상위 10개의 절반쯤 가져왔고 Jev가 그것을 19%로 줄였습니다. 날짜 질문에서는 Jev가 날짜 판정 807쌍을 전부 맞혔는데도 코드 필터에 졌습니다. 판정이 아니라 후보가 문제였기 때문입니다. 각 도구를 제자리에 둔 설계는 모든 질문에 Jev를 쓰는 방식보다 점수가 높으면서 Jev 호출은 40%였습니다. Jev 9,521회 호출에 0.26달러. 인터랙티브 5개와 삽화 7장.

코어닷투데이2026-10-0840분

도구는 넷, 자리는 넷 — 돋보기 로봇, 자와 지도를 든 로봇, 확률 다이얼을 든 판사 로봇, 달력과 도장을 든 서기 로봇이 각자의 작업대에 선 모습크게 보기

들어가며: 망치가 좋으면 모든 게 못으로 보인다

이 시리즈는 여섯 편 동안 도구를 하나씩 재 왔습니다. 1편에서 임베딩 모델 다섯을 한국어로 줄 세웠고, 2편에서 BM25와 임베딩을 RRF로 섞었고, 5편에서 BM25에 한국어 형태소 분석기를 붙였습니다. 6편과 7편에서는 TypeSafe의 판정 모델 Jev를 리랭커와 환각 검문소에 세웠고, 두 자리 모두에서 Jev가 가장 좋았습니다.

그러면 자연스러운 질문이 남습니다. 다 Jev에 맡기면 되지 않나? 호출당 0.25초, 입력 100만 토큰에 0.042달러이니 후보 40개를 전부 Jev에 물어도 질문 하나에 1원도 안 듭니다.

이 글의 답은 "아니다"입니다. 그리고 그 이유가 이 글의 전부입니다. 한국어 질문 134개를 다섯 종류로 나눠 BM25·임베딩·Jev·코드를 열세 가지 방식으로 조합해 본 결과를 먼저 요약하면 이렇습니다.

1
질문 종류가 바뀌면 이기는 도구가 바뀐다
키워드 질문은 무엇을 써도 거의 1.000. 뜻으로 찾는 질문은 임베딩. '~빼고'가 붙은 질문은 Jev. '4월에 올라온'이 붙은 질문은 정규식 몇 줄짜리 코드.
2
심판은 눈앞에 온 서류만 본다
Jev는 날짜·카테고리 조건 807쌍을 하나도 틀리지 않았다. 그런데도 날짜 질문에서 코드에 졌다. 맞는 달의 글이 애초에 후보 40개 안에 들어오지 않았기 때문이다.
3
제자리에 두면 싸고 더 좋다
날짜는 코드, 제외 조건은 Jev, 나머지는 하이브리드 + Jev 10개. 이 분업이 '모든 질문에 Jev 40개'보다 점수는 높고(0.847 대 0.843) Jev 호출은 40%였다.

1부. 네 도구는 각자 무엇을 보는가

검색 파이프라인에 들어가는 도구를 '무엇을 보고 판단하는가'로 나누면 넷입니다.

도구보는 것잘하는 일못 하는 일비용
BM25 (5편)글자. 질문의 단어가 문서에 몇 번, 얼마나 드물게 나오나고유명사·제품명·에러 코드처럼 글자가 그대로 겹치는 질문다른 말로 풀어 쓴 질문. '빼고'도 단어로 세서 오히려 그 주제를 끌어온다CPU, 밀리초
임베딩 (1~4편)뜻. 문장이 '무엇에 관한' 것인지를 점 하나로단어가 안 겹쳐도 뜻이 같은 문서를 수백만 건에서 찾기부정·제외('아니다'를 못 읽는다, 7편), 본문에 없는 날짜·카테고리질문당 임베딩 1회 (8B 약 0.1초)
Jev (6·7편)질문과 문서를 함께 읽고 '이 조건을 만족하나'를 확률로제외·복합 조건 판정, 리랭킹, 근거 검증수백만 건을 훑기. 후보를 받아야만 판정한다후보 1개당 호출 1회 (약 670토큰, 0.26초)
코드메타데이터 필드. 작성일, 카테고리, 작성자'2026년 4월', '튜토리얼' 같은 조건을 전수로, 틀림없이필드에 없는 것. 사용자가 쓴 말과 분류 체계가 다르면 통째로 놓친다0원, 1밀리초 미만

마지막 줄이 이 시리즈에 처음 나오는 도구입니다. 대단한 것이 아닙니다. 질문에서 2026년 4월을 정규식으로 꺼내고, 문서의 작성일 필드와 비교하는 코드 몇 줄입니다. LangChain의 셀프 쿼리 리트리버가 LLM으로 하는 일(자연어 질문을 메타데이터 필터로 바꾸기)을 여기서는 정규식으로 합니다. 이 코드가 왜 이 글의 주인공 중 하나가 되는지는 3부에서 나옵니다.


2부. 실험 설계: 질문 다섯 가족, 전략 열셋

질문 134개

문서는 1~7편과 같은 코어닷투데이 블로그·뉴스 589건(제목 + 요약)입니다. 질문은 다섯 가족입니다. 앞의 둘은 1편에서 쓴 85개를 그대로 가져왔고, 뒤의 셋은 이번에 새로 만들었습니다.

가족예시개수정답을 정한 방법
키워드KURE-v2 late interaction · git worktree 완전 정복18그 글 하나 (1편)
의미우리말 문서 검색에서 문장을 벡터 하나로 뭉개지 않고 토큰마다 비교하는 방식67사람·LLM이 단어를 바꿔 쓴 질문, 원래 글 (1편)
제외 조건쿠버네티스는 빼고 도커만 다룬 글 · 에이전트 얘기가 없는 Git 글17주제 X에 해당하고 주제 Y에는 해당하지 않는 글 전부
두 주제 함께AWS 보안 글 · Claude Code에서 MCP를 쓰는 글12X와 Y에 모두 해당하는 글 전부
날짜·카테고리2026년 4월에 올라온 RAG 글 · 튜토리얼로 쓴 도커 글20주제 X에 해당하고 작성일·카테고리 필드가 조건에 맞는 글 전부

새 질문의 정답에는 어떤 검색 모델의 판단도 들어가지 않았습니다. 글이 주제 X에 '해당한다'는 것은 필자가 붙인 태그에 X가 있거나(예: RAG 태그), 제목·요약에 X를 가리키는 정확한 용어가 있는 것(예: 'RAG', '검색 증강', 'GraphRAG')으로 정했습니다. 태그만 쓰지 않은 이유는 태그와 본문이 자주 어긋나서입니다. 보안 태그가 붙은 글 중 요약에 보안 얘기가 보이는 글은 69%뿐이었습니다. 날짜와 카테고리는 글의 프런트매터 값 그대로입니다.

전략 열셋

묶음전략Jev 호출/질문
Jev 없이BM25(Kiwi) · Qwen3-Embedding-8B · BGE-M3 · 8B에 메타데이터를 본문 앞에 붙여 임베딩('[2026년 4월 · 기술] 제목…') · 하이브리드 RRF(8B+BGE-M3) · 하이브리드 RRF(8B+BM25)0
모든 질문에 JevBM25 상위 30 → Jev(벡터 DB 없음) · 8B 상위 30 → Jev · 하이브리드 상위 40 → Jev30~40
나눠 쓰기정규식 라우터 · Jev 라우터 · 설계안(코드·Jev·하이브리드 분업) · 오라클(가족별 최선 경로, 상한선)10~30

Jev에는 6·7편과 같은 방식으로 질문 하나를 던졌습니다. 상태에 검색 질문과 문서(제목·요약·작성일·카테고리)를 넣고, Noul로 "이 문서가 검색 질문이 찾는 글인가? 조건(빼야 할 주제, 함께 다뤄야 할 주제, 작성 날짜, 카테고리)이 있으면 모두 만족해야 한다"를 묻습니다. 후보는 Noul 확률 순으로 다시 정렬합니다. 지표는 nDCG@10이고, 제외·날짜 질문에는 위반율(상위 10개 중 조건을 어긴 글의 비율)을 따로 셉니다.


3부. 결과: 질문이 바뀌면 이기는 도구가 바뀐다

표를 위에서부터 읽으면 이 시리즈의 전 편이 한 장에 들어 있습니다.

  • 키워드 질문은 무엇을 써도 됩니다. BM25 0.980, 임베딩은 전부 1.000. 여기에 Jev를 붙여도 더 오를 곳이 없습니다. 이 가족에서 Jev 호출은 그대로 낭비입니다.
  • 의미 질문은 임베딩의 자리입니다. BM25 0.519, 8B 0.860, 하이브리드 0.875. Jev 재정렬로 0.924~0.938까지 오릅니다(6편과 같은 결과). BM25 상위 30개를 Jev에 줘도 0.697에 그칩니다. 단어가 안 겹치는 정답은 BM25 후보에 애초에 없기 때문입니다.
  • 제외·두 주제·날짜 질문에서 판이 바뀝니다. Jev 없는 여섯 전략이 모두 0.20~0.51에 몰려 있습니다. 이 세 가족이 이 글의 본론입니다.

'빼고'를 못 읽는 검색

도커만! — 도커만을 원하는 손님에게 자 로봇이 조타륜 카드와 고래 카드가 반씩 섞인 상자를 가져오고, 판사 로봇이 조타륜 카드를 골라 버리는 장면크게 보기

제외 조건 17개에서 Jev 없는 전략의 nDCG@10은 0.199~0.245였습니다. 위반율을 보면 이유가 보입니다.

Qwen3-8B
52%
하이브리드 RRF
48%
BM25
46%
8B 30 → Jev
26%
하이브리드 40 → Jev
19%

"쿠버네티스는 빼고 도커만 다룬 글"이라고 물으면, 임베딩은 상위 10개의 절반을 쿠버네티스 글로 채웁니다. 실제로 8B의 1~3위는 '쿠버네티스 첫걸음' 1·4·2편이었습니다. 질문에 '쿠버네티스'라는 단어가 들어 있으니, '무엇에 관한 문장인가'를 재는 자에게 이 질문은 쿠버네티스에 관한 질문입니다. BM25도 같습니다. 단어를 세는 도구에게 '빼고'는 그냥 흔한 단어 하나입니다.

이것은 우리만의 관찰이 아닙니다. Weller 등의 NevIR(EACL 2024)은 부정 하나만 다른 문서 쌍에서 최신 검색 모델 대부분이 무작위 순위와 같거나 못하다는 것을 보였고(7편), Zhang 등의 ExcluIR(AAAI 2025)은 '무엇을 원하지 않는지'를 말하는 제외 질문 3,452개로 벤치마크를 만들어 구조가 다른 검색 모델들이 모두 이런 질문을 제대로 이해하지 못한다고 보고했습니다. 7편에서 본 '아니다를 못 읽는' 문제가 검색 단계에서 그대로 나타난 것입니다.

Jev를 붙이면 nDCG가 0.63으로 세 배가 되고 위반율이 19%로 떨어집니다. 아래에서 질문을 바꿔 가며 직접 보세요.

두 가지를 더 눈여겨볼 만합니다.

첫째, 여기서는 BM25 → Jev가 임베딩 → Jev만큼 좋습니다(제외 0.623 대 0.593, 두 주제 0.643 대 0.639). 조건 질문의 주제어('RAG', '도커', 'Git')는 문서에 글자 그대로 나오기 때문에 BM25의 후보만으로도 Jev가 고를 거리가 충분합니다. 의미 질문에서 BM25 → Jev가 0.697에 그친 것과 대조적입니다. 벡터 DB 없이 BM25와 Jev만으로 시작해도 되는 영역이 있다는 뜻이고, 그 영역은 '질문의 주제어가 문서에 글자로 있는' 곳입니다.

둘째, Jev도 19%는 놓칩니다. 남은 위반의 상당수는 경계선 글입니다. '에이전트 얘기가 없는 Git 글'에서 요약에 에이전트가 한 번 스치듯 나오는 글, '지식 그래프 얘기는 빼고 RAG만'에서 GraphRAG를 한 줄 언급한 글. 필자의 정답 기준(태그 또는 요약에 용어가 있으면 해당)이 Jev보다 엄격한 경우도 섞여 있습니다.

두 주제를 함께: 겉보기엔 평범한 질문

'AWS 보안 글', 'Claude Code에서 MCP를 쓰는 글' 같은 질문은 제외 질문처럼 눈에 띄는 표지가 없습니다. 임베딩은 0.47~0.50으로, 두 주제 중 하나만 다룬 글을 섞어 옵니다. Jev가 후보 40개를 보면 0.625로 오르지만, 10개만 보면 0.502입니다. 두 조건을 모두 만족하는 글이 임베딩의 상위 10개 밖에 있는 경우가 많아서입니다. 이 가족은 5부의 설계안에서도 약점으로 남습니다.

'4월에 올라온'은 누구의 일인가

4월 — 판사 로봇은 컨베이어로 엉뚱한 달의 카드 몇 장만 받으며 기다리고, 옆의 서기 로봇은 거대한 서랍장에서 4월 서랍을 통째로 꺼내는 장면크게 보기

날짜·카테고리 질문 20개의 결과가 이 글에서 가장 가르쳐 주는 것이 많습니다.

전략nDCG@10상위 10개 중 정답날짜·카테고리 위반율Jev 호출
Qwen3-8B0.35532%65%0
8B + 메타데이터 본문 삽입0.39535%61%0
하이브리드 40 → Jev (날짜·카테고리를 Jev에 보여 줌)0.70853%33%40
코드 필터 → 하이브리드0.84068%0%0
코드 필터 → 상위 20 → Jev0.87673%0%20

세 가지가 보입니다.

하나, 임베딩은 날짜를 모릅니다. 당연합니다. 작성일은 본문에 없으니까요. 그래서 흔히 쓰는 요령이 메타데이터를 본문 앞에 붙여서 임베딩하는 것입니다. 해 봤습니다. '[2026년 4월 · 기술] 제목…'으로 589건을 다시 임베딩하자 0.355가 0.395가 됐습니다. 위반율은 65%에서 61%. 거의 효과가 없습니다. 임베딩에게 '2026년 4월'과 '2026년 2월'은 거의 같은 뜻이고, 문서 본문의 수백 자에 비하면 앞에 붙은 몇 글자는 벡터를 움직이지 못합니다.

둘, Jev는 날짜를 완벽하게 읽습니다. Jev 문서는 날짜와 산술을 약점으로 꼽지만, 날짜 조건 판정은 약점이 아니었습니다. 날짜 질문의 주제 글을 따로 모아 "이 문서가 '2026년 4월에 작성됨'(또는 '8월 이후', '2026년 이전', '카테고리가 튜토리얼') 조건을 만족하나"를 물었더니 807쌍 전부를 맞혔습니다(AUROC 1.000). 7편에서 본 것과 같은 결론입니다. Jev가 약한 것은 계산이지, 적힌 값을 비교하는 일이 아닙니다.

셋, 그런데도 Jev는 코드에 졌습니다. 판정이 완벽한데 왜 0.708일까요? '2026년 4월에 올라온 RAG 글'의 정답은 13건인데, 'RAG'로 찾은 하이브리드 상위 40개에 4월 글이 다 들어오지 않습니다. RAG 글이 51건이나 되니까요. 심판은 눈앞에 온 서류만 판정할 수 있습니다. 코드는 589건의 작성일을 1밀리초 안에 전부 훑어 4월 글만 남기고, 그 안에서 하이브리드가 RAG 글을 고릅니다. 여기에 Jev를 한 번 더 얹으면(상위 20개의 주제 판정) 0.876으로 이 가족의 최고점이 됩니다.

다만 코드 필터에는 함정이 있습니다. 의미 질문 중 하나인 "인공지능에 대한 개발자의 서운한 반응을 다룬 2026년 특집"에서 코드 필터는 '2026년'과 '특집'을 조건으로 읽고 카테고리가 '특집'인 글만 남겼습니다. 그런데 정답 글(「코딩을 사랑한 사람의 슬픔」)은 카테고리가 '인사이트'였습니다. 질문한 사람은 '특집'을 '공들인 긴 글'이라는 뜻으로 썼을 뿐입니다. 결과는 nDCG 0.000. 코드는 틀림없이 빠르지만, 사용자의 말과 분류 체계가 어긋나면 통째로 놓칩니다. Jev라면 0.3쯤의 확률로 '애매하다'고 말했을 자리입니다.

특집이라고 적힌 차단기가 인사이트 태그를 단 카드를 막고, 그 카드가 바로 사용자가 원하던 것이라 사용자 로봇이 슬퍼하고, 판사 로봇이 어깨를 으쓱하는 장면크게 보기

그래서 실무에서는 코드 필터를 두 등급으로 나누는 것이 좋습니다. 날짜처럼 사용자의 말과 필드 값이 일대일로 대응하는 조건은 하드 필터로, 카테고리처럼 사용자가 느슨하게 쓸 수 있는 조건은 소프트 필터(필터 결과를 앞에, 나머지를 뒤에 붙이거나, Jev에 판정을 맡기기)로.


4부. 교통정리: 질문을 어느 길로 보낼 것인가

관제탑 — 로봇 관제사가 질문 카드들을 키워드·의미·조건·날짜 네 차선으로 보내고, 차선 끝에는 돋보기·지도·판사·달력이 기다리는 장면크게 보기

질문마다 이기는 도구가 다르다면, 질문을 보고 길을 골라 주는 라우터가 필요합니다. 두 가지를 만들었습니다.

  • 정규식 라우터. N년 N월, N년 이전, 카테고리 이름이 있으면 날짜 경로, '빼고·말고·없는·없이·아닌·무관한'이 있으면 조건 경로, 조사·어미가 없고 영문 비율이 높으면 키워드 경로, 나머지는 의미 경로. 스무 줄 남짓입니다.
  • Jev 라우터. 질문만 상태에 넣고 Choice로 "이 질문을 처리하기에 알맞은 방식은? 키워드·의미·조건·날짜"를 한 번 묻습니다. Jev가 광고하는 쓰임새('똑똑한 if 문')에 정확히 해당합니다.

정규식이 이겼습니다. 네 경로를 똑같이 두고(날짜 경로는 코드 필터 → Jev) 라우터만 바꿔 쟀더니, 의도한 경로로 보낸 비율이 정규식 85.8%, Jev 79.9%였고 전체 nDCG는 0.846 대 0.817이었습니다. Jev의 틀린 배정 27건 중 대부분은 풀어 쓴 의미 질문(예: "컨테이너 처음 배우는 사람이 알아야 할 용어 정리")과 두 주제 질문(예: "AWS 보안 글")을 키워드로 본 것입니다. 의미 질문이 키워드 경로(BM25)로 가면 점수가 0.9에서 0.5로 떨어지니 한 번의 오판이 비쌉니다.

그렇다고 Jev 라우터가 쓸모없는 것은 아닙니다. 틀린 배정일수록 confidence가 낮았습니다(틀린 것 중앙값 0.51, 맞은 것 0.89). "confidence가 0.7보다 낮으면 기본 경로(의미)로 보낸다"는 안전장치 하나로 0.817이 0.833이 되고, 배정 정확도는 86.6%로 정규식을 넘습니다. 확률을 돌려주는 모델의 장점이 여기서 드러납니다.

그런데 정확도가 더 높은데도 nDCG는 여전히 정규식이 높습니다(0.846 대 0.833). 틀리는 방향이 다르기 때문입니다. 정규식이 틀린 의미 질문은 "보상 모델 없이 언어 모델을 인간 취향에 맞추는 수학적 접근법"처럼 '없이'가 들어간 것들인데, 이 질문이 조건 경로(후보 40개 → Jev)로 가도 점수는 1.000 그대로입니다. 비용만 조금 더 들 뿐 손해가 없습니다. Jev가 틀린 질문은 풀어 쓴 질문을 키워드 경로로 보낸 것이라 0.9가 0.5로 떨어집니다. 라우터를 평가할 때는 정확도보다 '틀렸을 때 얼마나 비싼가'를 봐야 합니다. 가장 안전한 설계는 틀려도 싼 쪽, 즉 애매하면 더 비싸고 넓은 경로로 보내는 것입니다.

정규식이 이긴 이유는 단순합니다. 이 실험의 라우팅 신호('빼고', '4월', '튜토리얼')가 전부 글자에 있기 때문입니다. 글자로 판별되는 것은 글자를 보는 도구에 맡기는 것이 맞고, 이것도 적재적소입니다. 다만 한계 절에 적었듯이 정규식과 질문을 같은 사람(필자)이 만들었으므로 이 비교는 정규식에 유리하게 기울어 있습니다. 실제 사용자는 필자가 예상하지 못한 방식으로 조건을 말합니다. 그때 Jev 라우터의 confidence가 '모르겠다'고 말해 주는 것은 정규식에 없는 장점입니다.


5부. 조립: 제자리에 둔 파이프라인

지금까지의 관찰을 한 파이프라인으로 모으면 이렇습니다.

① 코드: 조건 읽기
정규식으로 날짜(연·월, 이후·이전)와 카테고리를 꺼낸다. 있으면 589건 전체에서 메타데이터로 거른다. 0원, 1밀리초
② 임베딩 + BM25: 후보 모으기
하이브리드(Qwen3-8B + BGE-M3, RRF)로 후보를 모은다. 날짜 질문이면 거른 안에서, 아니면 전체에서
③ 정규식: 제외 표지 확인
'빼고·없는·아닌'이 있으면 후보를 40개로 넓힌다. 없으면 10개. 날짜 질문은 거른 안의 20개
④ Jev: 판정과 재정렬
후보마다 "이 문서가 질문이 찾는 글이고 조건을 모두 만족하나"를 Noul로 묻고 확률 순으로 정렬한다

저울 — 한쪽에는 판사 토큰 40개가 쌓여 있고, 다른 쪽에는 토큰 15개와 달력·돋보기가 놓인 저울 옆에서 기술자 로봇이 그래프를 확인하는 장면크게 보기

결과입니다.

파이프라인전체 nDCG@10Jev 호출/질문질문 1만 건당 Jev 비용
Qwen3-8B만0.6890$0
하이브리드만0.6910$0
모든 질문: 하이브리드 40 → Jev0.84340$11.2
정규식 라우터 (날짜 경로에 Jev 없음)0.84111.6$3.3
설계안 (위 ①~④)0.84716.3$4.6
설계안 경량판 (키워드처럼 보이면 Jev 생략)0.84714.9$4.2
오라클 (가족마다 최선 경로, 상한선)0.86330.0$8.4

설계안은 '모든 질문에 Jev 40개'보다 점수가 조금 높고(0.847 대 0.843) Jev 호출은 40%입니다. 경량판은 37%입니다. 점수가 거의 같은데 호출이 절반 이하라는 것은, Jev를 부른 호출의 상당수가 원래 아무 일도 하지 않고 있었다는 뜻입니다. 키워드 질문의 후보 40개, 의미 질문의 11~40위 후보, 날짜 질문에서 엉뚱한 달의 후보들.

오라클과의 차이 0.016은 거의 전부 '두 주제 함께' 가족에서 나옵니다. 이 질문들은 표지가 없어서 설계안이 의미 경로(후보 10개)로 보내고, 그러면 0.502에 머뭅니다. 후보 40개를 보면 0.625입니다. '와/과 함께', '에서 ~를 쓰는' 같은 표지를 정규식에 넣을 수도 있지만, 그러면 평범한 의미 질문까지 40개 경로로 가서 비용이 오릅니다. 이 가족을 어떻게 다룰지가 다음 실험의 숙제입니다.

아래에서 가족마다 경로를 바꿔 보며 직접 조립해 보세요. 이 계산기는 질문의 종류를 정확히 안다고 가정합니다. 그래서 설계안의 경로 배치를 그대로 넣으면 0.847이 아니라 0.852가 나옵니다. 그 차이 0.005가 정규식 라우터가 길을 잘못 든 값입니다.

비용은 문제가 아니었다, 그런데 왜 아끼나

질문 1만 건에 11달러와 4달러. 둘 다 싸니까 그냥 전부 Jev에 맡겨도 되지 않을까요? 세 가지 이유로 아낄 가치가 있습니다.

  • 지연. Jev 호출 40개를 병렬로 보내면 0.3초 안팎이지만, API의 분당 요청 한도(문서상 1,200rpm, 유동적)를 질문 하나가 40개씩 쓰면 분당 질문 30개가 한계입니다. 16개씩 쓰면 75개, 두 배 반을 받습니다.
  • 점수. 날짜 질문에서 'Jev 40개'는 코드 필터보다 점수가 낮았습니다. 비용을 더 들인 쪽이 더 나쁜 경우가 있다는 것이 이 실험의 요점입니다.
  • 설명 가능성. "4월 글만 남겼다"는 코드의 결정은 누구나 검증할 수 있습니다. 확률 모델에 맡길 이유가 없는 결정은 맡기지 않는 편이 운영이 편합니다.

6부. 실무 체크리스트

1
메타데이터 조건은 코드로 먼저 거른다
날짜·작성자·문서 종류처럼 필드에 있는 조건은 정규식이나 셀프 쿼리로 꺼내 전수 필터한다. 임베딩에 메타데이터를 붙이는 요령은 효과가 미미했다(0.355→0.395). 사용자가 느슨하게 쓰는 분류(특집·가이드 등)는 소프트 필터로.
2
제외·복합 조건은 판정 모델에
'빼고', '없는', '둘 다'는 임베딩도 BM25도 못 읽는다. 표지가 보이면 후보를 넓히고(40개) Jev 같은 판정 모델에 조건을 통째로 묻는다.
3
키워드 질문에는 판정 모델을 부르지 않는다
BM25든 임베딩이든 이미 거의 1.000이다. 하이브리드(임베딩+BM25) 하나로 충분하다.
4
판정 모델의 점수가 낮으면 후보부터 의심한다
날짜 질문에서 Jev의 판정 정확도는 100%였는데 nDCG는 0.708이었다. 병목은 판정이 아니라 후보에 있었다. 판정 모델을 바꾸기 전에 정답이 후보 안에 있는지(recall)를 먼저 잰다.
5
라우팅 신호가 글자에 있으면 정규식, 아니면 Jev + confidence
이 실험에서는 정규식 라우터가 Jev 라우터보다 정확했다. Jev 라우터를 쓴다면 confidence가 낮을 때 기본 경로로 보내는 안전장치를 반드시 단다.
6
주제어가 글자로 있는 조건 질문은 BM25 + Jev로도 된다
벡터 DB가 아직 없다면 BM25 상위 30개를 Jev에 주는 것부터 시작해도 제외·두 주제 질문에서는 임베딩 + Jev만큼 나왔다. 다만 풀어 쓴 질문에서는 0.697로 크게 밀린다.

네 컷 웹툰 — 고래만 원하고 조타륜은 빼 달라는 손님, 조타륜 카드를 잔뜩 들고 뛰어오는 자 로봇, 조타륜을 걸러 내는 판사 로봇과 서랍을 꺼내는 서기 로봇, 고래 카드를 받고 기뻐하는 손님과 하이파이브하는 세 로봇크게 보기


7부. 한계

  • 질문과 정규식을 같은 사람이 만들었습니다. 제외 질문의 표현('빼고', '없는', '아닌', '무관한')과 라우터의 정규식을 필자가 함께 썼으므로 정규식 라우터와 설계안에 유리합니다. 실제 사용자는 "도커 위주로, 쿠버네티스 말고"처럼 예상 밖의 형태로 말합니다. Jev 라우터는 아무런 조정 없이 한 번에 돌린 결과입니다.
  • 정답은 태그와 용어 목록으로 정했습니다. '주제 X에 해당한다'의 기준이 필자의 태그와 정규식 용어 목록이라, 경계선 글에서 정답 기준과 Jev의 판단이 어긋날 수 있습니다. 제외 질문에서 Jev의 남은 위반 19% 중 일부는 이 경계선 글입니다.
  • 코퍼스가 작습니다. 589건에서는 코드 필터가 전수를 훑는 비용이 0이고, 하이브리드 상위 40개가 코퍼스의 7%입니다. 문서가 수백만 건이면 코드 필터는 인덱스(벡터 DB의 메타데이터 필터)로 옮겨야 하고, 후보 40개가 차지하는 비율이 훨씬 작아져 '후보가 병목'이라는 결론은 더 강해집니다.
  • '두 주제 함께' 가족은 풀지 못했습니다. 설계안이 가장 크게 지는 곳입니다. 표지 없는 복합 조건을 싸게 알아내는 방법은 이 실험에 없습니다.
  • Jev는 jev-latest(1.13), 2026년 9월 말 기준입니다. 임베딩 문서 벡터는 1편에서 만든 것을 그대로 썼고, 질문과 메타데이터 삽입 변형만 새로 임베딩했습니다.

출처

  • Orion Weller, Dawn Lawrie, Benjamin Van Durme, "NevIR: Negation in Neural Information Retrieval", EACL 2024, arXiv:2305.07614
  • Wenhao Zhang, Mengqi Zhang, Shiguang Wu, Jiahuan Pei, Zhaochun Ren, Maarten de Rijke, "ExcluIR: Exclusionary Neural Information Retrieval", AAAI 2025, arXiv:2404.17288 — 수작업 제외 질문 3,452개 평가셋, "구조가 다른 기존 검색 모델들이 제외 질문을 제대로 이해하지 못한다"
  • LangChain, "How to do self-querying retrieval" — LLM으로 자연어 질문을 메타데이터 필터가 붙은 구조화 질의로 바꾸는 패턴
  • Gordon V. Cormack, Charles L. A. Clarke, Stefan Büttcher, "Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods", SIGIR 2009 — RRF(k=60), 2편
  • TypeSafe AI 문서: 소개 · 모델 제원(jev-1.13, 입력 100만 토큰당 $0.042, 출력 무료, 1,200rpm 유동적) · Noul/Choice 프리미티브
  • 임베딩: Ollama qwen3-embedding:8b(검색 지시문 접두사), bge-m3 · BM25: rank_bm25 + Kiwi 내용어 토큰(5편)
  • 이 실험의 수치: Jev 호출 9,521회, 입력 6.28M 토큰, 약 $0.26, 호출당 중위 0.26초·95% 0.32초(8 병렬). 질문 134개와 전략별 상위 10개는 위 탐색기 위젯에 전부 들어 있습니다

이 시리즈

함께 읽으면 좋은 코어닷투데이 글