Translate the checker too: building HanIFEval, a Korean IFEval

채점기도 같이 번역해야 한다: 한국어 IFEval, HanIFEval을 만들며

In an existing Korean IFEval, 27 of 342 prompts ask for something different from what the code scores. Translating each prompt together with its checker's arguments leaves 3 unpassable items, and those 3 cannot be passed in English either.

#llm#korean#benchmark

Contents

IFEval is scored by code, not by a judge model. Each item is a prompt plus the arguments its checker uses: “at least 300 words” is the prompt’s text, and relation: at least, num_words: 300 is what the code tests. Translate only the prompt and the two can drift apart. The Korean prompt then asks for one thing while the checker scores another.

I audited an existing Korean translation and found that in 1 item out of 13. So I built HanIFEval, which translates each prompt together with its checker arguments and then checks the pair with code. This post covers why that was needed, how it was built, what Korean does to a substring-based checker, and how five budget LLMs did on it.

Current scores for HanIFEval and three other Korean tests are on the Korean benchmark page.

TL;DR

IFEval-Ko (audited)HanIFEval v1.1
Items (from IFEval)342429
A faithful answer can fail27 (7.9%)3 (0.7%), unpassable in English too
Forbidden word + particlenot detecteddetected
Known issuesnot marked8, tagged per item

“Forbidden word + particle” means a case like 사과를, where a particle follows the forbidden 사과. The two numbers in the second row come from different checks: a by-hand audit for IFEval-Ko, and honest answers scored by the checker for HanIFEval. Both are described below.

  • The defects come from the procedure, not the translator. On 120 en→ko segments (news, social, speech, literary), GPT-4o and three newer models could not be told apart by an automatic metric. The fix was to translate the prompt and the checker’s arguments in one step, then test them against each other.
  • Korean breaks substring matching in specific ways. For example, a forbidden ‘예’ (yes) also matches inside 예정 (schedule) and 예상 (forecast). The worst problem, though, came from a rule in my own translation guideline.
  • Five budget models score 92.5–97.2%, and each has one weak instruction type. For GPT-6 Luna it is paragraph dividers, for GLM 5.3 Flash forbidden words, and for Solar Pro 4 minimum length.

Why a translated IFEval breaks

I audited allganize/IFEval-Ko, translated from IFEval with GPT-4o. The audit had three parts:

  • a code check of every prompt against its arguments;
  • an LLM comparison of each English item with its Korean version;
  • a ruling by hand on everything either method flagged.

In 27 of 342 items, an answer that follows the Korean prompt can be scored as a fail:

What went wrongItems
“less than N” became “N 이하” (N or fewer); fails only at exactly N15
Repeat-the-request instruction reversed or cut short4
English keyword left in the checker3
“more than 2 times” became “2번 이상” (2 or more), while the checker counts 3 or more3
“600+ words” became “600자” (600 characters)1
Fixed answer options in the prompt differ from the checker’s1

The audit also found problems in the other direction, where a violating answer passes:

  • Forbidden words were not detected in Korean. The checker matched them as whole words (regex \b). A Korean noun is usually followed by a particle, as in 사과를, so there is no word boundary and the forbidden 사과 goes unnoticed. This affects all 28 prompts with forbidden words.
  • Two prompts never mention a forbidden word that the checker enforces.

None of this is a translation-quality problem. On 120 WMT24++ en→ko segments (30 each from news, social, speech and literary text) I scored GPT-4o, Gemini 3.1 Pro, Gemini 3.8 Flash and Claude Opus 5.5 with MetricX-24, and no pair differed. What failed was the procedure: the prompt was translated, but its arguments were never checked against it.

