- LLMがツール呼び出し結果全体を処理する方式は遅く、コストが高く、スケーリングに不利
- その代わりに、出力スキーマに基づく構造化データをコードで処理するようLLMにオーケストレーションさせる方式を提案
- このアプローチは、コードによる関数チェイニングと変数ベースのメモリ管理により大量データ処理に適している
- コード実行ベースのデータ処理方式は、LLMが直接データを復元しないため、正確性と拡張性に優れる
- セキュリティが確保されたAIランタイム環境の構築が新たな課題として浮上しており、持続可能で状態を維持できる実行環境が必要
LLM function calls don't scale; code orchestration is simpler, more effective.
ツール呼び出し結果をLLMに再度渡す従来方式の限界
- MCP(Machine Context Protocol)ツールを使う際、通常はLLMにツール出力結果をメッセージとして渡し、次のアクションを促す
- 実際のユースケースでは、LinearとIntercomのMCPサーバーはJSON形式の大きなレスポンスを返す
- JSONはAPIに似ているが、定義済みの出力スキーマがないため、LLMが全文テキストをパースしなければならない負担が生じる
- 例えば、Linearのイシュー一覧取得結果は50件で70,000文字、約25,000トークンと非常に大きい
- 多くの
idフィールドは意味を持たない一方でトークンを消費し、LLMがこれをそのまま再現しようとするとコストとエラーが増大する
データ処理とオーケストレーションの分離が必要
- 現在の方式は、データ処理とオーケストレーションを1つのチャットセッションに混在させている
- そのために「エージェント」として別スレッドを作る場合もあるが、JSONが構造化されているなら非効率
- より良い方法は、構造化データをコードで直接処理すること
- 例: イシューの並べ替えは、LLMが出力を生成する代わりにコードで
sortを実行し、結果配列だけを返す
コード実行ベースのデータ処理
- コード実行によるAI演算は、すでにさまざまなAIインタープリタで使われている
- この方式により、LLMが直接データを出力せず、ツールの使い方だけを決めればよい簡潔な構造が可能になる
主な概念
- 変数をメモリとして活用: 値の代入 = 保存、出力 = 参照、関数呼び出し時には引数として渡す
- 関数チェイニングをサポート: 複数の関数呼び出しを並列/順次に組み合わせ、依存関係はコード内の自然な流れで表現
- スケーラブルな大量データ処理: NumPy、pandasなどと組み合わせることで、数千〜数万件のデータも容易に処理可能
- 他のLLM呼び出しも可能: LLMが書いたコード内で別のLLMを呼び出し、非構造化データ処理にも対応できる
MCPは準備できているのか?
- MCP仕様はすでに入力スキーマを定義しており、最近は出力スキーマのPRも提出された
- 出力スキーマが一般化すれば、次のような活用が可能になる:
- イシュー状況ダッシュボード
- 週次完了チケットレポート
- 停滞したチケットをAIが監視してプッシュ
コード実行環境の課題
- セキュリティが重要課題: AI/ユーザーが生成したコードを実行するため、APIキーやデータ漏えいを防ぐ設計が必要
- Lutraの場合、実行環境はサンドボックス方式で構成し、モデルにはAPI呼び出しドキュメントのみを提供する
- 状態保持型の実行環境(Jupyterなど)は高コストであり、長期セッションのためには**ステートレス(stateless) + 永続性(persistent)**の特性が必要
- これは新しい形の**AIランタイム(runtime)**というカテゴリを形成しており、まだ設計が活発に進められている
結論
- ツール呼び出し結果をLLMに渡して処理させる従来方式には、コストと正確性の面で限界がある
- コードベースのオーケストレーションは、シンプルでありながらスケーラブルかつ正確な処理を可能にする
- AIコード実行環境は、セキュリティ、永続性、拡張性を備えた次世代ランタイムとして注目されている
1件のコメント
Hacker Newsの意見