コロンビア大学の博士課程でAI・セキュリティの研究をしている Koukyosyumei です。
本連載では、Claude CodeやCodexを使い、さまざまなマルチエージェント研究のワークフローをh5i-python SDKで再実装します。役割分担、レビュー、投票、合議といった設計パターンを、実際に動くコードから理解することを目的としています。
本記事では、コード生成の前後に分析とテスト生成の工程を挟み込むフローを提案している AlphaCodium(Ridnik et al., 2024) を紹介します。
論文概要
AlphaCodiumの主張は、コード生成の品質を上げたければ、プロンプトの言い回しを磨くより、生成の前後の工程を設計せよというものです。著者らはこの考え方をプロンプトエンジニアリングに対するフローエンジニアリングと呼び、次の一連の流れとして定式化しています。
- 問題リフレクション: コードを書く前に、目的・入出力・エッジケースを構造化して分析
- AIテスト生成: 素朴な実装が見落とすエッジケースを突く追加テストを生成
- コード生成: リフレクションと全テストを踏まえて実装
- 反復: 公開テストとAIテストの両方が通るまで修正を繰り返す
同じGPT-4を使っても、フローの有無で結果は大きく変わります。競技プログラミングのベンチマークCodeContestsでは、単純なプロンプトによるpass@5が19%だったのに対し、AlphaCodiumのフローを通すと44%まで向上しました。モデルを変えずに、工程の設計だけで正答率が2倍以上になった計算です。
h5i-python を用いた実装
h5i-pythonは、Claude CodeやCodexを組み合わせ、様々なマルチエージェント・オーケストラレーションをPythonコードとして実装できるライブラリです。
このh5i-pythonは、監査可能なAI エージェント向けワークスペースを提供するh5iを内部で用いており、h5iが提供する安全なサンドボックスやエージェント間通信を簡単に使うことができます
まずは、分析を担当するAnalystと実装を担当するCoderを登録しましょう。
from h5i.orchestra import Conductor, Review, Verification
async with Conductor(".", "alphacodium-demo", launcher="resident", isolation="supervised") as c:
analyst = await c.hire("analyst", runtime="claude", model="claude-haiku-4-5")
coder = await c.hire("coder", runtime="codex", model="gpt-5.4-mini", effort="medium")
次に、コードを書く前の問題リフレクションです。ここで使っているaskは、ファイルを変更するworkとは別の、エージェントからJSON形式のデータを受け取るためのAPIです。parse=に渡した関数が応答を検証し、goal・inputs・outputs・edge_casesのどれかが欠けた応答はエラーメッセージ付きで自動的に再質問されます。
reflection = await analyst.ask(
f"Problem: {task}\n\nReflect on it in structured form. Reply as "
'JSON: {"goal": "...", "inputs": "...", "outputs": "...", '
'"edge_cases": ["..."]}',
parse=parse_reflection,
)
続いて、リフレクションで見つかったエッジケースを突く追加テストをAnalystに設計させます。
ai_tests = await analyst.ask(
f"Problem: {task}\nReflection:\n{json.dumps(reflection, indent=2)}\n\n"
f"Design {N_AI_TESTS} ADDITIONAL tests that probe the edge cases "
"and failure modes a naive solution would miss. Reply as JSON: "
'{"tests": ["<concise test description>", ...]}',
parse=parse_tests,
)
準備が整ったので、Coderに実装させます。タスク本来のテストに加えて、いま生成したAIテストのカバーも必須条件としてプロンプトに含めます。
artifact = await coder.work(
f"{task}\n\nProblem reflection:\n{json.dumps(reflection, indent=2)}\n\n"
"Beyond the task's own tests, your test suite MUST also cover:\n"
+ "\n".join(f"- {t}" for t in ai_tests),
expect_independent=True,
)
await c.freeze()
最後に、反復ループです。テストは新しいサンドボックス内で中立的に実行され、失敗した場合はその証拠がレビューとしてCoderに戻り、全テストが通るまで修正が続きます。
for iteration in range(1, MAX_ITERATIONS + 1):
verification = await c.verify(artifact, VERIFY)
if verification.applies_cleanly and verification.tests_passed:
break
if iteration == MAX_ITERATIONS:
break
artifact = await coder.revise(
artifact,
Review(
reviewer="flow-iterate",
target=coder.id,
round=artifact.round,
body=(
"Verdict: REVISE\n\nThe suite (public + AI-generated "
f"tests) failed neutrally:\n{describe(verification)}\n\n"
"Fix the implementation; keep every test."
),
referenced_artifacts=(artifact.id,),
),
)
全体のコードは、alphacodium.pyに置いてあり、以下のように簡単に実行することができます。
pip install h5i-orchestra
python examples/papers/alphacodium.py "implement quicksort with pytest"
このPythonプログラムを実行すると、tmuxを用いてClaude CodeやCodexのセッションが自動で立ち上がり、実装・通信を始めます。

