Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【登壇資料】AI Agentタイムアウトから Goイテレータを俯瞰する

Avatar for エブリー エブリー
September 29, 2026
16

【登壇資料】AI Agentタイムアウトから Goイテレータを俯瞰する

2026/09/30 GoBash vol.3

Avatar for エブリー

エブリー

September 29, 2026

More Decks by エブリー

Transcript

  1. アジェンダ 1. デリッシュ AI 2. Goのイテレータ とエージェントループ 3. iter.Seq2[T, error]

    4. エラー時の振る舞い Copyright © 2015 every, Inc. All rights reserved. 4
  2. 背景 Client-side Server-side ADK-Go デリッシュ AI tool レシピ検索 A2UI Client

    end-user Copyright © 2015 every, Inc. All rights reserved. Agent HTTP + SSE 画像認識 UI生成 9
  3. 背景 Client-side Server-side ADK-Go デリッシュ AI tool レシピ検索 A2UI Client

    end-user Copyright © 2015 every, Inc. All rights reserved. Agent HTTP + SSE 不正な引数で 無限ループ 画像認識 UI生成 10
  4. 背景 Client-side Server-side ADK-Go デリッシュ AI toolは毎回エラーを返していた tool レシピ検索 A2UI

    Client Agent HTTP ループが止まらないのはなぜ? + end-user SSE Copyright © 2015 every, Inc. All rights reserved. 不正な引数で 無限ループ 画像認識 UI生成 11
  5. Goのイテレータ Go 1.23 から、for range に関数を渡せるようになった • func(func() bool) •

    func(func(V) bool) • func(func(K, V) bool) Copyright © 2015 every, Inc. All rights reserved. 13
  6. Goのイテレータ yield に値を渡して呼ぶことで、for range のループ本体に値を 1 つずつ渡す // ループ側は break

    したらfalseが返る // 0 item-0, 1 item-1, 2 item-2 Copyright © 2015 every, Inc. All rights reserved. 14
  7. adk-go のツール呼び出しのまとめ 間違った引数でツールを呼ぶ バリデーションエラー返却 LLMが不適切な引数(パラメータ)を渡し てツール呼び出しを発行 {"error": ...} 同じ引数で再実行 仕様上ループ継続

    → 60秒まで繰り返す ツール呼び出しの失敗時も、仕様上エー ジェントの処理ループはそのまま継続され る 修正されずに同じツール呼び出しをリトライ イベントとして返される エラーをイベントで返せば、Agent が自己修復できるので理にかなってはいる Copyright © 2015 every, Inc. All rights reserved. 17
  8. iter.Seq2[T, error] • Goは error を値として扱うため言語仕様上は可能 ◦ iter.Seq2[T, error]にエラーハンドリングの慣習があるのか? •

    標準ライブラリ ◦ iter.Seq2[T, error]の公開APIは 0件 ◦ いずれも key-value, index-value形式 Copyright © 2015 every, Inc. All rights reserved. 19
  9. iter.Seq2[T, error] • Goは error を値として扱うため言語仕様上は可能 ◦ iter.Seq2[T, error]にエラーハンドリングの慣習があるのか? •

    標準ライブラリ ◦ iter.Seq2[T, error]の公開APIは 0件 ◦ いずれも key-value, index-value形式 Copyright © 2015 every, Inc. All rights reserved. 20
  10. iter.Seq2[T, error] • Goは error を値として扱うため言語仕様上は可能 ◦ iter.Seq2[T, error]にエラーハンドリングの慣習があるのか? •

    標準ライブラリ ◦ iter.Seq2[T, error]の公開APIは 0件 ◦ いずれも key-value, index-value形式 Copyright © 2015 every, Inc. All rights reserved. 21
  11. value-error は意図的に明記されていない commit fe36ce6 で意図的に削られたが、明確な理由は見つからなかった 議論 Seq2[K, error] は for

    k := range f と 1 変数で書けるのでエラーを捨てやすい (issuecomment-1671924099) go vetで静的解析を入れる or 2引数の yield を使う関数に対して range する際は必ず 2つの変数を受け取ることを 義務付ける (issuecomment-1675109993) .Err() 方式は呼び忘れが起きるので value-error を推す (issuecomment-1673186612) https://github.com/golang/go/commit/fe36ce669c1a452d2b0 Copyright © 2015 every, Inc. All rights reserved. 23
  12. adk-goではハンドリングが混在している • • • 打ち切る: エラー検出時に以降のイテレーション処理を行わず終了する error を流して続ける : 値(nil)とエラーを呼び出し元へ渡し、後続のイテレーションを続行する

    event と error を流して続ける : 発生したイベントデータとエラーを同時に伝播させながら継続する // TODO: check if we should stop iterator on the first error from stream or continue yielding next results. “ストリームで最初のエラーが発生した際に、イテレータを停止すべきか、それとも次の結果の生成を継続すべきかを確認する。 ” https://github.com/google/adk-go/blob/v2.1.0/internal/llminternal/base_flow.go#L805 error を受け取ったあとに次の要素が来るかどうかは、イテレータ次第 Copyright © 2015 every, Inc. All rights reserved. 26
  13. まとめ • タイムアウトの原因はツールの error が、iter.Seq2[T, error] の error ではなくイベントとして届い ていたこと

    • iter.Seq2[T, error] に決まった使い方はない。 ◦ error を流すか、そのあとも続けるかはイテレータ次第 • ただしループを止めるかどうかは、呼び出し側が決められる • iter.Seq2[T, error]に出会ったら、 error がどこに流れ、そのあとも継続するかを確かめる テックブログはこちら → Copyright © 2015 every, Inc. All rights reserved. 27