C.W.K.
Stream
Lesson 01 of 06 · published

Exact Match 와 Contains

~18 min · metrics, deterministic, fundamentals

Level 0Guesser
0 XP0/55 lessons0/10 achievements
0/150 XP to next level150 XP to go0% complete

너무 적게 쓰이는 가장 단순한 grader

LLM judge 부르기 전에 물어: '이걸 끝낼 string check 가 있나?' 대부분 팀이 exact-match 와 contains 를 자기 수준 아래라고 skip 해. 잘못 생각해. 이 grader 는 free, deterministic, 즉각, 그리고 사람들이 인정하는 것보다 훨씬 많은 실제 regression 잡아.

Exact-match 가 작동하는 곳

  • Single-token 답 (yes/no, true/false, A/B/C/D classification).
  • 고정 형식 numeric 답.
  • 특정 함수명 요청한 prompt 의 code generation.
  • JSON output 안 structured field.

왜 'contains' 가 workhorse

대부분 자연어 task 에서 exact match 는 너무 strict ("Paris" vs "Paris is the capital of France"). contains grader 는 reference 가 output 에 어디든 나타나는지 체크 — case-insensitive 옵션. 장황하거나 간결한 phrasing 받아주면서 잘못된 output 잡아.

원칙: LLM judge 비용 내기 전에 deterministic grader 다 소진해. 1000배 싸고 사람들이 인정하는 것보다 더 많은 regression 잡아.

Multi-reference contains

실제 질문은 자주 여러 acceptable phrasing 가져. '남수단 수도?' 는 "Juba", "Juba is the capital", "South Sudan's capital is Juba" 다 답 가능. acceptable reference list 저장하고 아무거나 match 시키면 grader 가 substance 에 strict 하면서 style 에 lenient 해.

Code

Exact-match 와 contains, 세 가지 flavor·python
import re

def exact(output, reference):
    return output.strip() == reference.strip()

def contains(output, reference, case_insensitive=True):
    if case_insensitive:
        output, reference = output.lower(), reference.lower()
    return reference in output

def contains_any(output, references, case_insensitive=True):
    return any(contains(output, r, case_insensitive) for r in references)

def contains_all(output, references, case_insensitive=True):
    return all(contains(output, r, case_insensitive) for r in references)

# Usage
assert contains("The capital is Paris", "paris")            # True
assert contains_any("The capital is Juba", ["juba", "jouba"])
assert contains_all("Citizens of Tokyo and Osaka", ["Tokyo", "Osaka"])
Word-boundary contains — substring 조심·python
# 'cat' is in 'concatenate'. Naive contains says cats appear in your output.
# Use word boundaries when the reference is a short word.
import re

def contains_word(output, word, case_insensitive=True):
    flags = re.IGNORECASE if case_insensitive else 0
    pattern = rf"\b{re.escape(word)}\b"
    return re.search(pattern, output, flags) is not None

assert not contains_word("concatenate things", "cat")  # True — substring trap avoided
assert contains_word("the cat sat", "cat")              # True

External links

Exercise

가장 중요한 task 에 대해 reference output 20개 list. contains-any grader 를 최근 eval set 에 돌려. LLM judge 가 fail 했지만 grader 가 pass 한 (또는 반대) 곳 어디? 각 disagreement 가 dataset 또는 grader 에 대한 lesson.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.