7 ポイント 投稿者 GN⁺ 2026-01-09 | 1件のコメント | WhatsAppで共有
  • AIコーディングアシスタントの中核構造は複雑な魔法ではなく、約200行のシンプルなPythonコードで構成される
  • システムはLLMとの対話ループをベースとしており、LLMがツール呼び出しを要求すると、ローカルコードがそれを実行して結果を再び返す
  • 必要な基本ツールはファイル読み取り(read)ファイル一覧(list)、**ファイル編集(edit)**の3つで、これによりプロジェクトの探索とコード修正が可能になる
  • LLMはツールの**シグネチャと説明(docstring)**をもとに、どのツールをいつ呼び出すかを自ら判断する
  • この構造はClaude Codeのような商用製品の中核と同じであり、シンプルな構造でも強力なコーディングエージェントを実装できる

コーディングエージェントの基本概念

  • コーディングエージェントはLLMとの対話ベースのシステムで、ユーザーの命令を受けてツール呼び出しを通じて実際のファイル操作を行う
    • ユーザーは「hello world関数を含む新しいファイルを作成」といった要求を入力する
    • LLMは必要なツール呼び出しをJSON形式で応答する
    • プログラムがそのツールを実行し、結果を再びLLMに渡す
  • LLMはファイルシステムに直接アクセスせず、要求だけを行い、実際の作業はローカルコードが処理する

必要な3つのツール

  • read_file: 指定されたファイルの全内容を読み取って返す
  • list_files: ディレクトリ内のファイルとフォルダの一覧を返す
  • edit_file: 既存の文字列を新しい文字列に置き換えるか、old_strが空なら新しいファイルを作成する
    • 置き換える文字列がない場合は「old_str not found」を返す
  • この3つのツールだけでもファイルの作成、修正、探索が可能

ツール登録とLLM統合

  • すべてのツールはTOOL_REGISTRYに名前と関数として登録され、LLMが呼び出せる
  • 各ツールのdocstringとシグネチャを抽出してLLMに渡す
  • システムプロンプトはLLMに「利用可能なツール一覧」と「呼び出し形式」を明確に伝える
    • ツール呼び出しは'tool: TOOL_NAME({JSON_ARGS})'形式に制限される
    • ツール実行結果はtool_result(...)の形でLLMに渡される

ツール呼び出しのパースとLLM応答処理

  • LLMの応答からtool:で始まる行を探し、**ツール名と引数(JSON)**を抽出する
  • 各ツールを実行した後、結果をJSONとしてシリアライズして会話履歴に追加する
  • execute_llm_call関数はLLM APIを呼び出し、応答テキストを返す
  • run_coding_agent_loopはユーザー入力を受け取り、LLMとの対話ループを維持する
    • 内部ループは、LLMがそれ以上ツール呼び出しを要求しなくなるまで繰り返す

実行例と拡張可能性

  • 例の会話:
    • 「hello.pyファイルを作成してhello worldを実装して」→ edit_file呼び出しで新しいファイルを作成
    • 「hello.pyに2つの数を掛ける関数を追加」→ read_fileの後にedit_fileを呼び出し
  • 200行のコードで完全なコーディングアシスタントを実装可能
  • 商用製品では、ここにエラー処理、ストリーミング応答、コンテキスト管理、追加ツール、承認手順などが加わる
  • 中核構造は同じで、LLMが決定し、コードが実行するシンプルなループで構成される

実践と拡張

  • 全ソースは約200行で、他のLLMプロバイダーへの切り替えやツール追加で拡張できる
  • シンプルな構造でも強力なAIコーディングエージェントのプロトタイプを自分で実装できる

