<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://1npc.github.io/feed.xml" rel="self" type="application/atom+xml"/><link href="https://1npc.github.io/" rel="alternate" type="text/html" hreflang="en"/><updated>2026-10-14T13:19:39+00:00</updated><id>https://1npc.github.io/feed.xml</id><title type="html">blank</title><subtitle>Xiao Zhang is a computational linguistics PhD candidate at the University of Groningen, working on formal meaning representation, knowledge in large language models, and AI game characters. </subtitle><entry><title type="html">The curse of knowledge in role-playing language models</title><link href="https://1npc.github.io/blog/2026/curse-of-knowledge-in-role-play/" rel="alternate" type="text/html" title="The curse of knowledge in role-playing language models"/><published>2026-10-14T10:00:00+00:00</published><updated>2026-10-14T10:00:00+00:00</updated><id>https://1npc.github.io/blog/2026/curse-of-knowledge-in-role-play</id><content type="html" xml:base="https://1npc.github.io/blog/2026/curse-of-knowledge-in-role-play/"><![CDATA[<figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/curse-of-knowledge/fig1-example-480.webp 480w,/assets/img/curse-of-knowledge/fig1-example-800.webp 800w,/assets/img/curse-of-knowledge/fig1-example-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/curse-of-knowledge/fig1-example.png" class="post-hero" width="520" height="auto" alt="Two mechanics say in Spanish that a mirror is in the warehouse. Mara, who speaks only English, is asked what they talked about. In version A she says a mirror is in the warehouse, in version B a chair is in a church, and with a flag saying she did not understand, she says she did not catch a word." loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>Mara speaks only English. Two mechanics standing next to her say, in Spanish, that the mirror is in the warehouse, and a friend asks her what they were talking about. She tells him: a mirror, in the warehouse.</p> <p>The language model playing Mara read the Spanish and understood it. Mara could not have. Psychologists call the human version of this the curse of knowledge: once you know something, it is hard to reason as someone who does not. This post summarises <a href="https://arxiv.org/abs/2610.17327">a new paper</a> on how often role-playing models fall into it, what decides whether they do, and what prevents it.</p> <p><strong>The short version.</strong> In 11 open-weight models, characters repeat speech they cannot understand or cannot hear in most replies, while the same models can say correctly what the character perceives. Five of six proprietary models rarely leak, but even in strong models, whether the boundary holds can depend on the input format. Prompting and thinking help a few models. What works reliably is giving the model only what the character could perceive.</p> <h2 id="why-this-matters">Why this matters</h2> <p>Games and agent simulations keep a world state: who is in the room, who can hear whom, which languages each character speaks. They pass that state to a language model, which speaks as one character at a time. The model therefore always sees more than the character it plays.</p> <p>Whether it can hold that back decides whether a secret stays secret and whether a language barrier means anything. Deduction games, stealth games and simulations of how rumours spread are all built on the difference between what happened and what a character could know.</p> <h2 id="measuring-a-leak">Measuring a leak</h2> <p>A model can name the hidden fact by guessing, so each scene comes with a twin. Versions A and B differ only in the hidden object and place, and everything else stays the same, as in the figure above. A reply counts as using the target when it names its own version’s fact, and as using the foil when it names the twin’s. Net use is the difference in percentage points (pp): 100 when every reply names its own fact and none names the twin’s, and 0 for a model that only guesses.</p> <p>Two separate probes check the rest. A translation probe confirms that the model understands the hidden speech. A state probe shows the model the same character sheet and asks, out of character, whether the character could hear and understand it.</p> <p>The studies cover 480 scenes, 11 open-weight models of up to 40B parameters, DeepSeek-V4-Pro, and six proprietary models.</p> <h2 id="knowing-the-rule-breaking-it">Knowing the rule, breaking it</h2> <p>Under the plainest statement of the boundary, open-weight characters use speech they cannot understand at <strong>66.7 pp</strong> and speech they cannot hear at <strong>72.2 pp</strong>. Every model is above 45 pp in both.</p> <figure class="post-figure"> <img class="fig-light" src="/assets/img/curse-of-knowledge/boundary-light.svg" alt="Dot plot: the 11 open-weight models and DeepSeek-V4-Pro use speech the character cannot understand or hear at 66 to 78 pp; Claude Sonnet 5.5 reaches 26 pp, and the other five proprietary models stay at or below 9 pp." loading="lazy"/> <img class="fig-dark" src="/assets/img/curse-of-knowledge/boundary-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">Net use of speech the character cannot perceive, with 95% intervals. Open-weight models use it in most replies. Five of six proprietary models rarely do, while still using permitted content in about 99% of control replies.</figcaption> </figure> <p><strong>They read the boundary correctly.</strong> Ten of the 11 models answer the state probe correctly for 87–100% of scenes, and on exactly those scenes net use is 68.4 pp. Sometimes the gap is visible inside a single reply:</p> <blockquote> <p>“They’re talking about some envelope, but I can’t understand a word they’re saying. Something about the parking lot, though.”</p> </blockquote> <p><strong>The question does not have to ask for it.</strong> When the friend asks only whether the character caught what was said, net use is still 52.7 pp, and 50.1 pp when he asks what to do next.</p> <p><strong>It is not only speech, and not only talk.</strong> The same leak appears for actions the character cannot see (60.6 pp) and private messages it cannot read (72.0 pp). It persists through four further exchanges, and it steers behaviour: when the character chooses between two places to search, moving the hidden fact from one place to the other moves the choice by 49–63 pp.</p> <p><strong>Scale does not fix it.</strong> Within Qwen3.5, net use rises from 13.9 pp at 0.8B to 82.7 pp at 9B.</p> <p>The proprietary models show that the boundary can be learned. GPT-6 Sol, Gemini 3.8 Flash and Grok 4.7 stay at or below 1 pp, Claude Opus 5.5 at or below 5.4 pp and Gemini 3.1 Pro at or below 9 pp. Claude Sonnet 5.5 is the exception, at 26 pp for speech it cannot understand, and falls to 3 pp with high reasoning effort. DeepSeek-V4-Pro behaves like the smaller open-weight models.</p> <h2 id="the-format-decides">The format decides</h2> <p>Gemma-4-31B leaks unheard speech at 51 pp in one study and almost never in the other. The two studies describe the scene differently, so I swapped the parts of the input one at a time to find out which difference mattered.</p> <figure class="post-figure"> <img class="fig-light" src="/assets/img/curse-of-knowledge/format-light.svg" alt="Dumbbell chart: swapping a single part of the input raises Gemma-4-31B from 0 to 62 pp, Qwen3.8-27B from 9 to 68, and Falcon-H1-34B and Seed-OSS-36B to 100; swapping all four parts raises DeepSeek-V4-Pro to 67, Gemini 3.1 Pro to 21 and Claude Sonnet 5.5 to 13." loading="lazy"/> <img class="fig-dark" src="/assets/img/curse-of-knowledge/format-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">The same scenes and the same boundary. Only one part of the prompt changes, or for the last three models all four parts. For the open-weight models, use of permitted speech stays at 80–100% in every variant, so the swaps change only what they do with speech they should not use.</figcaption> </figure> <p>For Gemma-4-31B, the layout of the scene state alone takes it from 0 to 62 pp, and to 96 pp on a fresh set of scenes. For Qwen3.8-27B it is the character sheet alone, from 9 to 68 pp. For Falcon-H1-34B and Seed-OSS-36B it is the wording of the question, which takes both to 100 pp. With all four parts swapped, Gemini 3.1 Pro goes from 0 to 21 pp and Claude Sonnet 5.5 from under 1 to 13 pp.</p> <p>Nothing about what the character could hear has changed. The part that matters differs from model to model, which means a model that passes with one prompt format has told you very little about the next one.</p> <h2 id="not-a-role-play-problem">Not a role-play problem</h2> <p>A plausible explanation lies in what models have read. Fiction routinely renders foreign speech for the reader and reports what characters failed to notice, so continuing a scene from the full state is the familiar task. If that is right, writing the character’s line as the scene’s author should leak about as much as playing the character, and it does: 76 and 81 pp as the author, only 6 pp below role-play.</p> <p>Thinking rarely helps. With thinking enabled, net use for speech the character cannot understand barely moves. For unheard speech it falls by 8.5 pp, almost all of it from a single model, Qwen3.8-27B, which drops from 73 to 18 pp. GLM-4.7-Flash gets worse on speech it cannot understand, from 63 to 89 pp. Its reasoning notes that two people are gossiping “in a language he doesn’t understand”, and the reply then says where the wallet is.</p> <h2 id="what-works">What works</h2> <p><strong>Asking the model to filter itself is unreliable.</strong> A list-first prompt asks the model to “list only what X can perceive and understand right now” and then answer from that list. It cuts net use by 64.7% on average, but only for models that write a clean list. Others put the hidden values straight into it. Self-filtering also throws away content the character is allowed to use: Qwen3.8-27B’s filter returns only “Casey says something in Japanese” even when the character speaks Japanese.</p> <p><strong>Filtering in the system works.</strong> The system already knows what each character can access, so it can build the input from that. A character view keeps the events the character perceived and replaces each hidden one with what remains observable, such as “Alex appears to put something away.” Net use falls from 60.7 pp to zero, use of permitted content does not change, and hidden facts no longer move search choices. Deleting the hidden event also stops the leak, but then the character mentions what it did see in only 32% of replies, against 100% under the view.</p> <p>A character who cannot understand Spanish is safest when its model never sees the Spanish sentence.</p> <h2 id="what-i-take-away">What I take away</h2> <ol> <li><strong>Reading a boundary is not keeping it.</strong> Most models state correctly what the character perceives and then use what it does not.</li> <li><strong>Vary the input format before trusting a result.</strong> One layout, one character sheet or one question can move a model from 0 to over 60 pp.</li> <li><strong>Report permitted use next to leakage.</strong> A model that says nothing passes a leakage test trivially; self-filtering often looks like this.</li> <li><strong>Decide access outside the model.</strong> Give the generator what the character can perceive, not the whole scene and a rule about it.</li> </ol> <p>The paper, with all numbers and the full set of models, is <a href="https://arxiv.org/abs/2610.17327">on arXiv</a>, and the scenes, prompts, scorer and analysis code are <a href="https://github.com/1npc/curse-of-knowledge-roleplay">on GitHub</a>. If you build characters on top of a shared world state and have found other ways to keep them from knowing too much, I would like to hear about them.</p>]]></content><author><name></name></author><category term="research"/><category term="role-play"/><category term="LLM"/><category term="game-AI"/><summary type="html"><![CDATA[Language models that speak as game characters repeat what those characters could not have heard or understood, even when they can say exactly what the character perceives.]]></summary></entry><entry><title type="html">Some failed ideas in semantic parsing</title><link href="https://1npc.github.io/blog/2026/some-failed-ideas-in-semantic-parsing/" rel="alternate" type="text/html" title="Some failed ideas in semantic parsing"/><published>2026-10-13T10:00:00+00:00</published><updated>2026-10-13T10:00:00+00:00</updated><id>https://1npc.github.io/blog/2026/some-failed-ideas-in-semantic-parsing</id><content type="html" xml:base="https://1npc.github.io/blog/2026/some-failed-ideas-in-semantic-parsing/"><![CDATA[<figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/semparse-failures/notebook.svg" sizes="95vw"/> <img src="/assets/img/semparse-failures/notebook.svg" class="post-hero" width="600" height="auto" alt="A notebook page listing four ideas for semantic parsing, each crossed out, with red-pen verdicts: SFT did it better, Smatch already knew, pseudo-labels won, a coin flip." loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>Papers report what worked. This post is about four things that did not, from a few days of experiments on parsing text into Discourse Representation Structures (DRS) and Abstract Meaning Representation (AMR). Each idea looked reasonable on paper, and each one fell apart once it was compared with the right baseline. I am writing them down because the reasons they failed are more useful than the ideas themselves.</p> <p><strong>The short version.</strong> Reinforcement learning did not beat supervised fine-tuning. A logic-verified reward was redundant with Smatch. A translation-invariance reward lost to plain pseudo-labelling. DRS did not work as a meaning checker for machine translation.</p> <h2 id="setup">Setup</h2> <p>Every experiment fine-tunes <strong>Qwen3.5-0.8B-Base</strong> with full fine-tuning and decodes greedily.</p> <ul> <li><strong>DRS:</strong> Parallel Meaning Bank 5.1, English, in Sequence Box Notation (SBN). 9,057 gold training sentences, plus silver data, and 1,132 dev sentences.</li> <li><strong>AMR:</strong> AMR 3.0, with 55,635 training graphs and 1,722 dev graphs.</li> <li><strong>Metric:</strong> Smatch, and SBN-Smatch for DRS. Duplicate triples are removed before matching, so that repeating a triple cannot raise the score.</li> </ul> <p>A caveat that applies to everything below: these are <strong>dev-set numbers</strong>, mostly from <strong>one seed</strong>, at <strong>0.8B</strong> scale. Confidence intervals are paired bootstraps over sentences, so they do not include seed variance. Read the numbers as evidence for a direction, not as final results.</p> <h2 id="1-rl-post-training-does-not-beat-sft">1. RL post-training does not beat SFT</h2> <p><strong>The idea.</strong> GRPO with a verifiable reward has become the standard way to post-train LLMs, and semantic parsing has a reward that is easy to verify: Smatch against the gold graph. So I tried GRPO with a sentence-level Smatch reward on top of a supervised parser. There is prior work on this for AMR, both <a href="https://aclanthology.org/2025.xllm-1.11/">recent</a> and <a href="https://aclanthology.org/P19-1451/">older</a>.</p> <p><strong>The comparison that matters.</strong> GRPO generates samples and learns from them, so it gets more training than the SFT checkpoint it starts from. A fair comparison gives the baseline the same prompts and the same number of updates. I used two controls:</p> <ul> <li><strong>RFT:</strong> fine-tune on the best of 8 samples.</li> <li><strong>Continued SFT:</strong> keep training on the gold targets.</li> </ul> <figure class="post-figure"> <img class="fig-light" src="/assets/img/semparse-failures/selection-light.svg" alt="Dot plot: with SFT selected by dev loss, all three post-training methods gain about half a point; with SFT selected by dev Smatch, none of them moves." loading="lazy"/> <img class="fig-dark" src="/assets/img/semparse-failures/selection-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">DRS dev SBN-Smatch. Starting from an SFT checkpoint picked by dev loss (orange), GRPO, RFT and continued SFT all gain about half a point. Picking the SFT checkpoint by dev Smatch (blue) gives a bigger gain for free, and after that none of the three moves.</figcaption> </figure> <p>The first result looked like a success. GRPO improved its starting point by +0.53 Smatch, with a 95% interval of [0.27, 0.84]. RFT and continued SFT improved it just as much, though. And simply picking the SFT checkpoint by dev Smatch instead of dev loss gave <strong>+1.1</strong> on its own. The “RL gain” was a checkpoint-selection artefact: the starting model was under-trained, and any further training fixed it.</p> <p><strong>Why RL has nothing to learn.</strong> GRPO learns from the differences in reward between samples drawn for the same input. A well-trained parser on its own training sentences produces eight identical outputs most of the time.</p> <figure class="post-figure"> <img class="fig-light" src="/assets/img/semparse-failures/starvation-light.svg" alt="Line chart: on a well-trained DRS parser, more than 90% of GRPO groups have zero reward variance throughout training; on an under-trained parser and on AMR the share is 20 to 45%." loading="lazy"/> <img class="fig-dark" src="/assets/img/semparse-failures/starvation-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">Share of GRPO groups where all 8 samples get the same reward, and so contribute no gradient (10-iteration moving average). On a well-trained DRS parser this is above 90% from the first step. The mean training reward there is 0.998.</figcaption> </figure> <p>The headroom does exist, but it is on unseen sentences. On dev, with the earlier under-trained checkpoint, the best of 16 samples scored 97.1 against 93.9 for greedy decoding. RL on training sentences the model has already memorised cannot reach it.</p> <p><strong>AMR looked like a win, until I split the gain.</strong> AMR is harder, and its SFT model is far from saturated (training reward 0.88). Here GRPO did beat both controls, on two seeds: dev went from 81.5 to 82.3 and from 81.7 to 82.4. Then I recomputed the gain using only the sentences where <em>both</em> systems produce a well-formed graph.</p> <figure class="post-figure"> <img class="fig-light" src="/assets/img/semparse-failures/amr-validity-light.svg" alt="Confidence-interval plot: GRPO's AMR gain over the SFT start shrinks from +0.75 to +0.08 when restricted to sentences where both outputs are well-formed." loading="lazy"/> <img class="fig-dark" src="/assets/img/semparse-failures/amr-validity-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">AMR dev, paired differences with 95% intervals. Against its own starting point, GRPO's +0.75 becomes +0.08 (interval [−0.11, 0.26]) once malformed outputs are excluded. It fixed 28 malformed graphs and broke 10.</figcaption> </figure> <p>Roughly 90% of the improvement is GRPO learning to emit balanced, parseable PENMAN. That is worth having, but a constrained decoder gives it for free.</p> <p><strong>Is RL just starved of fresh data?</strong> To test this, I held out 30% of the DRS gold data, trained SFT on the other 70%, and then post-trained on the held-out part.</p> <figure class="post-figure"> <img class="fig-light" src="/assets/img/semparse-failures/data-efficiency-light.svg" alt="Bar chart: SFT turns the held-out 30% of gold data into +1.81 Smatch, GRPO into +0.96, and RFT into +0.67." loading="lazy"/> <img class="fig-dark" src="/assets/img/semparse-failures/data-efficiency-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">Each bar is the gain from the same extra 30% of gold data. SFT on all the data gains +1.81; GRPO on the extra 30% gains +0.96.</figcaption> </figure> <p>Given fresh labelled data, SFT used it about twice as well as GRPO. The one RL-specific signal I saw was small. Trained on English only, GRPO transferred slightly better zero-shot to German, Italian and Dutch than RFT or SFT did: +0.3 to +0.7 points on the well-trained model. This fits the view that RL with verifiable rewards <a href="https://arxiv.org/abs/2504.13837">sharpens what the model already does</a>, and that GRPO <a href="https://arxiv.org/abs/2505.13697">behaves much like filtered self-training</a>.</p> <h2 id="2-a-logic-verified-reward-is-redundant-with-smatch">2. A logic-verified reward is redundant with Smatch</h2> <p><strong>The idea.</strong> Smatch counts overlapping triples. Dropping a negation therefore costs about as much as dropping an adjective, even though one flips the meaning and the other only weakens it. DRSs have a model-theoretic semantics, so I built a checker in three steps:</p> <ol> <li>Translate SBN into first-order logic. A world argument handles modality and propositional attitudes.</li> <li>Align the predicted and gold referents using Smatch’s alignment.</li> <li>Ask the z3 solver whether the prediction is <strong>equivalent</strong> to the gold, <strong>entails</strong> it, is <strong>entailed</strong> by it, or <strong>contradicts</strong> it.</li> </ol> <p>The plan was to use this four-way relation as a reward.</p> <p><strong>The checker works.</strong></p> <table> <thead> <tr> <th>test on 1,132 dev sentences</th> <th>result</th> </tr> </thead> <tbody> <tr> <td>gold vs. gold</td> <td>1,132 / 1,132 equivalent (0.4 s in total)</td> </tr> <tr> <td>NEGATION box turned into CONTINUATION</td> <td>162 / 166 contradictions</td> </tr> <tr> <td>only a word sense changed</td> <td>equivalent once senses are aligned</td> </tr> </tbody> </table> <p><strong>But there was nothing for it to fix.</strong> Among the greedy outputs of the SFT parser, <strong>none</strong> contradicted the gold. Of the outputs with sentence Smatch ≥ 0.9, 13.8% were not logically equivalent, but almost all of these were role or attachment mistakes that Smatch already penalises. Across 16 samples per sentence, the sample with the best Smatch was logically equivalent <strong>83.7%</strong> of the time. Picking an equivalent sample whenever any of the 16 was equivalent would have reached only <strong>85.2%</strong>.</p> <p>Selecting by Smatch already finds nearly every logically correct parse, so a logic reward has almost no extra signal to give. A sound verifier is only useful as a reward if the errors it catches actually happen. (Using theorem proving to <em>evaluate</em> semantic parsers has been proposed <a href="https://arxiv.org/abs/2510.11225">separately</a>.)</p> <h2 id="3-a-translation-invariance-reward-loses-to-pseudo-labelling">3. A translation-invariance reward loses to pseudo-labelling</h2> <p><strong>The idea.</strong> Meaning should not change under translation, and the Parallel Meaning Bank is built on exactly this: its English, German, Italian and Dutch documents share one DRS. Given parallel text, I could reward a German parse for agreeing with the parser’s own parse of the English translation. That needs no German annotation at all.</p> <p>I used about 155k German, 95k Italian and 28k Dutch sentences with English translations from the PMB (text only), and compared four arms that use the same information in different ways.</p> <figure class="post-figure"> <img class="fig-light" src="/assets/img/semparse-failures/xl-same-information-light.svg" alt="Line chart over 150 iterations: SFT on the model's own English parses reaches 88.2, SFT on PMB copper annotations 85.8, and the two GRPO variants 83.3 and 81.6." loading="lazy"/> <img class="fig-dark" src="/assets/img/semparse-failures/xl-same-information-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">Mean SBN-Smatch on German, Italian and Dutch dev. GRPO and SFT that see the same information: SFT wins by about five points in both pairs. Training on the model's own English parses even beats the PMB's projected "copper" annotations.</figcaption> </figure> <p>The simplest baseline (parse the English side, train on the result) was the best method, and it was not close. One caveat: the English translations of most German, Italian and Dutch dev documents are in the English training data. That inflates absolute cross-lingual numbers for every system, although the comparison between systems is still fair.</p> <p><strong>A side observation.</strong> Adding about 140k English silver sentences to SFT raised English dev from 92.5 to 95.0, but <em>lowered</em> zero-shot German, Italian and Dutch from 79.2 to 72.8. More English-only data made the parser more English-specific.</p> <h2 id="4-drs-is-not-a-usable-meaning-checker-for-mt">4. DRS is not a usable meaning checker for MT</h2> <p><strong>The idea.</strong> If DRSs are language-neutral, you can parse a source sentence and its translation and compare the two meanings directly. That should catch the errors MT metrics are known to miss, such as antonyms, numbers, named entities, gender and word sense. I tested this on the English–German part of <a href="https://aclanthology.org/2022.wmt-1.44/">ACES</a>. Each ACES item pairs a source with a correct and an incorrect translation, and a good metric should prefer the correct one. I fixed the categories and the decision rule before scoring.</p> <p>The parser was not the problem. It scored 89.3 on PMB German dev, and 96.8% of the ACES sentences parsed into well-formed DRSs. The metric was.</p> <figure class="post-figure"> <img class="fig-light" src="/assets/img/semparse-failures/aces-light.svg" alt="Dot plot of ACES tau per category: the DRS check is clearly positive only for sentence-level contradictions and near or below zero elsewhere." loading="lazy"/> <img class="fig-dark" src="/assets/img/semparse-failures/aces-dark.svg" alt="" aria-hidden="true" loading="lazy"/> <figcaption class="caption">Pairwise tau on ACES English↔German. Ties count as errors, as in ACES, so 0 is roughly chance. The DRS check works only for sentence-level contradictions (0.78). For one-word errors it is near or below chance. chrF is shown only as a surface-overlap reference; ACES is designed so that such metrics struggle.</figcaption> </figure> <p>There were two problems.</p> <ul> <li><strong>Parser noise is larger than the error.</strong> ACES changes one word in a sentence of about 11 words, and the parses of the good and bad translation differ by more than that word for unrelated reasons. Sometimes the difference disappears altogether: “married in 1842” and “married in 6842” received identical SBNs. On gender, the correct translation won 415 times, the incorrect one won 421 times, and 844 pairs tied.</li> <li><strong>The logic relation saturates.</strong> Two independently produced parses in different languages are almost never logically equivalent once every word sense counts. So both translations come out as merely “compatible” with the source, and the solver cannot tell them apart.</li> </ul> <p>Detecting cross-lingual divergence with AMR <a href="https://aclanthology.org/2024.cl-2.1/">has been studied more carefully</a>. What this experiment shows is narrower: finding one-word errors this way needs far more precise parses than current sentence-level parsers produce on this kind of text.</p> <h2 id="what-i-take-away">What I take away</h2> <ol> <li><strong>Select SFT checkpoints by the task metric before trying anything clever.</strong> Dev-loss selection left about a Smatch point on the table, and every method I tried happily “recovered” it.</li> <li><strong>Check whether RL has a signal before tuning it.</strong> The training reward and the share of zero-variance groups tell you in minutes whether GRPO can move.</li> <li><strong>Separate validity gains from content gains.</strong> With graph outputs, “fewer malformed outputs” can pass for better parsing.</li> <li><strong>For a task with one canonical output, imitation is hard to beat.</strong> Whenever SFT and RL had access to the same information, SFT won.</li> <li><strong>A correct verifier is not automatically a useful reward or metric.</strong> It has to target errors that actually happen, at a granularity the parser can resolve.</li> </ol> <p>None of this says that RL or logic has no place in semantic parsing. It says that the obvious versions do not pay off on PMB- and AMR-style benchmarks with a well-trained small model. If you have seen these ideas work in a setting like this, I would like to know what was different.</p>]]></content><author><name></name></author><category term="research"/><category term="semantic-parsing"/><category term="negative-results"/><category term="DRS"/><category term="AMR"/><summary type="html"><![CDATA[Four ideas for DRS and AMR parsing that did not survive a matched baseline — RL post-training, a logic-verified reward, a translation-invariance reward, and DRS as a meaning checker for machine translation.]]></summary></entry><entry><title type="html">From a model that talks to a character that lives</title><link href="https://1npc.github.io/blog/2026/introducing-npcbank/" rel="alternate" type="text/html" title="From a model that talks to a character that lives"/><published>2026-09-26T10:00:00+00:00</published><updated>2026-09-26T10:00:00+00:00</updated><id>https://1npc.github.io/blog/2026/introducing-npcbank</id><content type="html" xml:base="https://1npc.github.io/blog/2026/introducing-npcbank/"><![CDATA[<p>This post lives on the NPCBank blog: <a href="https://npcbank.org/blog-introducing-npcbank.html">From a model that talks to a character that lives</a>.</p>]]></content><author><name></name></author><category term="research"/><category term="benchmark"/><category term="LLM"/><summary type="html"><![CDATA[Introducing NPCBank, source-grounded game characters with inspectable dialogue cases, and three challenges for building characters that adapt to their world without losing themselves.]]></summary></entry><entry><title type="html">OntoURL: A Benchmark for Ontological Understanding, Reasoning and Learning</title><link href="https://1npc.github.io/blog/2025/ontourl/" rel="alternate" type="text/html" title="OntoURL: A Benchmark for Ontological Understanding, Reasoning and Learning"/><published>2025-08-18T10:00:00+00:00</published><updated>2025-08-18T10:00:00+00:00</updated><id>https://1npc.github.io/blog/2025/ontourl</id><content type="html" xml:base="https://1npc.github.io/blog/2025/ontourl/"><![CDATA[<figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/ontourl/icon.svg" sizes="95vw"/> <img src="/assets/img/ontourl/icon.svg" class="post-hero" width="520" height="auto" alt="OntoURL" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>Language models are fluent about knowledge. Whether they can <em>operate</em> on it is a different question, and a harder one to ask, because most benchmarks reward a model for recognising a fact rather than for doing anything with it.</p> <p>OntoURL asks the harder version. It takes 40 ontologies across 8 domains — formal, symbolic descriptions of a field in terms of classes, relations, properties, and instances — and builds 58,981 questions over them, spread across 15 tasks in three groups:</p> <ul> <li><strong>Understanding</strong> — reading ontology content: class definitions, relations, properties, instances.</li> <li><strong>Reasoning</strong> — symbolic inference: description logic, SWRL rules, constraint propagation.</li> <li><strong>Learning</strong> — producing structure: generating definitions, building hierarchies, aligning ontologies.</li> </ul> <p>Running 20 open models through it gives a consistent and fairly stark picture. On understanding, everything from 3B up scores in the seventies and eighties. On reasoning, scores drop. On learning, they collapse — most models score near zero on three of the five generation tasks, and the largest model in the study reaches 21.6 on the best of them. Scaling helps with understanding and barely moves learning.</p> <div class="post-links"> <a href="https://arxiv.org/abs/2505.11031">Paper</a> <a href="https://huggingface.co/datasets/XiaoZhang98/OntoURL">Dataset</a> <a href="https://github.com/LastDance500/Bench_Construct">Code</a> </div> <p>The paper is under minor revision at the <em>Journal of Web Semantics</em>.</p> <h2 id="getting-the-data">Getting the data</h2> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">datasets</span> <span class="kn">import</span> <span class="n">load_dataset</span>

