世界を動かす技術を、日本語で。

エージェントを使ったプログラミング方法

概要

  • Agents はLLMにフィードバック環境を与え、プログラミング作業を自動化する仕組み
  • シンプルなforループとLLMの組み合わせで大きな効果
  • API利用テスト自動化コード修正 が大幅に効率化
  • 時間やコストの課題はあるが、将来的な改善に期待
  • 具体例を通じて 実用性課題 を解説

エージェントによるプログラミング手法

  • Agent の定義:LLMをforループで繰り返し呼び出し、外部ツールと連携する9行程度のコード
  • エージェントは 人間の介在なく コマンドを実行し、結果を取得する自律的な仕組み
  • LLM単体では仮想ホワイトボード上のコーディングと同等で フィードバック不足
  • エージェントは bashpatchweb_nav などのツールを活用し、実際の開発環境を模倣
  • git 操作やAPIドキュメントのweb検索、テストの自動実行も可能

エージェントのメリット

  • API利用 の正確性向上:ドキュメント参照や仕様確認が自動化
  • コンパイラエラー の即時修正:構文ミスやインターフェースの誤りを検出
  • 依存関係管理 の最適化:利用中バージョンに合わせたコード生成
  • テスト駆動開発 の自動化:失敗時の修正やテストコード追加も自動
  • 大規模コードベース の効率的探索:必要な部分だけ選択的に読み込み
  • UIやAPIの最終出力 の自動検証:スクリーンショットやログ解析も可能

エージェントのデメリット

  • 処理時間の増加 :1リクエストで数分かかる場合も
  • コスト増 :API利用料が発生(例:1回のコミットで$1.15)
  • GPU/CPUリソース消費 :中間作業が多く、人的コスト削減とトレードオフ

実践例1:GitHub App認証の実装

  • sketch.dev でGitHub App認証機能をエージェント主導で実装
  • 数回のフィードバックだけで認証フローを構築
  • セキュリティ脆弱性 (全ユーザーが全リポジトリにアクセスできる)を指摘し、1文で修正依頼→即修正
  • パフォーマンス問題 (APIコール数の爆発)も要件変更で対応
  • 従来1週間かかった作業1日+掃除の時間 で完了

実践例2:SQLとJSONの特殊な運用

  • Tailscale流 のSQLテーブル設計(全カラムをJSONで管理)
  • INSERT/UPDATE もJSONベースで操作
  • スキーマ変更が容易・JOINも利用可能
  • 制約や動的チェックが強化される一方、データ量増加や運用の複雑化が課題

エージェント活用の今後

  • 人間の作業を機械化 し、生産性向上
  • 制約や限界 はあるが、エンジニアリング投資に値する価値
  • 小さなタスクで実際に試すことで、 有用性を体感 可能
  • 将来的にはコスト・時間の課題も解消に向かう見込み

今後もエージェント技術の進化により、 プログラミングの自動化生産性向上 が期待される。現状の課題を認識しつつ、積極的に活用することで、さらなる効率化を目指す姿勢が重要。

Hackerたちの意見

最後に、LLMについての真面目な記事があって、流行に流されずにこのツールが何に役立つか、何に役立たないかを現実的に見つめているのがいいね。すごく面白い読み物だけど、「エージェント」って言葉が、再帰的にLLMを呼び出すforループに使われるのはどうも好きじゃない。でも、この業界は名前をつけるのが得意じゃないから、仕方ないね。追記:文法

みんながすぐに理解できる名前だと思うけど、他に何か提案ある?LoopGPTとか?

