- AIが生成したコードを安全に実行するために設計されたRustベースの軽量Pythonインタプリタで、コンテナサンドボックスの複雑さと遅延を排除
- ファイルシステム・環境変数・ネットワークアクセスを完全に遮断し、開発者が指定した外部関数のみ呼び出し可能
- 1マイクロ秒未満の起動時間とCPythonに近い実行性能を提供し、Rust・Python・JavaScriptのすべてから呼び出し可能
- 実行状態をバイト単位でスナップショット保存・復元でき、プロセス間で中断・再開が可能
- Pydantic AIのCode Mode機能を動かす予定で、LLMが書いたPythonコードを安全に実行する中核コンポーネントとして使用
Monty概要
- MontyはRustで書かれた実験的なPythonインタプリタで、AIが生成したコードを安全に実行するためのツール
- コンテナベースのサンドボックスのコスト・遅延・複雑性を避け、LLMが書いたPythonコードを直接実行可能
- 起動時間は数マイクロ秒単位で、一般的なコンテナの数百ミリ秒よりはるかに高速
- できること
- Pythonコードの一部の構文の実行をサポートし、型ヒントベースの静的型チェックを含む
- ホストアクセスを完全に遮断し、外部関数呼び出しは開発者が明示的に許可した関数のみ可能
- Rust・Python・JavaScriptから呼び出し可能で、リソース使用量の追跡と制限機能を内蔵
- stdout/stderrの収集、非同期コード実行、スナップショット保存・復元機能をサポート
- 制限事項
- 標準ライブラリは
sys、typing、asyncio、dataclasses(予定)、json(予定)のみ利用可能
- クラス定義とmatch文はまだ未対応
- サードパーティライブラリはサポート対象外
- 設計目的はただ一つ、エージェントが書いたコードを安全に実行すること
Pydantic AI統合
- MontyはPydantic AIのCode Modeを駆動
- LLMがツール呼び出しの代わりにPythonコードを書き、Montyがそれを安全に実行
- 例では
get_weather、get_populationのような関数型ツールを定義し、LLMがそれらを呼び出すコードを作成
代替技術との比較
- Montyは言語の完全性には制限があるが、セキュリティ・速度・単純性に優れる
- 起動遅延0.06ms、無料、導入が簡単、スナップショット機能をサポート
- 他技術との比較要約:
- Docker: 完全なCPython環境、セキュリティは良好だが起動遅延は195ms
- Pyodide: WASMベース、セキュリティが弱く起動遅延は2800ms
- starlark-rust: 非常に制限された言語で、高速だがPythonとは異なる
- sandboxingサービス: 強力なセキュリティを持つが、コスト・遅延・設定が複雑
- YOLO Python(exec/subprocess): 高速だがセキュリティは皆無
- Montyはファイルアクセス制御、リソース制限、スナップショットベースの中断・再開機能を通じて
AIコード実行向けの安全なPython環境を提供
1件のコメント
Hacker Newsのコメント
WebAssemblyでビルドしたバージョンを動かしてみた。実際に試せるWebプレイグラウンドを作ってある
まだクラス対応はないが、LLMがクラスを使おうとするとエラーを見て、自分でクラスを使わないコードに書き直す
ビルド手順をまとめた記事はこちらにある
ターミナルエージェントの強みはネットワーク・ファイルシステムへのアクセスなのだから、そうであればサンドボックスコンテナの方が自然な拡張に感じる
Typescript、C#、Pythonはどれも問題なく使えている
昔、Gitに移る前にMercurialを使っていた頃を思い出した。当時はGitが流行っていて皆が使っている感じだったが、MercurialのUXの方がずっと良いと思っていた
今は皆Pythonでagent
execを書いているが、自分はTypeScript/JSの方が適していると感じる。速くて安全で、型のおかげで情報密度も高い。だが今回も自分が負けそうだ個人的にはTypeScriptの静的型システムの方が好みだが、速度やセキュリティ面では両言語とも似たような水準だ
Pythonはこうしたデータ処理エコシステムが整っており、Pyodideやtyのようなツールでセキュリティ問題も緩和できる
いまやNVIDIAもPythonでカーネルを書くことを公式にサポートしている
このプロジェクトはサンドボックス化の問題に対する興味深いアプローチだ。以前、jsrunという実験でPythonの中にV8を入れてJSを安全に実行したことがある
Montyも似た目標を持っているようだ。最小限のインタプリタから始めるのはAIワークロードに適しているが、Pythonの長い尻尾の文法を扱うのは簡単ではない
安全性と予測可能性のために表面積を減らしつつ、LLMが生成する複雑なコードまで処理できるだけの機能を提供するバランスポイントが重要だ
少し違う話だが、Monty Robertsの『The Man Who Listens to Horses』という本を思い出した。
動物の言語を学ぶ内容で、書籍リンクと動画がある
「LLMが書いたPythonコードを超高速かつ安全に実行する」という説明は興味深かった。
ただ、
uvのようなRustベースのランタイムでも最低10ms程度はかかるので、マイクロ秒単位は難しそうに見えるそれでも標準ライブラリなしのミニインタプリタというアイデアは良い。AIサンドボックス化の観点でも新鮮で、Pydanticからこういうものが出てくるとは思わなかった
uvはRustで書かれたランタイムだ自分は既存言語を再利用するより、AI専用の厳格な言語を作る方が良いと思う
AIは仕様をよく理解するので、人間のような緩い文法は必要ない。
むしろ正確な構造と一貫したフォーマットを強制する言語の方が向いている。
自分もそういう言語を試しているが、AIのコード生成には人間以上の規律を求められると考えている
すでにPythonをよく知っているモデルに「この関数だけ使え」と制限する方がはるかに現実的だ
jstanleyが言った**「小さな不便さ(papercut)」の論点はその通りだが、逆にAI生成コードを大規模に実行する場合はセキュリティリスク**の方が大きい
ファイルI/O、ネットワーク、subprocessのような機能を完全なCPythonに開放するのは危険だ
ただしクラス制限は奇妙だ。セキュリティとは無関係で、単にコードが汚くなるだけだ。
おそらく「最小機能から始めて段階的に拡張する」アプローチなのだろう
CPythonの全機能を真似するよりも、AIコードに必要な最小限のインタプリタを作るアプローチは興味深い
完全なランタイムは攻撃面が広すぎるが、制限されたサブセットなら安全だ
エラーフィードバックを通じてLLMが自分で制限文法に適応するよう促す戦略も現実的だ。
ほとんどのツール利用シナリオでは、メタクラスや動的importは必要ない
素朴な疑問だが、seccompでシステムコールを制限すればよいのでは?
ファイルアクセスを防ぎたいなら関連するsyscallを遮断すれば済むはずで、わざわざ別のインタプリタが必要な理由が気になる
最初から極度に単純なランタイムで始めれば、攻撃面が小さくなりはるかに安全だ
プロジェクト自体は筋が通っているが、「AI向け超高速ツール」という言い方には笑ってしまう
AIの思考速度があまりに遅いので、コード実行がいくら速くても全体の体感速度には大きな差がない
まるで隣で氷河が動く速度で働く同僚と一緒に配達しているようなものだ