<span class="c1"># Authenticate with `huggingface-cli login` if needed
</span><span class="n">ds</span> <span class="o">=</span> <span class="nf">load_dataset</span><span class="p">(</span><span class="sh">"</span><span class="s">XiaoZhang98/OntoURL</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div> <p>Construction code, inference scripts, and the prompt templates for every task and shot setting are in <a href="https://github.com/LastDance500/Bench_Construct">Bench_Construct</a>.</p> <h2 id="the-15-tasks">The 15 tasks</h2> <table> <thead> <tr> <th>Category</th> <th>ID</th> <th>Task</th> <th>Format</th> <th>Metric</th> <th>Size</th> </tr> </thead> <tbody> <tr> <td><strong>Understanding</strong></td> <td>U1</td> <td>Class definition understanding</td> <td>MCQ</td> <td>Accuracy</td> <td>9,151</td> </tr> <tr> <td> </td> <td>U2</td> <td>Class relation understanding</td> <td>MCQ</td> <td>Accuracy</td> <td>9,201</td> </tr> <tr> <td> </td> <td>U3</td> <td>Property domain understanding</td> <td>MCQ</td> <td>Accuracy</td> <td>375</td> </tr> <tr> <td> </td> <td>U4</td> <td>Instance class understanding</td> <td>MCQ</td> <td>Accuracy</td> <td>2,475</td> </tr> <tr> <td> </td> <td>U5</td> <td>Instance definition understanding</td> <td>MCQ</td> <td>Accuracy</td> <td>3,814</td> </tr> <tr> <td><strong>Reasoning</strong></td> <td>R1</td> <td>Inferred relation reasoning</td> <td>MCQ</td> <td>Accuracy</td> <td>8,208</td> </tr> <tr> <td> </td> <td>R2</td> <td>Constraint reasoning</td> <td>MCQ</td> <td>Accuracy</td> <td>6,956</td> </tr> <tr> <td> </td> <td>R3</td> <td>Instance class reasoning</td> <td>MCQ</td> <td>Accuracy</td> <td>3,793</td> </tr> <tr> <td> </td> <td>R4</td> <td>SWRL-based logic reasoning</td> <td>MCQ</td> <td>Accuracy</td> <td>6,517</td> </tr> <tr> <td> </td> <td>R5</td> <td>Description logic reasoning</td> <td>T/F</td> <td>Accuracy</td> <td>2,560</td> </tr> <tr> <td><strong>Learning</strong></td> <td>L1</td> <td>Class definition generation</td> <td>Generation</td> <td>ROUGE-L</td> <td>2,936</td> </tr> <tr> <td> </td> <td>L2</td> <td>Class hierarchy construction</td> <td>Generation</td> <td>Triple-F1</td> <td>952</td> </tr> <tr> <td> </td> <td>L3</td> <td>Property relation construction</td> <td>Generation</td> <td>Triple-F1</td> <td>256</td> </tr> <tr> <td> </td> <td>L4</td> <td>Constraint construction</td> <td>Generation</td> <td>Triple-F1</td> <td>643</td> </tr> <tr> <td> </td> <td>L5</td> <td>Ontology alignment</td> <td>Generation</td> <td>Tuple-F1</td> <td>1,149</td> </tr> </tbody> </table> <p>MCQ = multiple choice, T/F = true/false.</p> <h2 id="results">Results</h2> <p>Performance (%) of 16 LLMs across the 15 tasks. <strong>★</strong> is the best overall model; <strong>◆</strong> is the best within a size group.</p> <h3 id="34b">3–4B</h3> <table> <thead> <tr> <th>Model</th> <th>U1</th> <th>U2</th> <th>U3</th> <th>U4</th> <th>U5</th> <th>R1</th> <th>R2</th> <th>R3</th> <th>R4</th> <th>R5</th> <th>L1</th> <th>L2</th> <th>L3</th> <th>L4</th> <th>L5</th> </tr> </thead> <tbody> <tr> <td>Qwen2.5-3B</td> <td>77.8</td> <td>86.3</td> <td>80.3</td> <td>85.8</td> <td>77.8</td> <td>81.5</td> <td>74.9</td> <td>65.7</td> <td>62.5</td> <td>67.9</td> <td>5.9</td> <td>0.1</td> <td>0.0</td> <td>0.2</td> <td>6.7</td> </tr> <tr> <td>Phi-4-4B</td> <td>77.5</td> <td>91.1</td> <td>75.5</td> <td>87.2</td> <td>78.8</td> <td>80.2</td> <td>80.7</td> <td>63.5</td> <td>59.1</td> <td>51.1</td> <td>9.4</td> <td>0.1</td> <td>0.0</td> <td>0.0</td> <td>0.1</td> </tr> </tbody> </table> <h3 id="78b">7–8B</h3> <table> <thead> <tr> <th>Model</th> <th>U1</th> <th>U2</th> <th>U3</th> <th>U4</th> <th>U5</th> <th>R1</th> <th>R2</th> <th>R3</th> <th>R4</th> <th>R5</th> <th>L1</th> <th>L2</th> <th>L3</th> <th>L4</th> <th>L5</th> </tr> </thead> <tbody> <tr> <td>Qwen2.5-7B ◆</td> <td>83.1</td> <td>90.6</td> <td>77.6</td> <td>90.1</td> <td>83.6</td> <td>87.6</td> <td>88.2</td> <td>73.9</td> <td>66.0</td> <td>68.6</td> <td>5.6</td> <td>0.4</td> <td>0.1</td> <td>0.3</td> <td>16.2</td> </tr> <tr> <td>Ollm-wiki-7B</td> <td>74.3</td> <td>84.5</td> <td>67.2</td> <td>81.4</td> <td>77.0</td> <td>65.2</td> <td>83.3</td> <td>53.4</td> <td>57.3</td> <td>59.3</td> <td>6.0</td> <td>0.1</td> <td>0.0</td> <td>0.2</td> <td>0.1</td> </tr> <tr> <td>Ollm-arxiv-7B</td> <td>74.1</td> <td>84.4</td> <td>67.5</td> <td>81.5</td> <td>77.0</td> <td>64.2</td> <td>82.8</td> <td>53.1</td> <td>56.6</td> <td>58.4</td> <td>6.0</td> <td>0.1</td> <td>0.0</td> <td>0.0</td> <td>8.3</td> </tr> <tr> <td>LLaMA3.1-8B</td> <td>79.8</td> <td>87.4</td> <td>74.9</td> <td>88.4</td> <td>81.1</td> <td>79.8</td> <td>84.2</td> <td>72.3</td> <td>62.2</td> <td>68.9</td> <td>6.4</td> <td>0.1</td> <td>0.0</td> <td>0.1</td> <td>15.3</td> </tr> <tr> <td>Mistral-8B</td> <td>78.9</td> <td>88.6</td> <td>62.4</td> <td>83.9</td> <td>79.5</td> <td>81.0</td> <td>88.4</td> <td>60.1</td> <td>62.4</td> <td>52.7</td> <td>10.3</td> <td>0.1</td> <td>0.0</td> <td>0.1</td> <td>16.4</td> </tr> <tr> <td>Internlm3-8B</td> <td>83.1</td> <td>90.9</td> <td>72.0</td> <td>88.9</td> <td>82.4</td> <td>88.5</td> <td>90.5</td> <td>73.8</td> <td>67.2</td> <td>62.9</td> <td>6.3</td> <td>0.2</td> <td>0.0</td> <td>0.4</td> <td>12.0</td> </tr> <tr> <td>Aya-8B</td> <td>77.1</td> <td>85.8</td> <td>62.4</td> <td>83.8</td> <td>77.9</td> <td>73.0</td> <td>78.0</td> <td>62.6</td> <td>57.4</td> <td>63.6</td> <td>7.5</td> <td>0.1</td> <td>0.0</td> <td>0.0</td> <td>6.3</td> </tr> </tbody> </table> <h3 id="1432b">14–32B</h3> <table> <thead> <tr> <th>Model</th> <th>U1</th> <th>U2</th> <th>U3</th> <th>U4</th> <th>U5</th> <th>R1</th> <th>R2</th> <th>R3</th> <th>R4</th> <th>R5</th> <th>L1</th> <th>L2</th> <th>L3</th> <th>L4</th> <th>L5</th> </tr> </thead> <tbody> <tr> <td>Qwen2.5-14B</td> <td>86.6</td> <td>92.0</td> <td>75.5</td> <td>91.4</td> <td>85.8</td> <td>89.6</td> <td>94.0</td> <td>76.4</td> <td>71.2</td> <td>63.6</td> <td>5.6</td> <td>0.1</td> <td>0.1</td> <td>0.1</td> <td>19.5</td> </tr> <tr> <td>Mistral-22B</td> <td>83.9</td> <td>90.4</td> <td>69.6</td> <td>88.6</td> <td>84.4</td> <td>86.3</td> <td>86.9</td> <td>69.3</td> <td>64.0</td> <td>54.3</td> <td>7.5</td> <td>0.1</td> <td>0.0</td> <td>0.8</td> <td>15.8</td> </tr> <tr> <td>Qwen2.5-32B ◆</td> <td>88.0</td> <td>90.6</td> <td>81.9</td> <td>91.2</td> <td>87.2</td> <td>89.7</td> <td>95.5</td> <td>76.8</td> <td>72.4</td> <td>68.4</td> <td>5.7</td> <td>1.6</td> <td>0.1</td> <td>1.5</td> <td>20.3</td> </tr> <tr> <td>QwQ-32B</td> <td>82.2</td> <td>89.6</td> <td>77.1</td> <td>88.9</td> <td>81.5</td> <td>84.0</td> <td>92.5</td> <td>70.8</td> <td>60.6</td> <td>63.4</td> <td>6.1</td> <td>1.1</td> <td>0.2</td> <td>1.1</td> <td>18.0</td> </tr> <tr> <td>Aya-32B</td> <td>81.2</td> <td>90.5</td> <td>61.6</td> <td>89.7</td> <td>82.3</td> <td>85.5</td> <td>83.1</td> <td>70.3</td> <td>66.0</td> <td>68.8</td> <td>6.5</td> <td>0.1</td> <td>0.1</td> <td>0.5</td> <td>19.3</td> </tr> </tbody> </table> <h3 id="7072b">70–72B</h3> <table> <thead> <tr> <th>Model</th> <th>U1</th> <th>U2</th> <th>U3</th> <th>U4</th> <th>U5</th> <th>R1</th> <th>R2</th> <th>R3</th> <th>R4</th> <th>R5</th> <th>L1</th> <th>L2</th> <th>L3</th> <th>L4</th> <th>L5</th> </tr> </thead> <tbody> <tr> <td>LLaMA3.3-70B</td> <td>88.0</td> <td>94.1</td> <td>76.8</td> <td>91.8</td> <td>90.0</td> <td>91.9</td> <td>92.9</td> <td>76.8</td> <td>70.9</td> <td>64.2</td> <td>5.7</td> <td>0.1</td> <td>0.0</td> <td>0.7</td> <td>20.2</td> </tr> <tr> <td>Qwen2.5-72B ★</td> <td>89.1</td> <td>92.6</td> <td>84.3</td> <td>92.6</td> <td>89.4</td> <td>92.1</td> <td>93.4</td> <td>77.5</td> <td>75.6</td> <td>68.4</td> <td>6.0</td> <td>0.1</td> <td>0.0</td> <td>1.0</td> <td>21.6</td> </tr> </tbody> </table> <p>Read the columns left to right and the story is the same at every scale: the U block is comfortable, the R block is workable, and the L block falls off a cliff. Whatever these models are doing with an ontology, it is not building one.</p> <h2 id="what-is-next">What is next</h2> <p>A website and public leaderboard are in progress. We also plan to extend OntoURL beyond English — EN, DE, IT, ZH, JA to start — and beyond text.</p> <h2 id="citation">Citation</h2> <div class="language-bibtex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">@article</span><span class="p">{</span><span class="nl">zhang2025ontourl</span><span class="p">,</span>
  <span class="na">title</span><span class="p">=</span><span class="s">{OntoURL: A Benchmark for Evaluating Large Language Models on Symbolic Ontological Understanding, Reasoning and Learning}</span><span class="p">,</span>
  <span class="na">author</span><span class="p">=</span><span class="s">{Zhang, Xiao and Lai, Huiyuan and Meng, Qianru and Bos, Johan}</span><span class="p">,</span>
  <span class="na">journal</span><span class="p">=</span><span class="s">{arXiv preprint arXiv:2505.11031}</span><span class="p">,</span>
  <span class="na">year</span><span class="p">=</span><span class="s">{2025}</span>
<span class="p">}</span>
</code></pre></div></div> <p>OntoURL is released under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>. Questions and feedback are welcome — <a href="mailto:xiao_is_npc@outlook.com">xiao_is_npc@outlook.com</a>.</p>]]></content><author><name></name></author><category term="research"/><category term="ontology"/><category term="LLM"/><category term="benchmark"/><summary type="html"><![CDATA[A benchmark of 58,981 questions over 40 ontologies, testing whether language models can do more with symbolic knowledge than recognise it.]]></summary></entry></feed>