OPのエージェントの定義には少し異議があるな。個人的には、エージェントは単なるループの中のLLMじゃないと思う。エージェントの定義的な特徴は、LLMの振る舞いが他の論理的なコンポーネントによって制約されたり導かれたりすることだと思う。これらの中には決定論的なものもあれば、MLを使ったもの(LLMを含む)もある。つまり、LLMは何らかの形でプログラムされているってこと。例えば、コード編集後にLLMにテストを構築して実行させるのは、より良いパフォーマンスを引き出すための素晴らしい方法だよ。でも、要するに、決定論的なレイヤー(テスト)がLLMにより有用なことをさせるように促すシステムを設計しているってこと。多くの「エージェント的推論」システムは、実行前にLLMに計画を立てさせるように意図的に強制している。時にはこれらの計画が決定論的に検証できることもあって、計画が良くない場合はLLMが再生成を強いられることもある。LLMが自分で自分をフィードしているという考えは間違ってはいないけど、これらのシステムが有用な理由を見逃していると思う。LLMの振る舞いを監視するさまざまな他のコンポーネントによって意図的に導かれているんだ。

エージェントを使ってる人たちの中で、実際に「プログラミング」が好きな人はどれくらいいるんだろう。問題の解決策を考えて、それをコードで表現することが好きな人。エージェントがやってる仕事の多くは、その部分を取り除いて、代わりに自然言語で何をしたいか説明させて、LLMがバグを出さないことを願うだけになってる気がする。

その通り。自然言語がプログラミングに向いてない理由にも関係してるよね。[0] [0]: https://www.cs.utexas.edu/~EWD/transcriptions/EWD06xx/EWD667... まあ、確かにLLMはstackoverflowみたいなプログラミングの質問には役立つと思う。でも、SOが衰退してるから、こういう質問に関する最新のデータは減っていくと思う。

コードを書くのは好きだし、LLMが一発でパーサーを作っちゃうのを見るのはちょっと悔しいけど、同時に何時間もかけてパーサーを作るのは、プロジェクトのもっと大きな目標から気をそらすことでもあるんだよね。それに集中できるのはいいことだし。自分が欲しい型や関数のシグネチャをスタブで作っておいて、LLMがそれを埋めてくれたら次に進める。多分、実装にも挑戦するけど、楽しくなくなったらLLMに頼るって感じかな。逆に、LLMのおかげで何かを磨く楽しさに集中できるようになった。大きな変更をするのも「やりたいけど面倒」ってことがなくなったし、例からテストを生成するのも苦痛じゃなくなった。READMEにコードを同期させるのも面倒じゃなくなったし、リファクタリングや改善のアイデアを考えるのも簡単になった。聞いて、ケースを作ってもらえばいいだけだから。もっと野心的になれたり、週末プロジェクトを新しいレベルに引き上げられるのは楽しいよ。考え方を変えれば、ソフトウェア好きなビルダーの楽園みたいだ。もっとコードを磨けるし、プロジェクトをリリースできるし、もっと難しい課題にも挑戦できるし、目標も高く設定できる。だけど、最初はちょっとした resentment を乗り越えるのに時間がかかったな。

逆に聞きたいな、みんなが何を好きなのか?私はすでに何度も解決された問題に対してコードを書くのは楽しめない。辞書を使うように、毎回ハッシュテーブルをゼロから作るわけじゃないし、それは最初の時だけ楽しい。もし「この言語の動くコンパイラをくれ」とか「深さ優先探索を使ってこの問題を解決して」と言えたら、プログラミングが楽しくなくなることはないと思う。自然言語について、そして兄弟コメントへの返答として、同意するよ。自然言語は計算プロセスを説明するには非常に貧弱なツールだ。おもちゃの例にはいいけど、ある程度の洗練されたレベルになると、曖昧なことや完全に矛盾することを言うのが簡単すぎる。でも、ここで誰もLLMを「盲目的に」使えとは言ってない!生成されたかどうかに関わらず、自分の出力には責任があるからね。

