コンピュータサイエンスのレポートとAI判定: コード、疑似コード、そしてそのあいだの文章

CSの課題レポートは、二つの文書をひとまとめにしたようなものです。一方は測定されています。もう一方は値でできていて、しかも推敲のときに静かに壊れるのはそちらです。

HumanPen チーム

· 12 分

短い答え

Turnitinがコードについて公表している立場は短く、そして明確です。モデルは「does not reliably detect AI-generated text in the form of non-prose, or code」(非散文、つまりコードの形をしたAI生成テキストを確実には検出しない)としており、FAQはさらにTurnitinが「not pursuing ChatGPT code detection at this time.」(現時点ではChatGPTのコード検出を追求していない)と述べています。つまり、コードのリスト、疑似コードのブロック、ターミナルの実行記録は、AIのパーセンテージが問題にしている対象ではありません。対象はそのあいだの段落であり、CSのレポートでいえば設計の根拠、アルゴリズムの解説、計算量の分析、評価の議論です。そしてその段落は、文書のなかで最も均質な文章でもあります。よい技術文書は均質であるべきだからです。

それはさておき、あなたの学科が何を生成してもよいと認めているかを決めるのは、検出ツールが何を測定するかではなく、その学科の学術倫理ポリシーです。一方の質問に答えても、もう一方の質問に答えたことにはなりません。この二つを同じ質問として扱うと、面談に呼ばれる結果になります。

Turnitinがコードについて実際に述べていること

全体を支えているのは二つの文です。一つ目は、FAQの「分析対象は何か」という定義のなかにあります。

「The model does not reliably detect AI-generated text in the form of non-prose, or code, nor does it detect short-form/unconventional writing such as bullet points (short non-sentence structures).」(そのモデルは、非散文やコードの形をしたAI生成テキストを確実には検出しません。また、箇条書きのような短い形式や定型外の文章、つまり文になっていない短い構造も検出しません。)

もう一文だけ読み進めてください。役に立つのはその先だからです。

「This means that a document containing several different writing types would result in a disparity between the percentage and the highlights.」(これは、いくつかの異なる文体を含む文書では、パーセンテージとハイライトのあいだに食い違いが生じることを意味します。)

CSのレポートは構造上、複数の異なる文体を含む文書です。だからこの食い違いは、この分野では異常ではなく通常の状態です。レポートのガイドも同じ除外をより長い一覧で述べており、コードと並んで詩や脚本を挙げ、短い形式の側に表や注釈付き文献リストを加えています。

二つ目の文は、周囲の文脈なしに一人歩きすることが多いので、どこにあるのかを述べておく価値があります。それは「Why is AI detection not being added to Gradescope?」(なぜAI検出はGradescopeに追加されないのか)という質問への回答の最後の行です。その回答はこう続きます。Turnitinは「not currently have plans to add these capabilities to Gradescope, since the primary use case for Gradescope is handwritten text while for AI detection we're focusing on typed text」(Gradescopeの主な用途は手書きテキストであり、AI検出では入力されたテキストに注力しているため、現在のところこれらの機能をGradescopeに追加する計画はありません)とし、さらに「In addition, we are not pursuing ChatGPT code detection at this time.」(さらに、現時点ではChatGPTのコード検出を追求していません)と述べています。

これがコンピュータサイエンスにとくに重要なのは、プログラミングの課題の多くがGradescopeで提出されるからです。実装が自動採点システムへ、書いたレポートがTurnitinの課題へ、という具合に分かれるなら、それは役割の異なる二つの経路であり、最終的に目にするAI執筆のパーセンテージは後者で計算されたものです。この分割のライセンス面についてはどのTurnitin製品にAI検出があるかで扱っています。

ここでいう意味での「散文」は、レポートのどの部分か

定義はレポートのガイドにあり、そこで挙げられている例は注目する価値があります。

「Qualifying text (prose sentences contained in long-form writing format) means individual sentences contained in paragraphs that make up a longer piece of written work, such as an essay, a dissertation, or an article, etc.」(Qualifying text、すなわち長文形式に含まれる散文の文とは、小論文、学位論文、記事など、より長い著作を構成する段落のなかの個々の文を指します。)