1件のコメント

 
GN⁺ 2026-01-09
Hacker Newsの意見
  • 追加したいのは planning だ。
    効果的なツール利用の鍵は、これらが 動的なTODOリスト の上で動作していると気づく瞬間にある。
    Planモードは、そのリストがどうシードされ、各項目がいつ実行されるかをブートストラップする役割を果たす。
    ユーザーとのやり取りは、そのリストを並べ替える形で機能する。
    先月、Claude CodeがCTF問題をどれだけうまく解けるか実験したが、TodoListツールとplanningを切ると性能が1〜2段階落ちた。
    関連動画は Breaking Bots: Cheating at Blue Team CTFs with AI Speed Runs を参照。
    興味深いのは、多くの人が「planモードを使うかどうか」にばかり注目する一方で、TODOリストは常に有効だという点だ。
    また、「スマートなコンテキスト管理」を単なるTODO項目として片付ける記事を見ると、少し笑ってしまう。
    自分で実装しようとして、本番環境で壊れる評価結果 のせいで1年を無駄にすることも多い。

    • Claude Codeのシステムプロンプトを抽出した gist を見ると、TODO反復(iteration)に関する詳細が多い。
      これを単純にreasoningトークンとして追加することもできるが、実際には 明示的な単一キー保存ツール として実装したほうが、はるかに予測可能で効果的だ。
      言語構造を保存する他のツールのアイデアにも、こうした単純なアプローチは通用しそうだ。
    • CLIエージェント向けに「working memory」ファイルを維持する方式は非常によく機能した。
      Codexをテストしながら、仕様を10分ほど整理して変更リストに分け、それをファイルとして保存させたうえで、各変更後に計画を見直し・修正するよう指示した。
      こうするとLLMは 短い目標指向の作業 に集中でき、継続的なプロンプト入力も不要になる。
      実質的にサブエージェントを置くのに近い効果がある。
    • 私もプロンプトの最後に「この作業のために非常に細かいtodoリストを使え」とよく追加する。
      最後のtodoとして「作業全体を見直し、linterなどで品質を確認せよ」と指示することもある。
    • TODOリストはしばしばコンテキストの HEADに再挿入 され、LLMが過去と次のステップを認識できるようにする。
      コンテキスト圧縮時には、セッションの 簡潔な表現 としても使われる。
    • 年末ごろには「How to Code Claude Code in 200 Million Lines of Code」みたいな冗談が出るかもしれない。
  • コーディングエージェントの核心は、実際には単純な ループとツール呼び出し構造 だ。
    ただし、「The Emperor Has No Clothes: How to Code Claude Code in 200 Lines of Code」のような記事を書くなら、Thorsten Ballの How to Build an Agent は必ず参照すべきだ。
    あの記事が「エージェントの本質は単純だ」というアイデアを最初に示した。
    もちろん実際にはTODOやさまざまな 足場作り(scaffolding) が必要で、Claude Code自体にも複雑な設定やプラグイン、UI機能が多い。
    それでも最小限のループさえあれば、自分で機能拡張するようブートストラップすることもできる。
    内部動作を見たければ、claude-trace でLLMとツール呼び出しの相互作用を追跡できる。

    • 私はClaude CodeとCodexのローカルトランスクリプトを分析しながら内部構造を調べた。
      単純なループ以外にも、uuidスレッディング、メッセージキュー処理、ファイル変更スナップショット、サブエージェントのサイドチェーンなど複雑な要素が多い。
      そのため「200行」は概念的には正しいが、実際のプロダクション水準ははるかに複雑だ。
      Codexにはまだキューイング機能がないが、それでもなお強力だ。
      私は Contextify というmacOSアプリを作り、Claude CodeとCodexのCLIトランスクリプトをリアルタイムで監視し、Total Recall 機能で会話履歴を問い合わせられるようにした。
    • コード編集が最も重要な部分だ。
      Claudeモデルは独自の str replaceツールスキーマ で訓練されている。
      ファイル全体を書き直すのは非効率なので、部分修正が鍵になる。
    • 「同じ記事の再投稿かと思った」という反応もあった。
    • 「その単純なコアループを実際に見せてもらえるか」という要望もあった。
  • 実際にはもっと多くの要素がある。
    たとえばエージェントが early stopping を起こして作業を終えてしまうことがある。
    最新のreasoningモデルでも解決しない。
    Claude Codeは、各プロンプトにTODOを注入して残作業を思い出させることで対処している。
    HolmesGPTの公開リポジトリにはさまざまな実験ベンチマークがある。

    • 「なぜearly stopが起きるのか」という質問も出ていた。
  • 「LLMにツール一覧と呼び出し形式だけ教えればよい」という概念は、最初は衝撃的だった。
    LLMは単にテキストを生成するだけなのに、どうやってツールを呼ぶのかと思っていたが、それがすべてだと気づいたときは魔法のようだった

  • 休暇中にOpusでProlog DSLベースのコーディングエージェントを作ってみたが(200行は超えた)、
    驚くほどほぼすぐにうまく動いた。
    最新世代のモデルは、エージェントハーネスの重要性が下がる段階 に到達したように見える。
    関連実験は この投稿 を参照。

  • 1年前ならこの記事はかなり正確だったが、今はハーネスが大きく進化していて、単純ループモデルだけでは Claude Codeの実際の動作を説明しにくい

    • もちろん現代のハーネスにはより多くの機能があるが、基本概念は依然として有効だ。
      単純なエージェントでも同じモデルを使えば性能差はそれほど大きくない。
      ちょうど「自前でDBを作る」チュートリアルが基本的なB-treeを見せるのに似ている。
    • tbench.aiリーダーボード によると、複雑さは性能をわずかに押し上げるが、「Terminus」のような単純ループベースでも十分に強力だ。
    • 「この記事は2025年1月に投稿されたものだ」という言及もあった。
    • 実際には、ここ1年の進歩は プロンプトとツール設計の単純化 に集中している。
      SubagentやMCP、Skillsは中程度で、コンテキスト最適化は長時間実行でのみ意味を持つ。
    • codex-cliリポジトリを活用すれば、よりよいモデル分析が可能だ。
  • 私は企業向けの エージェントループ を自前で構築しており、月間10億トークン超を処理している。
    単純なループが核心なのは確かだが、実環境では無数の細部が複雑さを爆発的に増やす。
    たとえば、ユーザーが途中でメッセージを送ってきたらループをどう処理するか、Slackのような Webhook入力 をどう同期するか、
    承認・ガードレール・非同期Task処理など、考えるべきことが多い。
    こうした経験をブログにまとめてみようかと思っている。

  • 参考になる記事として You Should Write An AgentHow To Build An Agent がある。

  • 私たちのSWE-benchチームは、100行のオープンソースエージェントを公開した。
    mini-swe-agent で、学界と業界の両方で人気が高い。
    エージェントの世界を学ぶには良い出発点だ。

  • 2023年には「LangChainを100行で再実装する」という記事があり、
    その記事 を見て実際に実装し、いくつかのプロジェクトで活用した。

    • 「もう3年前なのか」という反応もあった。