<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>コーディング on 現役エンジニアのAI事情</title>
    <link>https://www.engineer-labnote.top/tags/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/</link>
    <description>Recent content in コーディング on 現役エンジニアのAI事情</description>
    <generator>Hugo</generator>
    <language>ja-jp</language>
    <lastBuildDate>Sat, 12 Sep 2026 21:03:58 +0900</lastBuildDate>
    <atom:link href="https://www.engineer-labnote.top/tags/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>難易度を上げたコード課題で比較したら、1モデルだけ「行」と「値」を読み違えていた</title>
      <link>https://www.engineer-labnote.top/posts/202609122103-nan-ido-wo-age-ta-koodo-kadai-de-hikaku-shitara-1-moderu-dak/</link>
      <pubDate>Sat, 12 Sep 2026 21:03:58 +0900</pubDate>
      <guid>https://www.engineer-labnote.top/posts/202609122103-nan-ido-wo-age-ta-koodo-kadai-de-hikaku-shitara-1-moderu-dak/</guid>
      <description>&lt;img src=&#34;https://i.ibb.co/BHXdxz0y/85aba93ee89b.png&#34; alt=&#34;難易度を上げたコード課題で比較したら、1モデルだけ「行」と「値」を読み違えていた&#34; style=&#34;width:100%;max-width:720px;height:auto;display:block;margin:0 auto;border-radius:8px;&#34; /&gt;
&lt;h2 id=&#34;きっかけ単語数え上げ課題は簡単すぎた&#34;&gt;きっかけ：単語数え上げ課題は簡単すぎた&lt;/h2&gt;
&lt;p&gt;これまでのコーディング比較で使ってきた「テキストファイルの頻出単語トップ5」課題、正直もう簡単すぎて差がつきにくくなってきた。今回はもう少し歯ごたえのある課題——&lt;strong&gt;CSVの集計・欠損値処理・重複データの統合・ソート&lt;/strong&gt;を組み合わせたタスクで、Gemma4-12B-Heretic・gpt-oss-safeguard-20B・Qwen3-30B-A3B-2507・Qwen2.5-14Bの4モデルを比較した。&lt;/p&gt;
&lt;h2 id=&#34;課題内容&#34;&gt;課題内容&lt;/h2&gt;
&lt;p&gt;生徒名と3科目の点数が入ったCSVを読み込み、平均点から成績(A〜F)を判定するプログラムを書かせた。仕込んだ条件はこう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点数が欠損している、または数値に変換できない&lt;strong&gt;行はスキップ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;同じ名前が複数回出てきたら、平均点が高い方を採用&lt;/li&gt;
&lt;li&gt;平均点の高い順にソートして出力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;テストデータには、わざと欠損値(Carol: 1科目分の点数が空欄)・不正値(Frank: 点数の1つが&amp;quot;abc&amp;quot;)・重複名(Aliceが2回登場、点数が違う)を混ぜておいた。正解は一意に決まる——Frank・Carolは行ごと除外、Aliceは高い方の平均点(91.7点)を採用、という結果になるはずだった。&lt;/p&gt;
&lt;h2 id=&#34;結果3モデルは完璧1モデルだけ仕様を読み違えた&#34;&gt;結果：3モデルは完璧、1モデルだけ仕様を読み違えた&lt;/h2&gt;
&lt;img src=&#34;https://i.ibb.co/1JdmXvY8/14dc400a78f3.png&#34; alt=&#34;仕様遵守チェックのマトリクス&#34; style=&#34;width:100%;max-width:640px;height:auto;display:block;margin:0 auto;border-radius:8px;&#34; /&gt;
&lt;p&gt;Gemma4-12B-Heretic・gpt-oss-safeguard-20B・Qwen3-30B-A3B-2507の3モデルは、実際に実行した結果が完全に一致した。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Eve: 97.7(A)
Alice: 91.7(A)
Bob: 70.0(C)
Dave: 55.0(F)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Carol・Frankは正しく除外され、Aliceは高い方の平均点(91.7点)がきちんと採用されていた。重複データの統合・欠損値の行スキップ・不正値の検出まで、複雑な条件を全て満たした完璧な実装だった。&lt;/p&gt;
&lt;p&gt;ところが&lt;strong&gt;Qwen2.5-14Bだけ&lt;/strong&gt;、この基準から外れた。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Eve: 97.7(A)
Alice: 91.7(A)
Frank: 90.0(A)
Carol: 82.5(B)
Bob: 70.0(C)
Dave: 55.0(F)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;FrankとCarolが消えずに残ってしまっている。コードを確認すると、原因がはっきり分かった。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;calculate_average&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scores&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;valid_scores&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scores&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isdigit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;valid_scores&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;valid_scores&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;valid_scores&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;指示は「点数が欠損・不正な&lt;strong&gt;行&lt;/strong&gt;はスキップ」だったのに、Qwen2.5-14Bは&lt;strong&gt;不正な値だけを取り除いて、残った点数だけで平均を計算&lt;/strong&gt;していた。Frankは「abc, 90, 90」のうち&amp;quot;abc&amp;quot;だけ除外して(90+90)/2=90.0点、Carolは欠損分を除いて(80+85)/2=82.5点、という具合に、行単位ではなく&lt;strong&gt;フィールド単位&lt;/strong&gt;でスキップする実装になっていた。&lt;/p&gt;
&lt;p&gt;一見「柔軟に対応してくれた」ようにも見えるけど、これは明確に指示と違う仕様。しかも構文エラーにもならず、静かに間違った結果を出す(それらしい数値が出てくるので目視だけだと気づきにくい)という点で、実務では厄介なタイプの不具合だった。&lt;/p&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;複雑な条件が絡む課題でも、多くのモデルは正確に実装できる&lt;/strong&gt; — 今回は4モデル中3モデルが、欠損値・重複データ・ソートを含む複雑な仕様を完璧に満たした&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen2.5-14Bは「行スキップ」を「フィールドスキップ」に読み替えてしまった&lt;/strong&gt; — 指示の解釈を誤ったことで、本来除外すべきデータが結果に混入した&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;この手のミスは実行しないと気づけない&lt;/strong&gt; — コードの見た目は自然で、実行してもエラーにならず、出力もそれらしい数値が並ぶため、実際に既知の正解と突き合わせないと発覚しない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;単純な課題での比較には限界がある&lt;/strong&gt; — 今回のようにエッジケースを複数仕込んだ課題にすることで、初めて見えてくる実装の粗さがあった&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;コーディング課題の難易度を上げたことで、これまでの単純な課題では見えなかった「仕様解釈の精度」という新しい評価軸が見つかった。次にモデル比較をする時は、こういう複合的な条件を含む課題を標準にしていきたい。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