小論文、学位論文、記事。APIリファレンスのような調子で書かれたプロジェクト報告は、この三つのどれにも当たりません。そしてTurnitinはそれについての判断を公表していません。公表しているのは「文かどうか」という判定基準です。そこで、その基準を要素ごとに当てはめたものが以下の表です。これは私たちの対応付けであり、ベンダーのものではありません。

CSレポートの要素段落内の文か備考
序論、問題の定義、関連研究はい通常の学術散文
設計の根拠、ある構造を別の構造ではなく選んだ理由はいファイルのなかで最も議論の込もった文章であることが多い
英語で書かれたアルゴリズムの解説はいハイライトが集中しやすい箇所
計算量分析の段落文として書かれていれば、はい前後に記号があるだけの `O(n log n)` という行は、文ではありません
疑似コードのブロックいいえ行構造であり、文法的な文ではない
ソースコードのリストいいえベンダーの除外文で名指しされている
ターミナルの実行記録、ログ出力、スタックトレースいいえ散文ではないうえ、書き換えるべきものでもない
番号付きのコマンドとして書かれたセットアップ手順やビルド手順いいえ箇条書きや、文になっていない短い構造は除外される
関数やエンドポイントのリファレンス項目書き方による「構文解析されたトークン列を返す。」は文です。二列のパラメータ表は文ではありません
実行時間と精度の評価表数値なので、いいえ2023年8月9日のリリースノートには、表のセル内の長文散文は処理されること、および既存の提出物は再処理のために再提出が必要なことが書かれています
結果の考察、限界、今後の課題はい最初から最後まで散文
参考文献除外同じリリースノートに、AI執筆レポートの処理時には文献リストが除外されるとあります

この表から二つの帰結が出てきます。分母が小さいので、パーセンテージはファイル全体ではなくファイルの一部についての主張になります。FAQはそれをはっきりとこう述べています。「This percentage is not necessarily the percentage of the entire submission. If text within the submission is not considered long-form prose text, it will not be included.」(このパーセンテージは、提出物全体のパーセンテージとは限りません。提出物内のテキストが長文の散文と見なされない場合、それは含まれません。)そしてリストの多いレポートでは、対象テキストが十分に少なくなり、短い文書での「全部かゼロか」という挙動が関係してくることがあります。ファイル要件には、レポートがそもそも生成される前に「at least 300 words of prose text in a long-form writing format」(長文形式の散文テキストが少なくとも300語)必要だとあります。

測定される散文は、あなたが書く最も均質な散文である

Turnitinは、誤検出に共通しがちな特徴を公表しています。

「Sometimes false positives (incorrectly flagging human-written text as AI-generated), can include content without a lot of structural variation, text that literally repeats itself, or text that has been paraphrased without developing new ideas.」(誤検出、つまり人が書いたテキストをAI生成と誤って判定する現象には、構造的な変化に乏しい内容、文字どおり同じことを繰り返すテキスト、新しい考えを展開せずに言い換えただけのテキストが含まれることがあります。)

そして次の文は、あなたではなく採点者に向けられたものです。

「If our indicator shows a higher amount of AI writing in such text, we advise you to take that into consideration when looking at the percentage indicated.」(そのようなテキストでAI執筆の割合が高く示された場合は、表示されたパーセンテージを見る際にその点を考慮に入れることをお勧めします。)

では、この二つの性質を、よく書けた技術文書に当てはめて読んでみてください。構造的な変化は、リファレンス節が意図して取り除くものです。どの関数も同じ枠、つまり名前、引数、戻り値、失敗時の挙動の順で書かれるため、枠を一度覚えた読み手は残りを流し読みできます。同じことを同じ形で二度書くのは、二つの構成要素の挙動が同じだと読み手に伝える、まさにその方法です。項目ごとに形を変えよというスタイルガイドは、悪いスタイルガイドです。

同じ形が、アルゴリズムの解説にも別の理由で現れます。その節は通常、すぐ上のリストがすでに述べていることを英語で言い直します。言い直しには、文体上の逃げ場がありません。どの段階もその段階そのものから始まり、どの文も同じ主語を持ち、段落は制御フローの書き起こしになります。

