Lindy Agent多モダールタスク連携の失敗率を62%削減した画期的なYAML構成管理手法

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.118.6↓45.4%
バッファ不足による切断19.36.2↓67.9%
リトライ過負荷15.77.4↓52.9%
コンテキスト整合性消費8.91.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`オプションが有効な場合、実行時に以下のプロセスが起動します:

  1. 各モダールタスクがLast-7daysのP95遅延とタスク完了率を上报
  2. 中央スケジューラがビジネスSLA目標(例:"視覚応答90% >/= 800ms")との差異を評価
  3. 既存のコンテキスト窓公积金額を再分配(例:視覚比率0.25→0.34)
  4. 変更を全ノードにgemini-basedメタ同期で伝播(sync delay < 180ms)

この自動調整は、以下のような負荷別タスク分布 pour chaque modalité を考慮します:

タスクタイプ視覚入力パターン推奨buffer_ratio
OCR画像前処理多言語+高解像度0.52
Medical Imaging QADICOM multi-plane 3D0.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点群など)を追加する際も、既存パターンとの構成再利用が可能になる見込みです。

タグ: Lindy multi-modal yaml-configuration dynamic-tuning adaptive-retry

5月24日 09:47 投稿