<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>unirt.dev</title><description>技術の話とか</description><link>https://unirt.dev/</link><item><title>AWS を退職しました</title><link>https://unirt.dev/blog/leaving-aws/</link><guid isPermaLink="true">https://unirt.dev/blog/leaving-aws/</guid><description>AWS を退職しました</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AWS を退職しました。&lt;/p&gt;
&lt;p&gt;学生のころに AWS を使ってみて、その良さにハマりました。2021年に新卒で入社してからの5年半は、その好きなものを伝え、広めていく立場で働けた時間でした。&lt;/p&gt;
&lt;p&gt;ソリューションアーキテクトとして主に金融系のお客様を担当させていただき、イベントでの登壇や技術コミュニティ、直近では特に AI-DLC の活動を通じて、多くの方とご一緒できました。&lt;/p&gt;
&lt;p&gt;ここ数年で生成 AI が台頭し、SA に求められることもどんどん変わっていきました。それでも、お客様を起点に考えるという大事なところは変わりません。その上で自分に何ができるか、どんな価値を出せるかを考えながら働けたのは、自分にとって大きな経験でした。&lt;/p&gt;
&lt;p&gt;素晴らしいお客様と同僚に恵まれ、刺激的な毎日を送れて幸せでした。ありがとうございました！&lt;/p&gt;
&lt;p&gt;10月からは、小さなスタートアップで新しいことを始めます。&lt;br&gt;
またどこかでお会いしたら、よろしくお願いします！&lt;/p&gt;
</content:encoded></item><item><title>Jev で問い合わせを振り分け、自信のないものだけ人に回せるか</title><link>https://unirt.dev/blog/jev-confidence-threshold/</link><guid isPermaLink="true">https://unirt.dev/blog/jev-confidence-threshold/</guid><description>架空の銀行に届いた問い合わせ10件を、判断だけを返すモデル Jev に分類させ、確信のないものだけ人が見る運用を試した。「当日対応が要るか」のような二択は全問正解だったので、迷った2件を人に回しても得るものがない。外れが出た3段階の評価では、誤りを全部止めようとすると半分近くが人に回る。</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;分類を自動化しようとすると、たいてい全部任せるか全部やめるかの二択になる。9割当たるなら9割は任せたい。でも外れる1割がどれか分からないので、結局すべて目視する。&lt;/p&gt;
&lt;p&gt;確率が返るモデルなら、ここを分けられるはずだった。確信しているものは通し、迷っているものだけ人に回す。このやり方は、外れやすいところに人手を集中できるので、全件見るより安い。&lt;/p&gt;
&lt;h2 id=&quot;同じ文面に4つ聞く&quot;&gt;同じ文面に4つ聞く&lt;/h2&gt;
&lt;p&gt;架空のネット銀行に届いた問い合わせを&lt;a href=&quot;https://github.com/unirt/jev-eval-ja/blob/main/eval/cases/triage.json&quot;&gt;10件作って&lt;/a&gt;、それぞれに4つの質問を投げた。使ったのは &lt;a href=&quot;https://unirt.dev/blog/jev-workers-ai/&quot;&gt;Jev&lt;/a&gt; で、質問の型が3つある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;department&lt;/code&gt;（choice）：口座管理、振込、投資商品、アプリ不具合、本人確認、その他から一つ選ばせる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;needs_same_day&lt;/code&gt;（noul）：当日中に担当者が対応する必要があるか。確率で返る&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_offensive&lt;/code&gt;（noul）：担当者への暴言が含まれるか&lt;/li&gt;
&lt;li&gt;&lt;code&gt;frustration&lt;/code&gt;（score）：穏やか、苛立ちあり、強い怒りの3段階のどこか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;判断が割れるものを混ぜてある。「身に覚えのない出金が3件あります。確認をお願いします」は、文面が穏やかなのに当日対応が要る。「いい加減にしてください。3回問い合わせても誰も答えません。責任者を出してください」は、強い苦情ではあるが暴言ではない。&lt;/p&gt;
&lt;p&gt;結果は型で綺麗に分かれた。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;質問&lt;/th&gt;
&lt;th&gt;型&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;一致&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;choice&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;needs_same_day&lt;/td&gt;
&lt;td&gt;noul&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;is_offensive&lt;/td&gt;
&lt;td&gt;noul&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;frustration&lt;/td&gt;
&lt;td&gt;score&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;文面が穏やかで緊急、という組み合わせも、強い苦情と暴言の区別も、外さなかった。落ちたのは3段階のスコアだけだった。&lt;/p&gt;
&lt;h2 id=&quot;線を引く場所がない&quot;&gt;線を引く場所がない&lt;/h2&gt;
&lt;p&gt;では自信のないものを人に回そう、と &lt;code&gt;confidence&lt;/code&gt; を見にいったところで詰まった。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;confidence&lt;/code&gt; は「その答えがどれくらい確からしいか」を表す数値で、選択肢の確率が片方に寄っているほど高くなる。ところが、返ってくる質問と返ってこない質問がある。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;needs_same_day&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;noul&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;noul&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.82&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;department&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:     { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;choice&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;choice&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;security&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                    &quot;probabilities&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;security&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.98&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;account&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.02&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                    &quot;confidence&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.96&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;frustration&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:    { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;score&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;score&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.65&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                    &quot;probabilities&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.36&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.63&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.01&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                    &quot;confidence&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.43&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;confidence&lt;/code&gt; が返るのは choice と score だけだった。noul は確率そのものしか返さない。&lt;/p&gt;
&lt;p&gt;考えてみれば当然で、二値の確率は 0.82 と言った時点で確信の度合いも同時に言っている。0.5 からの距離がそのまま確信になる。選択肢が3つ以上あると、同じ「一番高いのは0.4」でも残りが 0.35 と 0.25 に割れているのか 0.3 と 0.3 なのかで意味が違うので、別の数字が要る。&lt;/p&gt;
&lt;p&gt;つまり noul に線を引くなら、&lt;code&gt;confidence&lt;/code&gt; ではなく 0.5 からの距離を使うことになる。0.3 から 0.7 のあいだを人に回す、ということになる。&lt;/p&gt;
&lt;h2 id=&quot;引いてみたが何も買えなかった&quot;&gt;引いてみたが、何も買えなかった&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;needs_same_day&lt;/code&gt; でその帯に入ったのは2件だった。「昨日の15時に振込手続きをしましたが、相手先にまだ着金していないようです」が 0.41、「振込の画面でエラーコードが出て先に進めません」が 0.44。&lt;/p&gt;
&lt;p&gt;どちらも正解だった。&lt;/p&gt;
&lt;p&gt;noul は10件とも当たっていたのだから、当然そうなる。2件を人に回す運用は、2割を人件費に変えて、何も買っていない。&lt;/p&gt;
&lt;p&gt;外れるものがない範囲に線を引いても意味がない。当たり前の話だが、裏返すと、精度が出ているうちは線引きの設計そのものが要らない。線が効くのは、外れるほうの質問のほうだ。&lt;/p&gt;
&lt;h2 id=&quot;score-は高いところで切らないと止まらない&quot;&gt;score は高いところで切らないと止まらない&lt;/h2&gt;
&lt;p&gt;落ちた &lt;code&gt;frustration&lt;/code&gt; の2件を &lt;code&gt;confidence&lt;/code&gt; と並べる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ケース&lt;/th&gt;
&lt;th&gt;Jevの答え&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;confidence&lt;/th&gt;
&lt;th&gt;正解&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;身に覚えのない出金&lt;/td&gt;
&lt;td&gt;苛立ちあり&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;0.33&lt;/td&gt;
&lt;td&gt;穏やか&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;着金していない&lt;/td&gt;
&lt;td&gt;穏やか&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;0.60&lt;/td&gt;
&lt;td&gt;苛立ちあり&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;低い。&lt;code&gt;confidence&lt;/code&gt; が 0.90 以上だった6件はすべて正解だった。ここまでは期待どおりだった。&lt;/p&gt;
&lt;p&gt;ところが質問文を英語に書き換えて同じ10件を回すと、&lt;code&gt;confidence&lt;/code&gt; 0.80 で外すケースが出た。2回の実行を合わせると、0.90 以上の12件は全部正解で、誤りは 0.33 と 0.60 と 0.80 に散っている。&lt;/p&gt;
&lt;p&gt;0.7 で切ると 0.80 の誤りが素通りする。0.9 で切れば全部止められるが、そのとき10件のうち4件から5件が人の手に回る。半分近くを見るなら、最初から全部見るのとどれだけ違うのか。&lt;/p&gt;
&lt;h2 id=&quot;正解のほうを疑う&quot;&gt;正解のほうを疑う&lt;/h2&gt;
&lt;p&gt;もっとも、外した2件は正解ラベルのほうが怪しい。&lt;/p&gt;
&lt;p&gt;正解ラベルというのは、ケースを作るときにこちらで付けた「本当はこうであるべき」という答えのことだ。一致率は、モデルの出力とこのラベルがどれだけ合ったかを測っている。ラベルが間違っていれば、正しい答えが不正解として数えられる。&lt;/p&gt;
&lt;p&gt;「昨日の15時に振込手続きをしましたが、相手先にまだ着金していないようです」に苛立ちありを付けたのはこちらの判断で、文面そのものは丁寧だ。Jevは日本語版で 0.27、英語版で 0.13 と、二度とも穏やか側に置いた。どちらが正しいかは、この文だけでは決まらない。&lt;/p&gt;
&lt;p&gt;3段階のラベルは人間どうしでも揃わない。揃わないものを正解にして測っているので、8割という数字はモデルの精度ではない。こちらが付けたラベルとどれだけ合ったか、というだけの数字だ。&lt;/p&gt;
&lt;h2 id=&quot;確率のぶれ&quot;&gt;確率のぶれ&lt;/h2&gt;
&lt;p&gt;線引きの話をする前に、確率そのものが実行ごとにどれだけ動くのかを見ておいた。同じ入力でも毎回まったく同じ値が返るとは限らないので、閾値の近くにいる判定は実行ごとに変わりうる。&lt;/p&gt;
&lt;p&gt;40のケースと質問の組を5回ずつ回して、判定が反転したものは0件、確率の幅は最大 0.08 だった。&lt;/p&gt;
&lt;p&gt;動き方に癖がある。0.00 や 2.00 や 0.06 のように端に振れているものは、5回とも小数第2位まで同じ値を返す。幅が出るのは 0.41 から 0.44、0.52 から 0.58 のような、真ん中にいるケースだけだった。&lt;/p&gt;
&lt;p&gt;閾値の近くにいるものほどぶれる。運用としては嫌な性質だ。ただ、ぶれること自体が「ここは割れる」という情報でもある。&lt;/p&gt;
&lt;h2 id=&quot;結局どう組むか&quot;&gt;結局どう組むか&lt;/h2&gt;
&lt;p&gt;二値に落とせる質問は落としたほうがいい。noul は10件とも当たったうえ、確率そのものが確信の度合いを兼ねているので、読む数字が一つで済む。&lt;/p&gt;
&lt;p&gt;3段階以上を使うなら、&lt;code&gt;confidence&lt;/code&gt; 0.9 で切って半分近くを人に回す前提で見積もる。そして、そこまでして測っているものが本当に3段階要るのかを先に疑ったほうがいい。「苛立ちあり」と「強い怒り」を分ける必要があったのかは、今回のケースを作った側として自信がない。&lt;/p&gt;
&lt;p&gt;線を引ける場所と、引く意味のある場所は別だった。&lt;/p&gt;
</content:encoded></item><item><title>NGワードの正規表現を、意味で判断する Jev に置き換えられるか</title><link>https://unirt.dev/blog/jev-replace-fixed-rules/</link><guid isPermaLink="true">https://unirt.dev/blog/jev-replace-fixed-rules/</guid><description>「必ず儲かる」は NGワードの正規表現で拾えても、「値下がりの心配はまずない」は拾えない。投資信託の紹介文10件で比べると、正しく判定できたのは正規表現が4件、Jev が9件だった。ただし社名の突き合わせでは、改称前後の銀行を別の会社と答えるなど、知識が要る判定を外した。</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;投資商品の紹介文を公開する前のチェックを10件用意して、NGワードの正規表現と、&lt;a href=&quot;https://unirt.dev/blog/jev-workers-ai/&quot;&gt;意味で判断するモデル&lt;/a&gt;の両方に通した。正規表現が4件、モデルが9件だった。&lt;/p&gt;
&lt;p&gt;ただし置き換えられたのは取りこぼしのほうだけで、知識が要る判定は外している。その1件も、事実を一行足したら解けた。&lt;/p&gt;
&lt;h2 id=&quot;言い過ぎを機械で拾う&quot;&gt;言い過ぎを機械で拾う&lt;/h2&gt;
&lt;p&gt;金融商品を扱うサービスでは、紹介文やお知らせを公開する前に、言い過ぎていないかを確認する工程を置くことが多い。値上がりを断定していないか、元本が減らないように読めないか、といったところを見る。最終的には人が判断するが、件数が多いので、まず機械で一次チェックを挟む。&lt;/p&gt;
&lt;p&gt;その一次チェックは、だいたい正規表現の配列から始まる。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; NG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#DBEDFF&quot;&gt;絶対&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#DBEDFF&quot;&gt;必ず(儲&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#DBEDFF&quot;&gt;もう)か&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#DBEDFF&quot;&gt;元本保証&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#DBEDFF&quot;&gt;損はしません&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#DBEDFF&quot;&gt;リスクなし&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;自然な選び方だと思う。差し戻される表現はある程度決まっているし、正規表現なら速いうえ、なぜ引っかかったかが一目で分かる。新しい言い回しが出るたびにパターンを一つ足す。リストは伸び続けるが、伸ばせばいずれ追いつくものだと思っていた。&lt;/p&gt;
&lt;h2 id=&quot;増やしても追いつかず増やすと誤検知が出る&quot;&gt;増やしても追いつかず、増やすと誤検知が出る&lt;/h2&gt;
&lt;p&gt;個人向けのネット銀行と証券をひとつのアプリで出している架空のサービスを想定して、投資信託の紹介文を10件作った。差し戻すべき文が5件、問題ない文が5件。ケースと実行スクリプトは&lt;a href=&quot;https://github.com/unirt/jev-eval-ja&quot;&gt;リポジトリ&lt;/a&gt;に置いてある。&lt;/p&gt;
&lt;p&gt;上の正規表現に通すと、正しく判定できたのは4件だった。&lt;/p&gt;
&lt;p&gt;見逃したのはこういう文だった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;過去5年で一度もマイナスになっていません。今後も同様の推移が期待できます。&lt;/li&gt;
&lt;li&gt;預金と同じ感覚でお使いいただけます。&lt;/li&gt;
&lt;li&gt;値下がりの心配はまずないと考えてよいでしょう。&lt;/li&gt;
&lt;li&gt;年利8%を安定して出し続けているファンドです。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;登録済みのどのパターンとも語彙が重なっていない。「元本保証」とも「絶対」とも書かずに、元本が減らないことを読ませている。&lt;/p&gt;
&lt;p&gt;厄介なのは誤検知のほうだった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本商品に元本保証はありません。&lt;/li&gt;
&lt;li&gt;絶対収益型のファンドとして運用しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前者は、むしろ書いておくべき注意文である。後者の「絶対収益型」は、相場が下がる局面でも利益を狙う運用方針を指す商品分類の名前で、これも問題ない。それでも &lt;code&gt;元本保証&lt;/code&gt; と &lt;code&gt;絶対&lt;/code&gt; に当たる。正規表現は、直後の打ち消しを見ないし、語がどこで切れるかも見ない。&lt;/p&gt;
&lt;p&gt;見逃しを潰そうとパターンを増やせば、この種の誤検知が増える。片方を締めると、もう片方が緩む。&lt;/p&gt;
&lt;h2 id=&quot;意味で判断させる&quot;&gt;意味で判断させる&lt;/h2&gt;
&lt;p&gt;同じ10件を &lt;a href=&quot;https://unirt.dev/blog/jev-workers-ai/&quot;&gt;Jev&lt;/a&gt; に投げた。判断の材料になる文章と、聞きたいことの定義を渡すと、確率が返ってくるモデルである。質問は真偽を聞く &lt;code&gt;noul&lt;/code&gt; ひとつだけ。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  is_violation&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;noul&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    instructions&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;この文章に、社内のコンプライアンスチェックで差し戻される表現が含まれるか&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    criteria&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;利益や値上がりを断定する、元本割れしないと誤認させる、リスクがないかのように読ませる表現がある&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      false&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;事実の記述、リスクの説明、注意喚起にとどまっている&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;criteria&lt;/code&gt; には、パターンではなく判断の方針を書く。何にマッチさせるかではなく、何をもって差し戻すかを説明する形になる。&lt;/p&gt;
&lt;p&gt;正規表現が4件、Jevが9件。見逃されていた4件は 0.58 から 0.88 で拾い、「元本保証はありません」は 0.09 で問題なしと答えた。打ち消しを読んでいる。&lt;/p&gt;
&lt;p&gt;外したのは1件だけで、それが「絶対収益型のファンドとして運用しています」だった。確率は 0.59。正規表現が誤検知したのと同じ文で、Jev も差し戻す側に倒している。&lt;/p&gt;
&lt;p&gt;真ん中に来た確率は2つあって、もう一つは「預金と同じ感覚でお使いいただけます」の 0.58 だった。こちらは当たっている。残る8件は 0.05 から 0.97 まで、どれも端に寄っていた。&lt;/p&gt;
&lt;p&gt;0.5 のあたりに来たことは、間違えている印ではない。人間でも割れる文だという印でしかなく、どちらに倒れたかは別の話だった。&lt;/p&gt;
&lt;h2 id=&quot;文字列の距離では解けない名寄せ&quot;&gt;文字列の距離では解けない名寄せ&lt;/h2&gt;
&lt;p&gt;固定ルールにはもう一つの形がある。&lt;/p&gt;
&lt;p&gt;同じ組織が「株式会社〇〇」と「〇〇」のように違う書き方で登録されることがあって、これを同じものとして扱う作業を名寄せと呼ぶ。一番素直なやり方は、登録名をキーにして完全一致で引くことだ。速いし、当たれば確実である。ただし1文字でも違うと当たらない。&lt;/p&gt;
&lt;p&gt;名寄せを機械でやるとき、次に思いつくのが文字列の近さで測る方法になる。何文字書き換えれば同じ文字列になるかを数える編集距離が代表的で、近ければ同じ組織とみなす。&lt;/p&gt;
&lt;p&gt;実在の金融機関名で10組を作って、同じ組織かどうかを聞いた。この「文字列が近ければ同じ」という前提が崩れるペアを、両方向に入れてある。&lt;/p&gt;
&lt;p&gt;確率は実行ごとに 0.02 ほど動く。以下の話に効く差ではないが、手元で再現したときに小数第2位が合わないのはそのためだ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称A&lt;/th&gt;
&lt;th&gt;名称B&lt;/th&gt;
&lt;th&gt;正解&lt;/th&gt;
&lt;th&gt;Jev&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;みずほ銀行&lt;/td&gt;
&lt;td&gt;みずほ信託銀行&lt;/td&gt;
&lt;td&gt;別&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;三井住友銀行&lt;/td&gt;
&lt;td&gt;三井住友信託銀行&lt;/td&gt;
&lt;td&gt;別&lt;/td&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;楽天銀行&lt;/td&gt;
&lt;td&gt;楽天証券&lt;/td&gt;
&lt;td&gt;別&lt;/td&gt;
&lt;td&gt;0.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;野村證券&lt;/td&gt;
&lt;td&gt;野村証券&lt;/td&gt;
&lt;td&gt;同一&lt;/td&gt;
&lt;td&gt;0.97&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新生銀行&lt;/td&gt;
&lt;td&gt;SBI新生銀行&lt;/td&gt;
&lt;td&gt;同一&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ジャパンネット銀行&lt;/td&gt;
&lt;td&gt;PayPay銀行&lt;/td&gt;
&lt;td&gt;同一&lt;/td&gt;
&lt;td&gt;0.16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上の3組が、字面は近いのに別の会社という向き。「みずほ銀行」と「みずほ信託銀行」は2文字の追加でしかないが、別の法人である。編集距離で閾値を引けば、まず同一に倒れる。Jevは 0.15 と 0.08 で、はっきり別だと答えた。&lt;/p&gt;
&lt;p&gt;下の3組は逆で、字面が離れているのに同じ会社だ。「證」と「証」の違いは解けた。改称も「SBI」が前に付くだけなら 0.54 でかろうじて解けた。&lt;/p&gt;
&lt;p&gt;解けなかったのが「ジャパンネット銀行」と「PayPay銀行」で、0.16、つまり別の会社だと答えている。この2つは同じ銀行で、2021年に名前が変わった。重なっている文字は「銀行」だけなので、文字列を見るかぎり手掛かりがない。&lt;/p&gt;
&lt;h2 id=&quot;知らないだけだった&quot;&gt;知らないだけだった&lt;/h2&gt;
&lt;p&gt;改称の事実を、判断の材料になる文章のほうに一行足して、もう一度聞いた。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;名称A: ジャパンネット銀行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;名称B: PayPay銀行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;参考: ジャパンネット銀行は2021年にPayPay銀行へ商号変更した。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;0.96 になった。0.54 で危なかった「新生銀行 / SBI新生銀行」も、同じように事実を足すと 0.96 まで上がる。別の会社の組はいずれも確率が下がり、判定が緩くなったわけでもなかった。&lt;/p&gt;
&lt;p&gt;推論ができなかったのではなく、知らなかっただけだった。&lt;/p&gt;
&lt;p&gt;そして、知らないことを教える場所があった。正規表現に「この会社は改称した」と伝える書き方はない。パターンを足すか、前段に表記の対応表を持つか、どちらにしても判定の外側に別の仕組みを建てることになる。&lt;/p&gt;
&lt;p&gt;置き換えられるのは、意味を読めば分かるほうだ。知識が要ることは置き換えられないが、判断の材料に混ぜておけば解ける。固定ルールとの差は、精度よりもまず、載せる先があるかどうかにあった。&lt;/p&gt;
</content:encoded></item><item><title>文章を書かずに判断だけ返すモデル Jev を Workers AI で動かす</title><link>https://unirt.dev/blog/jev-workers-ai/</link><guid isPermaLink="true">https://unirt.dev/blog/jev-workers-ai/</guid><description>LLM に分類だけさせても、答えの JSON を一文字ずつ書き出すぶん時間と料金がかかる。Jev はそこを省いて確率だけを返す。Workers AI からの呼び出し方、つまずいた2点、料金と速さをまとめた。</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;問い合わせのメールを読んで、急ぎかどうかを判定する。どの部署に回すかを決める。この手の仕事を LLM にやらせると、返ってくるのは &lt;code&gt;{&quot;urgent&quot;: true}&lt;/code&gt; のような短い JSON になる。&lt;/p&gt;
&lt;p&gt;ただ、その一行を作るためにモデルがやっていることは、文章を書くときと変わらない。LLM は文字や単語のかたまり（トークン）を、先頭から一つずつ予測して並べていく。&lt;code&gt;{&lt;/code&gt; の次は &lt;code&gt;&quot;&lt;/code&gt;、その次は &lt;code&gt;u&lt;/code&gt;、というふうに。一つ前まで出した内容を見て次を決めるので、この方式を自己回帰と呼ぶ。&lt;/p&gt;
&lt;p&gt;欲しいのが真偽値ひとつでも、道のりは同じである。出力が長いほど時間がかかり、多くのサービスでは出力トークンにも課金される。JSON schema で形式を縛っても、一つずつ並べていること自体は変わらない。&lt;/p&gt;
&lt;p&gt;Jev には、この並べる部分がない。&lt;/p&gt;
&lt;h2 id=&quot;何を受け取って何を返すのか&quot;&gt;何を受け取って何を返すのか&lt;/h2&gt;
&lt;p&gt;TypeSafe が2026年9月に公開したモデルで、同社はこれを &lt;a href=&quot;https://docs.typesafe.ai/concepts/system-one&quot;&gt;System One model&lt;/a&gt; と呼んでいる。名前は Kahneman の言うシステム1、速くて直感的なほうの思考から取っている。考え込まずに即答する側の役割、という位置づけになる。&lt;/p&gt;
&lt;p&gt;渡すものは2つある。判断の材料になる文章（&lt;code&gt;state&lt;/code&gt;）と、それについて何を聞きたいかの定義（&lt;code&gt;questions&lt;/code&gt;）だ。返ってくるのは、質問ごとの数値だけ。文章は一文字も出てこない。&lt;/p&gt;
&lt;p&gt;質問は3種類ある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;noul&lt;/strong&gt;：そうである確率を 0 から 1 で返す。真偽を聞くときに使う&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;choice&lt;/strong&gt;：用意した選択肢から一つ選び、どれがどれくらいの確率かも返す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;score&lt;/strong&gt;：「弱い、普通、強い」のような段階のどこに当たるかを、連続値で返す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;noul&lt;/code&gt; は聞き慣れないが、TypeSafe が付けた名前で、真偽を確率で答える質問を指す。&lt;code&gt;true&lt;/code&gt; か &lt;code&gt;false&lt;/code&gt; ではなく 0.82 が返るので、boolean とは別物として名前を分けているのだと思う。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;choice&lt;/code&gt; と &lt;code&gt;score&lt;/code&gt; には &lt;code&gt;confidence&lt;/code&gt; という数値も付く。これは「その答えがどれくらい確からしいか」を表す。選択肢の確率が 0.98 対 0.02 のように片方に寄っていれば高く、0.36 対 0.63 のように割れていれば低くなる。&lt;/p&gt;
&lt;p&gt;Cloudflare には &lt;a href=&quot;https://developers.cloudflare.com/ai/models/typesafe/jev/&quot;&gt;&lt;code&gt;typesafe/jev&lt;/code&gt;&lt;/a&gt; というモデル ID で、他社製モデルとして組み込まれている。&lt;/p&gt;
&lt;h2 id=&quot;workers-ai-から呼ぶ&quot;&gt;Workers AI から呼ぶ&lt;/h2&gt;
&lt;p&gt;Cloudflare Workers でモデルを使うときは、設定ファイルに binding を1行書いておくと、コードから &lt;code&gt;env.AI&lt;/code&gt; として触れるようになる（&lt;a href=&quot;https://github.com/unirt/jev-eval-ja&quot;&gt;コード一式&lt;/a&gt;）。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;jev-eval-ja&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;main&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;src/index.ts&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;compatibility_date&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;2026-09-19&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;ai&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;binding&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;AI&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;呼び出しは、モデル ID と入力を渡すだけで終わる。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; env.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;AI&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;typesafe/jev&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, { state, questions });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;questions&lt;/code&gt; は、質問ごとに型と指示と判定基準を並べる。&lt;code&gt;instructions&lt;/code&gt; が聞きたいこと、&lt;code&gt;criteria&lt;/code&gt; がどう判断してほしいかの説明になる。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  is_urgent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;noul&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    instructions&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Does this convey urgency?&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    criteria&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Explicitly time-sensitive&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;No urgency expressed&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  department&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;choice&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    instructions&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Which team should handle this?&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    criteria&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      billing&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Payments, invoicing, refunds&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      technical&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Bugs, outages, integrations&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      sales&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Pricing, upgrades, new accounts&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  frustration&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;score&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    instructions&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;How frustrated is the customer?&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    criteria&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Calm&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Frustrated&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;Very angry&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;state&lt;/code&gt; に &lt;code&gt;Help! My payouts have been failing for 3 days.&lt;/code&gt; を入れて呼ぶと、こう返る。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;is_urgent&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:   { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;noul&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;noul&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.95&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;department&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:  { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;choice&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;choice&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;billing&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                   &quot;probabilities&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;billing&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.98&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;technical&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.02&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                   &quot;confidence&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.96&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;frustration&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;score&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;score&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.65&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                   &quot;probabilities&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.36&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.63&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.01&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;                   &quot;confidence&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0.43&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;score&lt;/code&gt; の 0.65 は、&lt;code&gt;criteria&lt;/code&gt; に並べた3段階を 0、1、2 と見たときの位置を表す。0.65 なので「Calm」と「Frustrated」の間、やや後者寄りということになる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;confidence&lt;/code&gt; が付いているのは &lt;code&gt;choice&lt;/code&gt; と &lt;code&gt;score&lt;/code&gt; だけで、&lt;code&gt;noul&lt;/code&gt; には付かない。二値なら 0.95 と答えた時点で確からしさも同時に言っているので、別の数値が要らないのだと思う。&lt;/p&gt;
&lt;p&gt;ここまでは素直だった。&lt;/p&gt;
&lt;h2 id=&quot;動かすまでに踏んだもの&quot;&gt;動かすまでに踏んだもの&lt;/h2&gt;
&lt;p&gt;一つめ。&lt;code&gt;wrangler dev&lt;/code&gt; をそのまま起動しても動かない。&lt;/p&gt;
&lt;p&gt;Workers AI のモデルは Cloudflare 側でしか実行できないので、ローカルで完結する開発モードでは呼べない。&lt;code&gt;--remote&lt;/code&gt; を付けると、手元のコードを Cloudflare 上で動かす形になって通る。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; wrangler&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; --remote&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;二つめのほうが厄介で、最初の呼び出しがこれで落ちた。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;AiGatewayError 2021: Insufficient AI Gateway credits&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Workers AI には Cloudflare 自身が用意したモデルと、他社が提供するモデルの2種類がある。&lt;code&gt;typesafe/jev&lt;/code&gt; は後者なので、Workers AI の無料枠には乗らない。&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;AI Gateway に事前チャージしたクレジット&lt;/a&gt;から引かれる仕組みになっている。&lt;/p&gt;
&lt;p&gt;ダッシュボードの AI Gateway で支払い方法を登録して Top-up したら通るようになった。購入額に5%の手数料が乗るが、モデルの利用料そのものへの上乗せはない。&lt;/p&gt;
&lt;h2 id=&quot;値段と速さ&quot;&gt;値段と速さ&lt;/h2&gt;
&lt;p&gt;課金対象は入力トークンだけで、100万トークンあたり $0.042。出力は $0 と表示される。文章を書かないモデルなので、出力側で課金する根拠がない、ということだろう。&lt;/p&gt;
&lt;p&gt;ただし応答の &lt;code&gt;usage&lt;/code&gt; には &lt;code&gt;output_tokens&lt;/code&gt; も入っていて、質問3つのときで63だった。テキストが一文字も出てこないのに何を数えた値なのかは分からない。料金表で出力側に値が付いていない、ということだけが確かである。&lt;/p&gt;
&lt;p&gt;手元から Worker 経由で30回呼ぶと、応答の中央値は 261ms だった。最小は 210ms 前後で安定しているが、最大は実行ごとに 1.1 秒から 5.1 秒まで振れる。&lt;code&gt;wrangler dev --remote&lt;/code&gt; 越しの測定なので、手元の開発セッションを一度通る分が乗っている。&lt;/p&gt;
&lt;p&gt;一度に渡せる文章の長さは、Cloudflare の表記で 32,000 トークンまで。&lt;/p&gt;
&lt;h2 id=&quot;日本語で使えるかどうか&quot;&gt;日本語で使えるかどうか&lt;/h2&gt;
&lt;p&gt;TypeSafe の公式ドキュメントは、&lt;a href=&quot;https://docs.typesafe.ai/models&quot;&gt;言語について&lt;/a&gt;「英語が主たる学習言語であり、精度もそこが一番よい」と書いている。日本語や中国語を含む他の言語も扱えるが同じようにはいかないので、自分のデータで試してから使い、確信度を見て振り分けること、という注意が付く。&lt;/p&gt;
&lt;p&gt;ここまでの話は全部、動いたというだけの話でしかない。&lt;/p&gt;
&lt;p&gt;なお、Jev の公開後、同じように文章を生成せず判断だけを返すモデルが、重みを公開する形でいくつか出ている。学習済みの重みが誰でも落とせるので、クラウドのAPIを経由せず手元のマシンで動かせる。&lt;a href=&quot;https://github.com/NandhaKishorM/laya&quot;&gt;Laya&lt;/a&gt; は Apache-2.0 で、Mac でも動く。&lt;/p&gt;
&lt;p&gt;選択肢はあるわけだが、どれを選ぶにしても先に確かめることは同じである。実務で使うつもりなら、知りたいのは日本語でどれだけ当たるかのほうだ。&lt;/p&gt;
</content:encoded></item><item><title>Mac で動く Laya は Jev の代わりになるか</title><link>https://unirt.dev/blog/laya-mlx-same-cases/</link><guid isPermaLink="true">https://unirt.dev/blog/laya-mlx-same-cases/</guid><description>クラウドの Jev に頼まず手元で済ませたくて、Mac で動く判断モデル Laya に日本語の文章を判定させた。「同じ会社か」の二択で半分当たったのは、10件すべてに「同じ」と答えていたからだった。質問文だけを英語に変えると、当たる数が倍になる質問もあった。</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;判断をクラウドのAPIに投げると、通信の往復が乗るし、入力が外に出る。同じことが手元で済むなら済ませたい。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://unirt.dev/blog/jev-workers-ai/&quot;&gt;Jev&lt;/a&gt; の公開後、文章を生成せず判断だけを返すモデルが、重みを公開する形でいくつか出ている。学習済みの重みが誰でも落とせて、ライセンスの範囲で自由に使える形を、オープンウェイトと呼ぶ。クラウドのAPIを経由しないので、通信も課金もない。&lt;/p&gt;
&lt;p&gt;その一つが &lt;a href=&quot;https://github.com/NandhaKishorM/laya&quot;&gt;Laya&lt;/a&gt; である。&lt;/p&gt;
&lt;h2 id=&quot;生成しないモデルの作り&quot;&gt;生成しないモデルの作り&lt;/h2&gt;
&lt;p&gt;Laya は双方向エンコーダに判断ヘッドを載せた構成を取る。&lt;/p&gt;
&lt;p&gt;用語を開くと、こうなる。文章を扱うモデルには、前から順に読んで次を予測するものと、文章全体を一度に見て各単語の意味を捉えるものがある。後者が双方向エンコーダで、BERT 系のモデルがこれにあたる。続きを書く用途には向かないが、すでにある文章を分類したり、意味を測ったりするのは得意である。&lt;/p&gt;
&lt;p&gt;判断ヘッドというのは、そのエンコーダの出力を受けて答えを出す小さな層のことだ。「この文章は違反か」のような問いに、確率を一つ返す。&lt;/p&gt;
&lt;p&gt;この構成だと、文章を一度通すだけで答えが出る。入力を頭から最後まで一回計算することをフォワードパスと呼ぶが、1回のフォワードパスで終わるので速い。&lt;a href=&quot;https://unirt.dev/blog/jev-workers-ai/&quot;&gt;LLM がトークンを一つずつ並べる&lt;/a&gt;のとは、そもそもやっていることが違う。&lt;/p&gt;
&lt;p&gt;Apache-2.0 で重みが公開されていて、Apple Silicon 向けに移植された &lt;a href=&quot;https://github.com/mizorewww/laya-mlx&quot;&gt;laya-mlx&lt;/a&gt; がある。MLX は Apple が出している機械学習フレームワークで、Mac のGPUとメモリの作りに合わせてある。&lt;/p&gt;
&lt;p&gt;学習済みの重みは、用途別に何種類か公開されている。この単位をチェックポイントと呼ぶ。Laya には3つあって、括弧内はパラメータ数、つまりモデルの大きさである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;英語版：ModernBERT-large（421M）&lt;/li&gt;
&lt;li&gt;多言語版：mmBERT-base（322M）&lt;/li&gt;
&lt;li&gt;型付き判断に特化したもの：ModernBERT-large（421M）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多言語版だけ小さい。日本語を扱うならこれを選ぶことになる。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://unirt.dev/blog/jev-replace-fixed-rules/&quot;&gt;これまでの記事&lt;/a&gt;で使った&lt;a href=&quot;https://github.com/unirt/jev-eval-ja&quot;&gt;30件&lt;/a&gt;を、そのまま多言語版に投げた。&lt;/p&gt;
&lt;h2 id=&quot;50という数字の読み方&quot;&gt;50%という数字の読み方&lt;/h2&gt;
&lt;p&gt;金融機関名の同一性判定が 50% だった。&lt;/p&gt;
&lt;p&gt;同じ会社かどうかを二択で答える質問で 50% なのだから、当てずっぽうと同じということになる。最初はそう読んだ。&lt;/p&gt;
&lt;p&gt;実際には違った。laya は10件すべてに「同じ会社」と答えていた。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称A&lt;/th&gt;
&lt;th&gt;名称B&lt;/th&gt;
&lt;th&gt;正解&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;laya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;三菱UFJ銀行&lt;/td&gt;
&lt;td&gt;株式会社三菱UFJ銀行&lt;/td&gt;
&lt;td&gt;同一&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;みずほ銀行&lt;/td&gt;
&lt;td&gt;みずほ信託銀行&lt;/td&gt;
&lt;td&gt;別&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;0.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;三井住友銀行&lt;/td&gt;
&lt;td&gt;三井住友信託銀行&lt;/td&gt;
&lt;td&gt;別&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;楽天銀行&lt;/td&gt;
&lt;td&gt;楽天証券&lt;/td&gt;
&lt;td&gt;別&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ゆうちょ銀行&lt;/td&gt;
&lt;td&gt;りそな銀行&lt;/td&gt;
&lt;td&gt;別&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ゆうちょ銀行とりそな銀行を 1.00 で同じ会社と答える。正解が同一5件と別5件なので、全部に「同一」と答えると、ちょうど 50% になる。&lt;/p&gt;
&lt;p&gt;数字は間違っていないが、意味が違う。「半分当たる」のではなく「見分けていない」。一致率だけを表に並べていたら、たぶん気づかないまま「二択なら五分五分か」と書いていた。&lt;/p&gt;
&lt;p&gt;以降は、10件すべてに同じ答えを返した組み合わせに印を付けて数える。そこの一致率は、モデルの性能ではなくケースの偏りを写しているだけなので、読まない。&lt;/p&gt;
&lt;h2 id=&quot;質問文を日本語から英語にする&quot;&gt;質問文を日本語から英語にする&lt;/h2&gt;
&lt;p&gt;同じことが &lt;code&gt;frustration&lt;/code&gt;（3段階のスコア）でも起きていた。10件すべてが「苛立ちあり」だった。&lt;/p&gt;
&lt;p&gt;ここで、崩れているのが日本語の本文なのか日本語の質問文なのかが分からなくなった。Jev と同じく、Laya にも判断の材料になる文章と、聞きたいことの定義を渡す。前者は日本語のまま、後者だけ英語に書き換えて回し直す。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;質問&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;質問文 ja&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;質問文 en&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;コンプラ表現検出&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;40%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;40%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;needs_same_day&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;70%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;金融機関名の同一性&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;frustration&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;コンプラ表現検出が倍になった。判断の材料は日本語の文面のままである。&lt;/p&gt;
&lt;p&gt;日本語が読めていなかったのではなく、日本語で聞かれると崩れていた。本文と質問文で、効き方が別になっている。&lt;/p&gt;
&lt;p&gt;チェックポイントを型付き判断特化のものに替えると、日本語の質問文でもコンプラ表現検出は 80% に上がった。ただし &lt;code&gt;needs_same_day&lt;/code&gt; が全件「当日対応が必要」に張り付く。英語版のチェックポイントは、日本語の本文に対しては軒並み崩れた。&lt;/p&gt;
&lt;p&gt;どのチェックポイントでも、どちらの言語でも動かなかったものが2つある。金融機関名の同一性は6通り中5通りで全件「同一」、&lt;code&gt;frustration&lt;/code&gt; は6通りすべてで全件「苛立ちあり」だった。&lt;/p&gt;
&lt;h2 id=&quot;jevは質問文の言語で動かない&quot;&gt;Jevは質問文の言語で動かない&lt;/h2&gt;
&lt;p&gt;比較のため、Jevにも英語の質問文で同じ30件を投げた。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;Jev ja&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;Jev en&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;laya 多言語 ja&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;laya 多言語 en&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;コンプラ表現検出&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;90%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;90%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;40%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;金融機関名の同一性&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;90%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;90%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;100%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;100%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;40%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;needs_same_day&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;100%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;100%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;70%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;is_offensive&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;100%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;100%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;80%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;frustration&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;80%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;90%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;張り付き&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Jevはほとんど動かない。&lt;code&gt;frustration&lt;/code&gt; の1件差も、&lt;a href=&quot;https://unirt.dev/blog/jev-confidence-threshold/&quot;&gt;確信度 0.33 の境界ケース&lt;/a&gt;が反転しただけだ。&lt;/p&gt;
&lt;p&gt;laya のほうは質問文の言語で倍近く動く。322M のモデルと、クラウドで動く規模のモデルとの差は、精度より先に、聞き方で崩れるかどうかに出た。&lt;/p&gt;
&lt;h2 id=&quot;速さは本当&quot;&gt;速さは本当&lt;/h2&gt;
&lt;p&gt;推論は30回の平均で 60.4ms だった。通信がないので、これがそのまま応答になる。最大は 607ms で、これは最初の1回だった。&lt;/p&gt;
&lt;p&gt;Jevを同じ30件で測ると中央値 261ms、たまに1秒を超える。ネットワークの往復ぶんだけ明確に速い。&lt;/p&gt;
&lt;p&gt;課金もない。モデルの読み込みは1秒弱で、型付き判断特化のチェックポイントを初めて落としたときで19秒だった。&lt;/p&gt;
&lt;h2 id=&quot;どこまでなら任せられるか&quot;&gt;どこまでなら任せられるか&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;needs_same_day&lt;/code&gt; の 80% と department の 70%（どちらも多言語版、英語の質問文）は、一次の振り分けの下書きとしてなら使える水準に見える。人が最後に見る前提で、問い合わせの並び替えと担当の初期値を作るくらいの使い方だ。無料で、通信もなく、60ms で返る。&lt;/p&gt;
&lt;p&gt;金融機関名の同一性と3段階のスコアは、この構成では無理だった。見分けていないので、どこで切るかを決める以前の問題になる。&lt;/p&gt;
&lt;p&gt;質問文を英語で書く、というのは運用として現実的ではある。判断の材料は日本語のままでいいので、書き換えるのは質問の定義だけで済む。ただ、それで上がるのがどのタスクなのかは、回してみるまで分からなかった。&lt;/p&gt;
&lt;p&gt;ケースは各10件しかない。1件の当たり外れで10ポイント動くので、ここに出した数字は傾向までしか言えない。それでも、全件に同じ答えを返しているかどうかだけは、10件でもはっきり見える。&lt;/p&gt;
</content:encoded></item></channel></rss>