ここには正直に認めるべき限界が二つあります。Turnitinはこれらの性質の出現頻度を公表しておらず、誤検出が「含みうるもの」の一覧しか示していないため、この効果がどれだけを説明するのかは誰にも分かりません。また、モデルの挙動は逆算できる規則集ではありません。FAQには「Our model is not explicitly programmed to evaluate specific signals such as 'burstiness,' 'perplexity,' or other individual metrics sometimes referenced in public discussions.」(私たちのモデルは、'burstiness,' 'perplexity,' のような特定のシグナルや、公開の議論でときおり引き合いに出される個別の指標を明示的に評価するようにはプログラムされていません)とあります。パープレキシティとバースト性の神話により詳しい話があり、同じページの別の場所にある、この一文を読み過ぎないようにしてくれる文も紹介しています。

値でできている半分

CSのレポートが小論文と違う理由となる非対称性が、ここにあります。測定から除外される内容は、動かない背景ではありません。そこは、文字を一つ変えるだけで文書が間違いになる部分であり、そして誰かが採点するかどうかに関わらず、推敲のときに読まれる部分です。

内容なぜそれが文言ではなく値なのかそれらしい言い換えがもたらす損失
識別子とその表記の違い、`getUser` と `get_user`その名前が解決に使われる文章が、コードには存在しない関数を指すことになる
コマンドラインのフラグ、`--max-workers=8`実行可能なテキスト「最大ワーカー数のフラグを八に設定」は、シェルに貼り付けられません
パスとモジュール名、`src/parser/tokenizer.py`実際の場所を指している読み手がそのファイルを見つけられない
バージョン、`Python 3.11`、`CUDA 12.4`再現性誰にも再現できない環境
計算量の式、`O(n log n)`、償却 `O(1)`背後に証明のある主張「おおむね線形」では、より弱く別の主張になる
引用されたエラー文と終了コードプログラムが出力したものの引用もはや引用ではなくなる
エンドポイント名とメソッド名、`POST /v1/jobs`インターフェースの契約404を返すリクエスト
シード値、ハイパーパラメータ、データセットの分割数値の根拠あなたを含め、誰にも再現できない結果

目に見えにくい第二の失敗もあります。というのも、出力はじつに自然に読めるからです。技術文書は、一つの概念に一つの名前を与えます。推敲の結果、同じオブジェクトに対して3節では `hash map`、4節では `dictionary` が残っていたり、`worker` と `thread` が入れ替わっていたりすると、その文書は「それは一つのものなのか二つのものなのか」を読み手に伝えなくなります。採点者も、あなたのコードを読まずには判断できません。それは文書への損傷であり、ここにもスコアは関係ありません。ほかの場面では役に立つ習慣に逆らうことになるので、はっきり言っておく価値があります。たいていの文章では定義済みの用語は言葉の選択ですが、この分野ではそれは識別子に近いものです。

十分で済む確認、この順番で

どれも、すでに開いている道具があれば足ります。

  • 文書からコマンドをすべてコピーし、作業用ディレクトリで実行してください。セットアップ手順は最初に腐る箇所であり、最後まで読み返されない箇所です。
  • コードが定義している識別子を一覧にし、それぞれを文書内で検索してください。コードにはあるのに文書にないものは、あなたの知らないうちに起きた改名です。
  • 最も重要な概念用語を五つ選び、それぞれを検索してください。概念ごとに名前は一つ、どこでも同じ。そうでなければ今すぐ直してください。
  • 計算量の主張は、それが記述している関数と突き合わせて読んでください。`O(n log n)` と「効率的」は置き換え可能ではなく、採点対象になるのは一方だけです。
  • 引用符の内側にあるものは、実際の実行結果と突き合わせてください。ログの行やエラーメッセージは引用です。

実際に余地がある場所

指摘されたブロックがアルゴリズムの解説なら、文に手を付ける前に考える価値のある問いがあります。その節は、すぐ上のリストがすでにやっていること以外に、何かをしているでしょうか。変数名を変えて、段階のあいだに「それから」を足しただけの解説は、検出ツールがどう言おうと、レポート内の重複コンテンツです。居場所を得るに値するのは、なぜそのループがその構造なのか、代替案は何だったのか、どこで破綻するのかを説明するバージョンです。