How HanIFEval was built

  1. Scope. IFEval has 541 items. 112 use upper/lower case or letter-frequency rules, which have no Korean equivalent, so they are dropped. That leaves 429 items with 21 instruction types and 633 instructions.
  2. Checker before translation. I started from IFEval-Ko’s checker with five marked fixes. One example: keywords and forbidden words are matched as substrings, so 사과를 counts as 사과.
  3. One guideline, used as the system prompt. The prompt and its string arguments are translated together as one string. Numbers and relations come from the arguments through a fixed table: “less than N” is always “N 미만” and “at least N” is always “N 이상”. Word counts say “N단어(띄어쓰기 기준)”, i.e. words separated by spaces.
  4. Translator. Gemini 3.1 Pro at high reasoning effort. My metric could not separate the candidates. I picked it for two reasons. It scored highest when I recomputed en→ko means from the human-evaluation annotations WMT26 released (not an official ranking, and not significantly above GPT 5.5). And it is not one of the models I was going to test.
  5. Code check. A validator compares every prompt with its arguments. It flagged 9 of 429 items, none of them a translation defect.
  6. Model review. Eight Claude Opus 5.5 reviewers read all 429 items. They reported 70 findings on 60 items, 15 of which break scoring. Each reviewer also wrote an honest answer to every item, and the checker scored those answers.
  7. Logged edits → v1. 17 edits on 17 items, each with its reason in the provenance file.
  8. Two external reviews → v1.1. GPT-6 Pro and GPT-6 Astra at the Ultra reasoning effort reviewed v1, the second one item by item. 16 more items were edited, the sentence splitter was fixed, and an answer whose language cannot be detected now fails.

The finished check: of the 429 honest answers, 426 pass under strict scoring. The other 3 ask the answer to repeat text that already contains a forbidden or capped word, and the English items have the same trap.

Building the set (audit, translator comparison and translation) cost $10.34 in API calls. The Claude reviews ran in a coding-agent session and are not in that figure.

What Korean does to a substring checker

Collisions. Korean words carry particles and endings, so a short string shows up inside unrelated words. I checked every keyword and forbidden word against 65,378 eojeol (space-separated words) of KLUE news and web text:

  • Forbidden ‘예’ (yes) appears 49.9 times per 10,000 eojeol, mostly inside 예정 and 예상. No safe rendering exists, so the item is tagged rather than edited.
  • Forbidden ‘미친’ (crazy) fails the ordinary phrase 영향을 미친다 (to have an effect), so it became ‘광기’ (madness).
  • Keyword ‘가오’ was satisfied by 다가오다 (to approach). The source word is a nonce token, so it stays in Latin script as ‘gao’.

Inflection. Forbidding the verb ‘타다’ (to ride) misses 타고 and 탔다. The stem ‘타’ would match almost everything. That item is tagged too.

My own rule broke 8 items. The guideline told the translator to write “쉼표(,)” (comma) in no-comma instructions, and another rule required repeat-the-request text to be copied verbatim. So in 8 items, the text the model must repeat contained a comma that the same item forbids, and no answer could pass. Loose scoring hid all 8, because one of its variants drops the first line of the answer, which is where the repeat sits. The reviewers caught them, and the “(,)” was removed.

Word counts are eojeol. One eojeol carries more than one English word: across the 429 prompts there are 0.717 eojeol per English word. I kept every N as in the source, so “at least 300 words” asks for more content in Korean. How much more was not measured on answers.

Results: five budget LLMs

Same models and settings as the other Korean tests: reasoning on at the provider’s default effort, temperature 0, a 64,000-token limit, one sample per item, each model on one pinned provider. Prompt-level strict means every instruction in the item was followed.

ModelPrompt-level strict [95% CI]PassedWeakest instruction type
DeepSeek V4.1 Flash97.2% [95.2, 98.4]417/429repeat the request, 36/40
GLM 5.3 Flash95.3% [92.9, 97.0]409/429forbidden words, 38/45
GPT-6 Luna93.2% [90.5, 95.3]400/429number of paragraphs, 13/22
Solar Pro 493.0% [90.2, 95.1]399/429minimum word count, 30/43
Solar Mini 492.5% [89.7, 94.7]397/429repeat the request, 33/40

Measured 2026-10-02/03. Bold marks the weak spots this post is about, not a winner.

The set is near ceiling for these models. All five pass 351 of the 429 items, so the remaining 78 carry every difference. The only significant gaps are DeepSeek over GPT-6 Luna (22 vs 5 items, p = 0.0015), Solar Pro 4 (22 vs 4, p = 0.0005) and Solar Mini 4 (26 vs 6, p = 0.0005). The 3 items no model passes are the 3 that cannot be passed in English.

