HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Astra for Coding: なぜ私たちはこれを再びやっているのか?

Astra for Coding: Why Are We Doing This Again? (lucumr.pocoo.org)

211 pointsby manojbajaj95117 コメント

要約

著者は、AIエンジニアリングにおける「内巻(Neijuan)」、すなわち努力と競争だけが増大し、成果が向上しない状況について論じています。最新AIモデルAstraをソフトウェア開発に適用しようと試みた結果、モデルは長期間タスクを継続する能力は高いものの、生成されるコードの質が低く、実用的な開発には結びつかないという課題が浮き彫りになりました。特に、Pythonの文字列操作によるC言語コードの編集など、非効率的で奇妙なコード生成パターンが観察されています。

全文翻訳

Astra for Coding: なぜ私たちはこれを再びやっているのか? Armin Ronacher's Thoughts and Writings blog archive projects travel about Astra for Coding: Why Are We Doing This Again? written on September 07, 2026 私は、AIエンジニアリングのすべてが内巻(Neijuan、内側に巻き込むという意味)であるとますます確信しています。中国では、これは成果を向上させることなく、ますます多くの努力と競争を要求するシステムを指します。これが西洋で時折現れる形が、996のナンセンスです。内巻の英語の用語は、「Agricultural Involution」という本からの「Involution(進化論的退化)」です。Agricultural Involutionは、平方メートルあたりの生産性を向上させる農業の集約化を説明していますが、一人あたりの生産性は変わらないままです。それが今のAIに対する私の感覚です。そして、GPT 6 Astraの話になります。 Astraは、あらゆる点で信じられないほど印象的なモデルです。これに対して本当に言うべきことはあまりありません。コンピューターの使用に驚くほど優れており、画像や複雑なトピックを理解し、完了を追求することに容赦がありません。それは絶対に印象的です。これらのタイプのモデルは、何らかの形で世界を変えるでしょう。しかし、少なくとも現時点では、実際のソフトウェアエンジニアリングにどのように活用できるかわかりません。それがTwitterでかなりの注目を集めたので、私の考えを要約して、このものからどのようなコードが出てくるかを共有しようと思いました。 私のスロップ工場 「Armin、ソフトウェア工場を運営すべきだ!」 これを何度か聞かれたので、週末に小さなソフトウェア工場を運営してそれを祝うことにしました。もしみんながスロップな3Dゲームを作っているなら、私もそれを使って何か有用なことをすべきです。私のソフトウェア工場は、モデルがワークフローの「どのように」を完全に決定できるように意図的に設定されました。それは自身のコンテキストを管理する自由を持ち、エージェントノートフォルダに自身の記録を維持できました。そして、それは作業を行うためにサブエージェントをスピンオフしました。目標は?もし仮想スレッドとレキシカルスコープを持つPythonがあったらどうなるか、というものでした。そして、私はこのためにChatGPTトークンをリセット分まるまる、つまり約40億トークンを費やしました。35時間後、工場は価値のあるものを何も届けず、より良い工場を運営する方法についても何も教えてくれませんでした。しかし、それは大量のコードと入力プロンプトを生成したので、私が研究できるものがいくつかありました。そして、Solや以前のOpenAIモデルとは異なる振る舞いを示します1。その後、Astraでの通常のプログラミングでも同じ問題に遭遇したので、工場だけが原因ではありません。トレーニングプロセスで何かが「間違って」起こっていると疑っています。モデルは長期間のタスクを成功させることで大きく報酬を得ていますが、おそらく「ひどいコード」に対する罰はほとんどありません。明らかに、Astraは3Dコンテンツの生成に優れており、プロセス中に自身の作業を生み出しながら、非常に長く続けることができます。私のロボット掃除機の逆エンジニアリングを、非常に印象的な方法でかなりの量行わせました。だから、それは間違いなくクールです! コードゴルフツール呼び出し Astraに関する最初の問題は、ツール呼び出しに使用されるコードのタイプから来ています。Codexは、ますます多くの操作を行うために「単なるbash」に依存するようになっています。数バージョン前から、元のCodexハーネスはsedなどのツールを使用してファイルを読み取ります。Codexがbashコマンドを解析し、認識すると非表示にするため、通常はそれらを見ることができません。しかし、Astraは…本当にPythonが大好きです?これはそれほど驚くことではありません。なぜなら、古いOpenAIモデルでさえ、時折オンデマンドでPythonコードを使用してファイルを読み取ったり操作したりする傾向があったからです。しかし、Astraは私にとってはそれを非常に過度に行います。ここで重要な免責事項があります。このプロジェクトは非常にメタ的です。なぜなら、私はCPythonインタープリターに取り組んだからです。しかし、TypeScriptコードのPiでさえ、このモデルが奇妙なPythonを行うのを見たことがあると保証できます。しかし、私が最も奇妙なコードの証拠を持っているのは、週末にスロップ工場からの監視なしでそれを動かしていたときです。それがPythonを書くことは興味深いことではありません。Pythonの種類が興味深いのです。そして、あなたがざっと目を通せるように、いくつかの出力を収集しました。 Python文字列スプライシングによるCコードの編集 Codexハーネスでは、サブエージェントがパッチツールを使用する代わりに、完全に手動の文字列操作をPythonで行うケースが複数見つかりました。 ```python python3 - <<'PY' from pathlib import Path p=Path('Include/internal/pycore_intrinsics.h');s=p.read_text().replace('#define MAX_INTRINSIC_1 14','#define INTRINSIC_RETAIN_ANNOTATION_CELLS 15\n\n#define MAX_INTRINSIC_1 15');p.write_text(s) p=Path('Python/intrinsics.c');s=p.read_text();idx=s.index('#define INTRINSIC_FUNC_ENTRY');s=s[:idx]+'''/* Hold every old cell until the compiler has published the entire site's new capture. A replaced cell's finalizer may reenter module __annotate__. */ static PyObject * retain_annotation_cells(PyThreadState *tstate, PyObject *holders) { if (!PyTuple_CheckExact(holders)) { PyErr_SetString(PyExc_TypeError, "annotation holders must be a tuple"); return NULL; } Py_ssize_t size = PyTuple_GET_SIZE(holders); PyObject *previous = PyTuple_New(size); if (previous == NULL) return NULL; for (Py_ssize_t i = 0; i < size; i++) { PyObject *holder = PyTuple_GET_ITEM(holders, i); if (!PyCell_Check(holder)) { Py_DECREF(previous); PyErr_SetString(PyExc_TypeError, "annotation holder must be a cell"); return NULL; } PyObject *cell = PyCell_Get(holder); PyTuple_SET_ITEM(previous, i, cell == NULL ? Py_NewRef(Py_None) : cell); } return previous; } ''' +s[idx:];s=s.replace(' INTRINSIC_FUNC_ENTRY(INTRINSIC_AWAIT_BLOCK, await_block)',' INTRINSIC_FUNC_ENTRY(INTRINSIC_AWAIT_BLOCK, await_block)\n INTRINSIC_FUNC_ENTRY(INTRINSIC_RETAIN_ANNOTATION_CELLS, retain_annotation_cells)');p.write_text(s) p=Path('Python/codegen.c');s=p.read_text();idx=s.index('static int\ncodegen_annassign(');s=s[:idx]+'''static int codegen_retain_annotation_cells(compiler *c, location loc, PyObject *captures) { Py_ssize_t pos = 0; PyObject *binding, *holder; while (PyDict_Next(captures, &pos, &binding, &holder)) { ADDOP_NAME(c, loc, LOAD_CLOSURE, holder, cellvars); } ADDOP_I(c, loc, BUILD_TUPLE, PyDict_GET_SIZE(captures)); ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_RETAIN_ANNOTATION_CELLS); return SUCCESS; } ''' +s[idx:] a=s.index(' if (conditional_annotation_index != NULL) {',s.index('codegen_annassign(compiler *c')) b=s.index(' if (captures != NULL) {',a) # Move lookup before conditional registration and retain old cells before anything changes. lookupstart=s.index(' PyObject *captures = _PyCompile_AnnotationCaptures',a) lookup=s[lookupstart:b].replace(' return ERROR;',' Py_XDECREF(conditional_annotation_index); return ERROR;') s=s[:lookupstart]+s[b:] setup=lookup+''' if (captures != NULL && codegen_retain_annotation_cells(c, loc, captures) < 0) { Py_XDECREF(conditional_annotation_index); return ERROR; } ''' s=s[:a]+setup+s[a:] needle=' ADDOP_NAME(c, loc, STORE_DEREF, holder, cellvars);\n }\n }' s=s.replace(needle,' ADDOP_NAME(c, loc, STORE_DEREF, holder, cellvars);\n }\n ADDOP(c, loc, POP_TOP); /* release old cells after full publication */\n }',1);p.write_text(s) p=Path('Include/internal/pycore_magic_number.h');s=p.read_text().replace(' Python 3.16a1 3709 (Checked deferred annotation closure capture)',' Python 3.16a1 3709 (Checked deferred annotation closure capture)\n Python 3.16a1 3710 (Retain replaced annotation captures until publication)').replace('#define PYC_MAGIC_NUMBER 3709','#define PYC_MAGIC_NUMBER 3710');p.write_text(s) p=Path('Lib/test/test_block_annotation_captures.py');s=p.read_text();idx=s.index(' def test_typing_consumers');s=s[:idx]+''' def test_replaced_cell_finalizer_sees_complete_site_publication(self): module=execute("""\ events=[] class V: def __init__(self,n): self.n=n def __del__(self): if self.n == 0: events.append(__annotate__(1)) for i in range(2): x=V(i) # bind x y y=i value:(x.n,y) """) self.assertEqual(module.events,[{'value':(1,1)}]) self.assertEqual(module.__annotate__(1),{'value':(1,1)}) ''' +s[idx:];p.write_text(s) PY make -j1 > /tmp/block-annotations-build7.log ``` ---