Share
Embed
Transcript
28 slides
-
自己紹介 名前 uho-wq 所属 株式会社エブリー デリッシュキッチン開発部 プレミアム機能開発チーム Copyright © 2015
every, Inc. All rights reserved. 2 -
エブリーが提供しているプロダクト、ソリューション一覧 エブリーではマルチプロダクトを展開し、あらゆる暮らしの最適化に向き合っています 「熱狂を、仕掛ける。世の中 「インフルエンサーと熱狂を共 を、揺さぶる。」 SNS・動画の 創する」SNS・動画のプロフェッ プロフェッショナルチーム ショナルチーム WEB
Copyright © 2015 every, Inc. All rights reserved. 3 -
アジェンダ 1. デリッシュ AI 2. Goのイテレータ とエージェントループ 3. iter.Seq2[T, error]
4. エラー時の振る舞い Copyright © 2015 every, Inc. All rights reserved. 4 -
デリッシュ AI google/adk-go を使用してすべて Go で実装 Copyright © 2015 every,
Inc. All rights reserved. 6 -
背景 run <run_id>: context deadline exceeded Copyright © 2015 every,
Inc. All rights reserved. 7 -
背景 run <run_id>: context deadline exceeded AI Agentのタイムアウト設定 通常のリクエスト 60秒
平均 3秒 Copyright © 2015 every, Inc. All rights reserved. 8 -
背景 Client-side Server-side ADK-Go デリッシュ AI tool レシピ検索 A2UI Client
end-user Copyright © 2015 every, Inc. All rights reserved. Agent HTTP + SSE 画像認識 UI生成 9 -
背景 Client-side Server-side ADK-Go デリッシュ AI tool レシピ検索 A2UI Client
end-user Copyright © 2015 every, Inc. All rights reserved. Agent HTTP + SSE 不正な引数で 無限ループ 画像認識 UI生成 10 -
背景 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 -
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 -
Goのイテレータ yield に値を渡して呼ぶことで、for range のループ本体に値を 1 つずつ渡す // ループ側は break
したらfalseが返る // 0 item-0, 1 item-1, 2 item-2 Copyright © 2015 every, Inc. All rights reserved. 14 -
adk-go のツール呼び出しのまとめ 間違った引数でツールを呼ぶ バリデーションエラー返却 LLMが不適切な引数(パラメータ)を渡し てツール呼び出しを発行 {"error": ...} 同じ引数で再実行 仕様上ループ継続
→ 60秒まで繰り返す ツール呼び出しの失敗時も、仕様上エー ジェントの処理ループはそのまま継続され る 修正されずに同じツール呼び出しをリトライ イベントとして返される エラーをイベントで返せば、Agent が自己修復できるので理にかなってはいる Copyright © 2015 every, Inc. All rights reserved. 17 -
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 -
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 -
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 -
プロポーザル時点では value-error が提案されていた • 通常は key-value, index-value, or value-error のペアを表す、との記載もある
https://github.com/golang/go/issues/61897 Copyright © 2015 every, Inc. All rights reserved. 22 -
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 -
golang/pkgsite など非公開ツールでは使用されている API のページネーションや I/O の逐次読み込みで使用されている どれもエラーを yieldしてreturn することでループを打ち切る仕様 Copyright
© 2015 every, Inc. All rights reserved. 25 -
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 -
まとめ • タイムアウトの原因はツールの error が、iter.Seq2[T, error] の error ではなくイベントとして届い ていたこと
• iter.Seq2[T, error] に決まった使い方はない。 ◦ error を流すか、そのあとも続けるかはイテレータ次第 • ただしループを止めるかどうかは、呼び出し側が決められる • iter.Seq2[T, error]に出会ったら、 error がどこに流れ、そのあとも継続するかを確かめる テックブログはこちら → Copyright © 2015 every, Inc. All rights reserved. 27