<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: jiang tao</title>
    <description>The latest articles on DEV Community by jiang tao (@jiang_tao_5956d598e81b030).</description>
    <link>https://dev.to/jiang_tao_5956d598e81b030</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4199191%2Ffcbbe262-a4fb-404e-a7ca-dca93a3402c3.png</url>
      <title>DEV Community: jiang tao</title>
      <link>https://dev.to/jiang_tao_5956d598e81b030</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jiang_tao_5956d598e81b030"/>
    <language>en</language>
    <item>
      <title>My students kept getting the same exam questions wrong, so I let a small model explain them at 2am</title>
      <dc:creator>jiang tao</dc:creator>
      <pubDate>Wed, 21 Oct 2026 21:42:08 +0000</pubDate>
      <link>https://dev.to/jiang_tao_5956d598e81b030/my-students-kept-getting-the-same-exam-questions-wrong-so-i-let-a-small-model-explain-them-at-2am-58cb</link>
      <guid>https://dev.to/jiang_tao_5956d598e81b030/my-students-kept-getting-the-same-exam-questions-wrong-so-i-let-a-small-model-explain-them-at-2am-58cb</guid>
      <description>&lt;p&gt;--This is a submission for the &lt;a href="https://dev.to/devteam/join-the-hacktoberfest-open-source-ai-challenge-slow-and-steady-2850-in-prizes-across-21-3iee"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;*&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I run a small study site called tokutegino. It helps foreign workers in Japan prepare for the construction exam of the Specified Skilled Worker visa (特定技能). There are 1,058 questions, and every one is available in five languages.&lt;/p&gt;

&lt;p&gt;The questions were never the hard part. The hard part is the moment after you get one wrong.&lt;/p&gt;

&lt;p&gt;Most of my users work on building sites all day. They study on the train or in bed, tired, on a cheap phone. When they miss a question about scaffolding or a safety sign, the site shows the right answer. That's it. If they want to know why, they copy the Japanese into a translator, then search, then give up.&lt;/p&gt;

&lt;p&gt;So I built Sloth Coach. When you get a question wrong, Gemma runs inside your browser and explains it in your language, in two or three plain sentences: 中文, English, Tiếng Việt, Bahasa Indonesia, or やさしい日本語. At the end of a session it writes a short list for tomorrow: the questions to look at again, and why.&lt;/p&gt;

&lt;p&gt;You don't search. You don't translate. You don't decide what to review. You keep answering, and the list is waiting when you come back. That's the lazy part. After a ten-hour shift, it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Try it here: &lt;a href="https://tokutei-sloth-coach.taojianghu.workers.dev/" rel="noopener noreferrer"&gt;https://tokutei-sloth-coach.taojianghu.workers.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open it in Chrome or Edge with WebGPU, pick your language, and press "Load model". A session is 10 questions. Get a few wrong on purpose, and after the tenth you see tomorrow's review list. No WebGPU? You can still practise, and you get my reference note for each mistake instead of the rewrite.&lt;/p&gt;

&lt;p&gt;The demo uses 22 sample questions I wrote for this challenge. They cover scaffolding, fall protection, ladders, weather limits, licences, oxygen deficiency, safety colours, and KY activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/LANGTAOSHA-prog" rel="noopener noreferrer"&gt;
        LANGTAOSHA-prog
      &lt;/a&gt; / &lt;a href="https://github.com/LANGTAOSHA-prog/tokutei-sloth-coach" rel="noopener noreferrer"&gt;
        tokutei-sloth-coach
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🦥 Sloth Coach&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A lazy mistake coach for the Japanese &lt;strong&gt;Specified Skilled Worker (特定技能) construction exam&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Get a question wrong and &lt;strong&gt;Gemma runs inside your browser&lt;/strong&gt; (WebLLM + WebGPU) to explain why, in your own language: 中文, English, Tiếng Việt, Bahasa Indonesia, or やさしい日本語. At the end of a session it writes tomorrow's review list from your past mistakes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No server, no API key, no account&lt;/li&gt;
&lt;li&gt;The model downloads once, then works offline&lt;/li&gt;
&lt;li&gt;Your mistakes stay in your browser's localStorage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19" rel="nofollow"&gt;DEV Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Models&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;WebLLM model id&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma3-1b-it-q4f16_1-MLC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default. Smallest download, runs on many phones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma-2-2b-it-q4f16_1-MLC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Better explanations, bigger download&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma-4-E2B-it-q4f16_1-MLC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Newest Gemma, largest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it stays honest&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;A 1B model doesn't know Japanese safety law. So it is never asked to. Each question ships with a short reference note, and the prompt tells the model to…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/LANGTAOSHA-prog/tokutei-sloth-coach" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The whole thing is three static files. No backend, no API key, no account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 3 1B (instruction tuned, 4-bit, &lt;code&gt;gemma3-1b-it-q4f16_1-MLC&lt;/code&gt;), running in the browser through WebLLM on WebGPU. You can switch to Gemma 2 2B or Gemma 4 E2B if your device can handle a bigger download.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; the questions live in &lt;code&gt;questions.json&lt;/code&gt;. Each one has the choices, the answer, and a short reference note I wrote myself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt:&lt;/strong&gt; a 1B model doesn't know Japanese safety law, so I never ask it to. It gets the question, the learner's wrong choice, the right choice, and my note. Its only job is to rewrite that note for this person, in their language. Japanese technical words stay in Japanese with a short meaning, because that's what they'll see on the real exam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; the instruction "Answer only in [language]" goes at the very end of the prompt. Small models drift between languages, and the last line is the one they follow best.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review list:&lt;/strong&gt; wrong answers go into &lt;code&gt;localStorage&lt;/code&gt;. When the session ends, you get the list of what you missed, and the model writes a three-line plan for tomorrow's 10-minute review: which topic first, and why. The next session puts those questions at the front automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; a free Cloudflare Worker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default model is about 0.9 GB and downloads once. After that it's cached, and the coach works offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;For this project, a closed API was never a real option.&lt;/p&gt;

&lt;p&gt;Money first. My users pay a few hundred yen, once. If every explanation cost me an API call, one heavy user studying every night would eat their whole payment. With an open model in the browser, each explanation costs me nothing. I set it up once and stop thinking about it.&lt;/p&gt;

&lt;p&gt;Then connection. A lot of studying happens on the subway or in dorms with weak Wi-Fi. Once the model is cached, nothing needs the network.&lt;/p&gt;

&lt;p&gt;Then privacy. Which questions someone keeps failing is personal. It says a lot about their Japanese and their chances on the exam. None of it leaves their phone.&lt;/p&gt;

&lt;p&gt;And open weights mean I can test the explanations in all five languages myself, and swap in a better small model the day one comes out. I'm not waiting on anyone's pricing page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Before: get a question wrong, copy the Japanese, paste it into a translator, search for the rule, try to remember it tomorrow. On a tired night, most people skip all of it.&lt;/p&gt;

&lt;p&gt;Now: get a question wrong, read two sentences in your own language. Tomorrow's review list writes itself.&lt;/p&gt;

&lt;p&gt;Four steps became zero. The learner's only job is to keep answering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Best Use of Gemma&lt;/p&gt;

</description>
      <category>gemma</category>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