この評価には賛成できない。今のところ、LLMが引き継いでいるのは、実装のような繰り返しの作業ばかりだ。私はまだプロジェクトのアーキテクチャを考えたり、LLMには難しい非繰り返しの部分を解決することを楽しんでいる。これが1年後にはなくなるかもしれないし、もしかしたら私は栄光あるプロダクトマネージャーになるかもしれないけど、今は楽しんでるから、実際の思考問題に集中できて、繰り返しのパターンやクズを持ち上げる手助けをしてもらえる。

著者の言う通り、コードレビューは中途半端でほとんど壊れてると思う。エージェントを使うと、ボトルネックはコードを読むことにあって、書くことじゃない。みんなが中途半端にコードをレビューしてたり、自分の好みを主張するための場にしてると、エージェントの使い方が完全に崩壊するよ。深刻なセキュリティ問題やパフォーマンスの低下を簡単に引き起こすからね。正直に言うと、そういう問題はただ「コードを読む」だけじゃ見つけられない。手を汚して手動でデバッグしたり、仮定をテストする必要があるんだ。

エージェントの意味ってそこだよね?もしテストカバレッジが完璧だとしたら、AIがコードを書いて、そのセキュリティやスピードについてフィードバックをもらえるってことだし。AIがテストを書く手伝いもしてくれるしね!

自分のツールのためだけにコードを書くからかもしれないけど、他の誰かや何かに頼ってコードを書いてもらって、それを読んで理解して修正するっていうのがいまだに理解できない。ただ、APIドキュメントから探してほしいものを抽出してもらうのはすごく便利で時間の節約になるけどね。将来的にLLMがどれだけ良くなるかは関係なくて、他の人のコードを読むのが好きじゃないんだ(笑)。

これが私に役立つケースだよ(リスト使ってるけど、AI生成じゃないからね…) - 定型的なコード。基本的にマクロやコード生成の必要がなくなる。欠点は遅くなるし、マクロを更新して再生成することができないこと。でも、少し定型的だけど実装によって微妙に違うコードには使えるから、マクロが使えない場合には助かる。 - よく知ってるけど暗記してないAPIを使うとき。Google検索してドキュメントを探す手間が省ける。私は型付き言語を使ってるから、もし間違ったことをしたら型チェッカーがキャッチしてくれるし、結局手動でテストしたり自動テストを設定したりするから、間違ったことをしてもキャッチできるステップはたくさんある。 - プランニング:これは実はLLMの中であまり評価されてない部分だと思う。10ファイル以上の変更が必要なとき、LLMに全ファイルを見てもらって、変更点をMarkdown文書にまとめてもらうのはすごく助かる。時々、そのプランが十分良くて、少し手を加えるだけで「そのままやって」と言えることもあるし、間違ったところがあっても部分的に従いながら修正するのが役立つ。追記:LLMが生成したコードの好きなところは、プロジェクト内のスタイルや命名規則を維持してくれること。疲れてるとそういうことに気を使わなくなるからね。

私が関わっているコードベースでは、複数のファイルを比較的予測可能な方法で変更するタスクがよくある。クリエイティブさや挑戦が少なくて、複数の部分やファイルにタイプするだけの作業が多い。こういうタスクは、物理的にすべてのファイルを開いて、修正する場所を見つけて、コードをタイプする必要があったから、以前は3〜4時間かかってた。でもAIエージェントを使うと、タスクを説明するだけで99%正確にやってくれるから、時間が3〜4時間から3〜4分に短縮された。

最近まで私も同じ気持ちだった(先週の金曜日くらいまで)。WindsurfやCursorのようなツールは役に立つ部分もあるけど、ほとんどの時間は出力を読んで修正するのを待ってるだけ。要するに、ツールを使うためにお金を払ってるのに、トレーニングを手伝ってるような感じ。でも、今ChatGPT PlusでCodexが使えるようになったから、その非同期の流れをすごく評価してる。特に小さな改善や軽微なバグ修正に関しては、明らかに価値があると思う。私がやりたいのは、5〜10のタスクをキューに入れて、作業している間に難しい問題に集中すること。それから、休憩が必要なときにそのPRを見直したりマージしたりする。

