Lindy Agentは、単一ノード内でAIワークフローの構築・実行・監視・復旧を可能にする軽量自律エージェントフレームワークです。本稿では、モデルの更新を伴わずに、構成管理の一处改修によって連携失敗率を大幅に改善した事例を解説します。
多モダール連携における課題とベースアーキテクチャ
多モダールタスクを連携処理する際、主に以下の課題が発生していました:
- モダールごとの特有プロセスがループ時に非効率に蓄積
- タイムアウト・リトライ戦略が同一の固定値で適用され、モダール特性を考慮しない
- 共有コンテキストの同期粒度が粗く、タスク間の依存関係が静的
この問題に対し、Lindyは以下3層アーキテクチャで対応しています:
| 層 | 機能 | 利用実装 |
|---|---|---|
| 制御層 | タスク分割・依存管理・リアクティブリトライ | Go言語実装のDAGスケジューラー |
| 同期層 | ア生成結果・タスクメタの分散共有 | Raftベースの軽量KVS |
| 変換層 | モダール固有のエンコーダ・プロイジェクション | ONNXベースの推論コンテナ群 |
構成管理の変更とその影響
旧設定:静的連携ポリシー
従来の`lindy.yaml`では、すべてのモダール連携に同一設定を適用していました:
pipeline:
multi_modal:
mode: static
timeout_ms: 3000
retry_policy:
strategy: fixed_backoff
count: 3
buffer_allocation:
vision_ratio: 0.2
text_ratio: 0.8
この設定では、高解像度画像入りクエリで視覚モダールが固まると、残りの処理もタイムアウトし、連鎖的な失敗に発展していました。
新構成:動的制御ポリシー
構成全体を以下のように置き換えました:
pipeline:
multi_modal:
mode: adaptive
scaling_granularity: per_instance
dynamic_timeout:
base_ms: 1200
load_factor: true
history_smooth: exponential
max_ms: 8500
retry_policy:
strategy: context-aware
fallback_chain:
- on_error: ["OOM", "decoder_timeout"]
fallback: cpu_offload
- on_error: ["context_overflow"]
fallback: prune_window
buffer_allocation:
auto_tuning:
target_recall: 0.90
latency_budget_ms: 100
この変更により、(system構成に依存しない) 連携失敗のうち、62.4%が解消されました。
連携失敗原因の内訳変化(A/Bテスト結果)
| 原因分類 | 旧設定(%) | 新設定(%) | 改善 |
|---|---|---|---|
| タイムアウト连鎖 | 34.1 | 18.6 | ↓45.4% |
| バッファ不足による切断 | 19.3 | 6.2 | ↓67.9% |
| リトライ過負荷 | 15.7 | 7.4 | ↓52.9% |
| コンテキスト整合性消費 | 8.9 | 1.1 | ↓87.6% |
動的タイムアウトとコンテキストのスケーリングロジック
以下は、各モダールインスタンスがこれらのYAML設定をもとに選択するタイムアウト算出ロジックの一例です:
func adaptiveTimeout(instanceType string, load Factor, histLatencies []float64) (int64, error) {
baseTimeout := 1200 // millisecond
// 負荷因子(GPUメモリ使用率, optimizer step数, decode queue長参考)
loadMult := 1.0 + load*0.8
// 歴史的遅延を用いた平滑化係数(Holt指数平滑法)
alpha := 0.15
smoothed := exponentialSmoothing(histLatencies, alpha)
smoothMult := smoothed / 850.0 // 基準値での単位化
// 最終タイムアウト値
proposed := float64(baseTimeout) * loadMult * smoothMult
if proposed > 8500 {
return 8500, nil
}
return int64(proposed), nil
}
この仕組みにより、たとえば画像分析プロセスが1200ms~7200msの範囲で需要に応じた耐久性を持つようになり、結果としてAGGREGATIONフェーズ以降の待機列も Flatten します。
スケールインセーフなコンテキストバッファ自動調整
`buffer_allocation.auto_tuning`オプションが有効な場合、実行時に以下のプロセスが起動します:
- 各モダールタスクがLast-7daysのP95遅延とタスク完了率を上报
- 中央スケジューラがビジネスSLA目標(例:"視覚応答90% >/= 800ms")との差異を評価
- 既存のコンテキスト窓公积金額を再分配(例:視覚比率0.25→0.34)
- 変更を全ノードにgemini-basedメタ同期で伝播(sync delay < 180ms)
この自動調整は、以下のような負荷別タスク分布 pour chaque modalité を考慮します:
| タスクタイプ | 視覚入力パターン | 推奨buffer_ratio |
|---|---|---|
| OCR画像前処理 | 多言語+高解像度 | 0.52 |
| Medical Imaging QA | DICOM multi-plane 3D | 0.48 |
| Guardrail文検証 | 単一行の短文 | 0.18 |
実環境での影響と拡張性
本制御構成の適用により、ようやく以下のような事例が現実的に成立するようになりました:
- 300枚画像+4000字質問を含む央企++]
- 同時実行Agent数12を超える連携DAG
- AI精度要件がsliding windowで変動する長期推論
また、構成の変更は以下のように拡張可能であることも確認されました:
extensions:
fallback_policy:
on_timeout:
- switch_context_cache: lru_v2
- excerpt_chunking: word_boundary
on_memory_pressure:
- tensor_slicing: true
これにより、将来的に新しいモダールタスク(音声→3D点群など)を追加する際も、既存パターンとの構成再利用が可能になる見込みです。