そこはまた、あなたの文章に伸びしろがある場所でもあります。設計の根拠、却下した代替案、二日かかったバグ、ベンチマークが測れていないこと、もう一週間あれば直すであろう限界。それらの段落は、そこにある思考が変化するぶんだけ形も変化します。リファレンス風の節は変化しません。変化すべきでもありません。

その助言の限界について、正直に述べておきます。私が説明しているのは、レポートを読みやすく、採点しやすくするものです。それが数値に何をもたらすかは、私たちを含め誰にも分かりません。Turnitinはプーリング関数もセグメント長も公表していませんし、自らのモデルが「may not always be accurate (it may misidentify human-written, AI-generated, and AI-paraphrased text), so it should not be used as the sole basis for adverse actions against a student.」(常に正確とは限らず、人が書いたテキスト、AI生成テキスト、AIによる言い換えテキストを誤って判別する可能性があります。そのため、学生に対して不利な措置を取る唯一の根拠として使用すべきではありません)と警告しています。

文章を推敲するなら

CSのレポートの推敲が遅くなる理由は、文とはあまり関係がありません。書き直した段落一つに、四つの識別子、フラグ、バージョン番号が入っていることがあり、その段落を信頼する前に、ひとつひとつをコードと突き合わせる必要があります。コストは、手を付けた段落数で数えてください。

だからこそHumanPenというツールは、最初に範囲の指定を求めます。文書をアップロードしたら、書き直す箇所に印をつけるか、TurnitinやiThenticateのAIレポートを取り込み、指摘された箇所に境界を引かせてください。その外側は一切触れられません。この分野でいえば、自分で指定しない限り、コードのリストもコマンドブロックも推敲の対象に入りません。エンジンは段落より小さい単位では動かないため、段落の途中で終わる選択は段落全体に広げられ、まずあなたに確認のうえで表示されます。クレジットは実際に書き直された語数で計算されます。用語は、構造、引用、レイアウトと並んで維持の対象に含まれています。それでも指摘されたままの箇所は、条件を満たす場合に無料で再度書き直せます。

ダウンロード後の複雑な文書の見直しについて、FAQに一文があります。識別子の多いレポートでは、それは通し読みではなく、前の節のチェックリストを意味します。やり取りの往復で壊れるものを文書レベルで扱った話は、フィールドや相互参照も含めてWordのフィールド、目次、相互参照にあります。

よくある質問

TurnitinはAI生成コードを検出しますか。 Turnitinは、自社のモデルが非散文やコードの形をしたAI生成テキストを確実には検出しないとしており、FAQは現時点でChatGPTのコード検出を追求していないとしています。これは、このレポートが何を測定するかについての記述です。あなたの所属機関が何を許可するかについての記述ではありません。そちらは別の文書ですから、読んでください。

私の疑似コードブロックは採点されますか。 公表されている規則は、モデルは段落内の散文の文を分析するというもので、短い形式や文になっていない構造は検出しない対象として挙げられています。疑似コードのブロックは、文構造ではなく行構造です。それを導入する段落は散文です。

ハイライトが一つの節に集中しているのはなぜですか。 一部は算術的な理由です。ファイルのほとんどが除外されていれば、ハイライトは残った部分にしか現れません。Turnitinは、重なり合うセグメントを採点して値をプーリングするとも説明しています。そのため均質なテキストのまとまりは、散らばりではなく均質な結果を生みがちです。

計算量分析の節が指摘されました。でも一字一句、自分で書きました。 そういうことは起こります。採点者に見せるべきは、FAQの誤検出についての段落です。とくに、パーセンテージを読むときにテキストの性質を考慮するよう求める結びの文です。ただしそれが著者性を決定づけることは、どちらの方向についてもありません。

私のレポートはほぼリストばかりで、AIレポートが生成されませんでした。 何かが失敗したと決めつける前に、下限を確認してください。ファイル要件には、長文形式の散文テキストが少なくとも300語必要だとあります。リストの多いレポートは、ページ数が十分に見えても、それを下回ることがあります。除外の一覧はTurnitinのAIが対象としない内容にあります。

続きを読む