こうやって作業するのが好きになってきた。コードのデザインを計画して、LLMに解決策に至るステップを説明する。LLMが次のコードセクションに取り組んでいる間に、読み取り、理解、修正、計画などを進める。並行して作業している感じだね。レストランの料理人になった気分で考えてみて。オーダーが入ったら、料理人はその料理を作るためのステップを計画する。料理人はステーキを焼いて、ブロイラーに入れる。料理人はステーキが焼き上がるのを待たずに、他の問題やタスクに取り組む。ステーキがまだ焼き上がっていなければ、もう一度ブロイラーに戻す。そうでなければ、ステーキをサイドやガーニッシュと一緒に盛り付ける。LLMはオーブンみたいなもので、ツールだね。チーズをフードプロセッサーでおろすのがいい例かも。手でおろすこともできるけど、ソースに入れるなら粒の質は関係ないから、フードプロセッサーを使うことで数分の時間を節約できる。プロの料理人はツールを使って並行してマルチタスクをこなしているから、コーディングも一行ずつ書くリニアな作業から離れていくかもしれない。

これはP!=nP的なものだと思ってる。シンプルな関数を書く必要があるとき、実装するのにかかる時間は、それが自分のニーズに合っているかどうかを確認する時間よりもほぼ常に長くなる。例外もあるけど、全体的にLLMを使ったコーディングではこれが当てはまるように思う。LLMに関数を書かせて、その結果をチェックするのが時間を節約する方法だね。

他の人のコードを読むのが好きじゃないんだよね、笑。自分で仕事してるの?それとも(開発者が1人以上いる)会社で働いてるの?自分のツールのためだけにコードを書くって言ってたから、自分でやってるのかな?俺も他の人のコードを読むのはあんまり好きじゃないけど、分散チームだと必要だし、時々誰かから新しいことを学ぶとインスパイアされることもあるんだ。こういう考え方で何か障害にぶつかったことがあるのか、単に好みなのか、ちょっと気になるな。

何もツールなしではできない人もいるよね。そういう人たちは早期採用者でパワーユーザーで、最新の発見を広めるんだ。GitHubの価値提案は、普通のコーダーでもPRやレビュー、緑の四角、TODOリストの迷路の中で生産的に見えるってことだった。LLMはまた、普通のコーダーが非本質的なツールやエージェントを使いこなすことで生産的に見えるようにしてくれる(それをマネージャーも好む)。

他の誰かや何かに頼ってコードを書かせて、それを読むことの利点がまだ理解できない。多分、鍵はこれだね:私たちの脳はパターンを見つけるのが得意だけど、細かいディテールを覚えるのは苦手なんだ。コーディングの多くはボイラープレートに関わっていて、正確に説明するのが難しいけど、生成できるものなんだよね。自分の仕事がユニークでクリエイティブだと思いたいけど、実際には多くが繰り返しで、統計的に見ても限られたバリエーションしかない。ライブラリの一部になり得るコードだけど、まだ抽象化されていない感じ。それがAIの出番で、そういうコードを生成するのが得意なんだ。NP問題みたいなもので、解決策を見つけるのは指数関数的に時間がかかるけど、チェックするのは多項式時間で済む。同じように、AIは人間が書くのにもっと時間がかかる速いドラフトを提供してくれて、私たちはそれをすぐにレビューできる。結果は?もっと早く、たくさんのことができるようになる。

コードを書くときは、どんなにシンプルで明白でも、すべてのコードに時間をかけなきゃいけない。コードを読むときは、もっと複雑な部分や重要な部分に時間を割けるんだ。