Each model’s misses cluster in one place:

  • GPT-6 Luna separates paragraphs with blank lines, or puts *** only at the end, although every one of these prompts names *** as the divider.
  • GLM 5.3 Flash writes the forbidden words while saying it avoided them: “‘변경’과 ‘여유’라는 단어는 사용하지 않았습니다” (“I did not use the words ‘변경’ and ‘여유’”).
  • Solar Pro 4 stops short. All 13 misses are minimum lengths, answered at 43–97% of the target, e.g. 388 eojeol where at least 900 were asked.
  • Repeat-the-request, the weakest type for DeepSeek and Solar Mini 4, is missed by putting a preface before the repeat (“먼저, 요청하신 대로…”, “First, as you asked…”) or by changing a word in it. In the first run of four models, 9 of the 14 repeat misses were a preface and 5 a changed word.

For the first four models, I checked every forbidden-word and repeat failure against the response. Each was a real violation; none came from a substring collision in the items.

The ranking is not the one from Korean knowledge tests. GPT-6 Luna ties DeepSeek on KoBALT and LBox, but here it is in the bottom group. Knowing Korean and following instructions written in Korean are separate abilities.

What it cost

Sorted by list price, cheapest first. Price is USD per 1M input / output tokens on the pinned provider, checked 2026-09-29 (Solar Mini 4 on 2026-10-03). Reasoning tokens are billed as output.

Cost against score. Each line is a 95% interval. GPT-6 Luna is cheapest because it reasons least; Solar Mini 4 has the lowest token price but reasons the most.
Prompt-level strict, % (axis 85–100)
Cost for 429 items, USD
ModelPrice in / outCost, 429 itemsReasoning tokens per itemPrompt-level strict
Solar Mini 4$0.05 / $0.20$0.343,58092.5%
Solar Pro 4$0.09 / $0.36$0.472,65193.0%
GPT-6 Luna$0.10 / $0.50$0.1630193.2%
GLM 5.3 Flash$0.15 / $0.50$0.913,20195.3%
DeepSeek V4.1 Flash$0.15 / $0.60$0.732,41697.2%

Token price does not predict what a run costs. Solar Mini 4 has half of GPT-6 Luna’s price but cost 2.1 times as much, because it reasons about 12 times longer per item. DeepSeek cost 4.6 times as much as GPT-6 Luna for 4.0 more points, and that gap is significant. Between Solar Pro 4, Solar Mini 4 and GPT-6 Luna, the scores cannot be told apart, so on the total score, cost is what separates them.

I do not divide score by cost. With every score between 92.5% and 97.2%, the ratio would mostly rank cost again.

Caveats

  • No native speaker reviewed the items. A model translated them (Gemini), and other models reviewed them (Claude, GPT-6). Code verifies that each prompt agrees with its checker and that the items can be passed; naturalness and faithfulness are judged only by models.
  • GPT-6 Luna is a GPT-6-family model, and GPT-6 models reviewed v1. Those reviews led to 16 edits but wrote none of the items. The translator (Gemini) and the reviewers (Claude) are from families not tested here.
  • Report strict scores. Loose scoring forgives a skipped first line, which hides repeat failures.
  • Not identical to English IFEval item by item. Two items are passable in Korean but not in English, and three state the checker’s number where the English wording disagrees with it.
  • Contamination. HanIFEval is new, but its English source has been public since 2023. The dataset card carries a canary string for tracking.
  • One run per model, one configuration, one sample per item.
  • Cost covers the scored rows only, at the list prices above. The 16 items edited for v1.1 were re-generated, so their cost replaces the v1 rows’ cost.

Using it

The data, the checker and a standalone scorer are on Hugging Face under Apache-2.0. Use tag v1.1 to pin the version:

from datasets import load_dataset
ds = load_dataset("developer0hye/HanIFEval", revision="v1.1", split="test")
python score.py --responses responses.jsonl   # scores against v1.1 by default

Each line of responses.jsonl is {"key": int, "response": str}. A missing response counts as a fail.

Reproducing

Everything is in developer0hye/llm-evals:

  • the audit of IFEval-Ko and the translator comparison;
  • the guideline, raw translator output, reviews and every edit with its reason;
  • per-item model responses and the analysis script.

NOTES.md there is the full research log: every decision, number and dead end behind this post.