kumamotone’s blog

iOS/Android アプリエンジニアです https://twitter.com/kumamo_tone

AI Blindspots を(o1 proで)翻訳して読んだ

LLMのコーディング時の盲点を集めたサイト「AI Blindspots」 がSlackで流れてきて良さそうな雰囲気だったので読んでみた。

ezyang.github.io

Hugo という静的サイトジェネレーター で書かれていてシンプルな見た目で好感が持てる。 Hugo ʕ•ᴥ•ʔ Bear Blog というテーマらしい。かわいい。

日本では少し前にXでちょいバズし、はてブもついているようだった。

調べてみると、存じ上げなかったのだが著者は Edward Z. Yang (https://x.com/ezyang)さんという Meta社の研究者の方のようだった。

翻訳

Hugo のソースは GitHub にあったので、 fork させていただいて翻訳させていただいた。といっても、翻訳そのものo1 Proにまるっとおまかせしている。

github.com

原文のニュアンスがどのくらい拾えているかわからないが、かなり読みやすい。

やり方

文章はMarkdown形式で記事ごとにわかれているので、一旦ひとつの大きなファイルに結合する。

for f in content/blog/*.md
do
  echo -e "\n[[[$f]]]\n"
  cat "$f"
done > combined.md

fishだと

for f in content/blog/*.md
    echo
    echo "[[[$f]]]"
    echo
    cat "$f"
end > combined.md

このとき、頭に[ファイル名]\nを挿入しておいて識別子にする。

指示は「以下のmarkdownファイルを日本語にしてください。」だけでOK

何故全文を一気に投げるのかというと、個別にやるのがめんどくさいというのもあるが、何よりある程度長めの文章のほうが何についての文章なのかがAIに伝わりやすくなり、それで精度が上がりそうな予感がするから。コピペして combined_ja.md とか名前をつけ、もとに戻す。

#!/usr/bin/env zsh

# 出力先のファイルを保持する変数
outfile=""

# combined.md を行単位で読み込む
#   - IFS= で空行もそのまま取り込む
#   - read -r でバックスラッシュ等をエスケープ解釈しない
while IFS= read -r line; do

  # 区切り行かどうかを判定:
  #   1. 最低6文字以上あるか (例: [[[ ]]] → 6文字)
  #   2. 先頭3文字が '[[['
  #   3. 末尾3文字が ']]]'
  if [[ ${#line} -ge 6 && ${line:0:3} == '[[[' && ${line: -3} == ']]]' ]]; then
    # 先頭の [[[ と 末尾の ]]] を取り除いてファイル名を抽出

    # 方法1: 文字列切り取り(サブスクリプト)
    #   newfile="${line:3:${#line}-6}"
    #
    # 方法2: パターンマッチによる除去(こちらのほうがわかりやすいかも)
    newfile="${line#\[\[\[}"    # 先頭 '[[[' を削除
    newfile="${newfile%\]\]\]}" # 末尾 ']]]' を削除

    # ディレクトリが存在しなければ作成
    mkdir -p "${newfile:h}"

    # 以降の本文をこのファイルへ書き込む
    outfile="$newfile"

    # この行自体は本文としては出力しない
    continue
  fi

  # 区切り行でなければ、outfile が設定されている場合に追記
  if [[ -n "$outfile" ]]; then
    # 先頭がハイフンでもオプション解釈されないよう、print -- を使う
    print -- "$line" >> "$outfile"
  fi

done < combined_ja.md

雑に GitHub に push して Netlifyから開いてビルドしてなんかエラー出てるからそのままChatGPTに貼り付けて…

[build]
   command = "hugo"
   publish = "public"
 
 [build.environment]
   HUGO_VERSION = "0.110.0"      # 必要なバージョンを指定
   HUGO_EXTENDED = "true"        # SCSS/SASSなどを使う場合

出てきた netlify.toml ってファイルをルートディレクトリに入れたらデプロイできた。おそろし〜

AI Blindspotsの感想

さて肝心?の AI Blindspots の内容の感想だが、ほとんどまあそうですよねという感じで感じであんまり驚きはなかった。

ただ短くて読みやすく、例がマイページ書いてあって読み物としてやさしかった。

意外とAIは自分の限界がわからんくてハルシネーションを起こす(限界を知ろう)、コンテキストが大事(メメント)、一度に色々言わんほうがいい(掘り進めるのをやめよう)

「ファイルを小さく保つ」に関しては、個人的な体験からするとあんまり同意できない。同じディレクトリに入ってるから当然読みに行ってくれるだろみたいな思い込みは意外と通用せず、結局最初から全部読んでもらったほうがはやいということが多い。わざわざ無関係な記述をすべて同じファイルにする必要はないと思うが、何千行みたいな規模でない限り、画面と関連するモデルみたいなものは1ファイルに出してもらったほうが今のところは安定する気がしている。コンテキストが多い分には適宜無視してもらえるが、ないと本当にわけのわからん動きをしはじめる。ただ与えすぎるとコンテキストを圧迫するので、これはトレードオフをうまく見極めるしか無いと思う。

一方で、コードが横に長いと出力に時間がかかるので、関数分けやコンポーネント分けをして部品を小さく保つことは非常に重要と感じる。

また、E2Eですべてのパーツを含む、最小限の動く仕組みをまず作り上げる、というプラクティス(ウォーキングスケルトン)や、時に「人間離れした」成果を出すには、ただ座ってブルドーザーのように総当たり作業をし、そこから学んだことを活用して速度を上げる、というアプローチが有効という話(ブルドーザー方式)は、たしかに、今からの時代ますます重要になるだろうなと思った。

おわり

あんまり驚きはなかったみたいなことを書いたが、これだけ端的に考えがまとまっているというのがシンプルにすごい。こういう文章を自分も書きたい。一方でこのブログは何だ 支離滅裂すぎる 練習しましょうね