LLMを最も生産的に使ったのは、個々のメソッドをスタブアウトして、その実装を埋めてもらうことだった。こんなプロンプトを使ってる:public T MyMethod(/args/) /type constraints/ { //TODO: このメソッドを以下の要件を使って実装してください: //1 ... //2 ... //... } これ以上になると、どのウサギが何をしてるのか追えなくなっちゃうんだよね。

コードを書く・設計するよりも、コードレビューにLLMを使うのがキラー機能になるかも。コードレビューはしばらく壊れてると思うけど、これが進む道になるかもしれない。特に興味深いのは、セキュリティや未定義の動作、基本的な機能の誤用、コンパイラからの警告をソースコードと照らし合わせて、もっと深刻な問題じゃないか確認することだね。今のところ、エラーについて情報を得るためにLLMを使うのは、検索エンジン経由が多いかな。ヒット率は50%くらいで、まあまあだと思う。だって、だいたいエッジケースについて聞いてるから。

なんでこれについてもっと話されないの?私は開発者じゃないけど、多くの開発者と密接に仕事してる。彼らはこの技術に対する興味がゼロから積極的にコードを書くまで、いろいろなレベルにいるけど、レビューやチェックに使う話はほとんどない。もしかしたら、コミット時にパッシブに行う必要があるのかも。

ChatGPTは、ウェブ上で広く書かれている一般的な問題のデバッグにとても役立つ(トレーニングのカットオフ前に)。Stack Overflowの情報を合成して、ディスカッションを探して個別に読むよりも、何が起こっているのかを理解する時間を大幅に短縮してくれる。(このIPは正当にStack Overflowの貢献者に属し、Stack Overflowにライセンスされているべきだ。利用者として参加することには複雑な気持ちがある。)ただし、LLMの出力はハルシネーションのせいでノイズが多い — ウェブ検索よりは少ないけど。LLMがコードベースを評価して、一般的なミスや問題のある関数/APIの呼び出しを見つけることができると思うけど、偽陽性もたくさん出るだろう。みんなはそのようにLLMを使ってるの?

コードのレビューにはLLMを使うべきで、コードの作成や設計には使わない方がいいかも。これはすでにGitHubでCopilotを使ってレビューとして利用可能だよ。最適な提案ではないけど、ループに入れておくには十分使える。

「このコードをレビューしてください」とループでやっていると、チャットボットが最初にXをYに変えて、少し後にYをXに戻すケースが出てくるよ。コードレビューには使えるけど、どの変更を受け入れてどれを拒否するかは慎重に判断しないとね。改善点を見分けられるだけの知識があれば、候補となる変更を出してくれるから、受け入れたり拒否したりできるのがいいところ。

まったく同感!今、https://sourcery.ai でこれに取り組んでるよ。

全体として、私たちはコンテナがプログラミングに役立つし、必要だと確信しています。先週、Dockerの創設者であるソロモン・ハイクスが、エージェントが安全に並行して実行できるようにContainer Useをオープンソースにしました。この理由でここにシェアします。Sketchは隔離されたローカル開発環境を内蔵しているようですが(クール!)、他のコーディングエージェントはそうではないと思います。 [1] https://www.youtube.com/live/U-fMsbY-kHY?si=AAswZKdyatM9QKCb... - 見るのは楽しいです [2] https://github.com/dagger/container-use

エージェントループ。機械の中の脳。実質的にはルールエンジンの代わりになるものだね。まだまだクセが多いけど、クローショーや他のグーグル時代の人たちが本質をうまくまとめてくれてる。何度も見返すうちに、すごくクリアになるんだ。エージェントツールをつなげて、ユーザーのリクエストで促して、あとは放っておく。それを繰り返すうちに、プロンプトが時間とともに進化して、他のところからの反応になるかもしれない。人間のインタラクションや問題解決を模倣しようとする試みをさておいても、オーケストレーションや曖昧なマルチステップタスクを置き換えるための便利なツールになると思う。以前はその曖昧さをコード化しなければならなかったけど、今はそれがなくなるかも。生産環境では、ドライランなしで実行することに少し不安があるかもしれないけど、私たちのツールやサービスは進化していくはず。100以上のサービスがすべて同じように見えて、同じように振る舞って、世界とインタラクトするための一貫した道を提供する環境でこれをつなげたらどうなるのか、すごく興味がある。私たちが使っているすべての一般的な抽象化を与えられれば、今のアシスタントよりも優れたものになるか、さらにはそれ以上になるかもしれない。

中盤の「資産」と「負債」の議論は面白いけど、同意できるとは言えないな。確かに、多くのプログラムは多くのユーザーに使われていないけど、今多くのユーザーがいるプログラムの中には、長い間存在していたけど最初は小さなオーディエンスを対象にしていて、短期間の使用を意図していたものもある。何年も前に一つの目的のためにいい加減に書かれた科学的コードに何度も出くわしたけど、それがその範囲を超えて、初期の意図した寿命を超えて広がってしまったことは数え切れないほどある。そういう経験から、私は自分のコードを書くとき、予想以上に長く使われるかもしれないし、予想以上に広い範囲で使われるかもしれないことを意識している。これは自分自身と他の人への配慮としてやっているんだ。もし誰かの個人プロジェクトとして始まり、その後マネージャーによってグループプロジェクトに昇格したコードベースで作業したことがあれば、理解できると思う。

問題は、代替案は何かってことだよね。人々は一般的に、どの作業が広く採用されるかを予測するのが苦手だ。慎重に優雅に構築されたプロジェクトがどこにも行かないのも、一般的な失敗パターンのように思える。安価に生産できるため、雑なプロジェクトが成功するという進化的圧力がある。これは「悪い方が良い」という古典を思い出させるね。

エージェントを使ってプログラミングを学ぶのにかなりの努力を注いできたよ。最初は投資が必要だったけど、その後のリターンは素晴らしかった。数ヶ月前にやった最初のことは、ほぼ全体のゲームを作ろうとしたこと。自分が「完全なゲーム」と考える中で一番小さなゲームデザインを選んだんだ。多分6回か7回、LLMにとって良いフレームワークやゲームエンジンを見つけるためにいろいろ試したり、異なる初期プロンプトや技術的ガイダンスを試したりした。良いスタート地点とフレームワークが決まったら、コードを少し読むだけでなんとかゴールまで持っていけた。手動でやった場合よりもずっと早く、でも明らかに質は劣ってた。できたシステムの専門家には全然なれなかったし、LLMと戦った時もあったけど、それは最適じゃなかった。実験の目的は、自分でできるだけ少ないコーディングで限界を見つけることだったから、その時はそれを見つけたと思う。だから、その時点で3つの異なるプログラミングモードを経験した。カスタムモード、何十年もやってきたやつ。チャットモード、カスタムモードを多くやりつつ、時々ChatGPTと話してやり取りする。で、ほぼフルバイブモード。どれも最適じゃないってことは明らかで、バイブモードよりももっと関与した方がいい。今のプロジェクトはその部分を探る実験なんだ。システムが悪いコードでスパイラルしないようにしたいし、作られたシステムの専門家になりたい。少なくとも今はそんな感じ。で、私にとっては、バイブモードからチャットモードに行かずに抜け出すのがかなり難しいことが分かった。間違ったタイミングで少しバイブするだけで、コードベースがスパイラルして、理解して修正するのにたくさんの作業が必要になる。ここで伝えたいのは、これらのツールは本当に強力だけど、たくさんの利益を得たいなら学習曲線があるってこと。私のバイブコーディングの中にはワクワクするものもあれば、非常に痛いものもあったけど、リターンは大きかった。

コードを書く練習をしないと、その能力が衰えてしまうんじゃないかな。読書ができるからって、必ずしも本が書けるわけじゃないのと同じようにね。自分でコードを書くと、理解が深まるし、意見も持つようになる気がする。一方で、他の人の作品をレビューする時は、ちょっと甘くなっちゃうし、注意が足りなくなることもあるんだよね。