ChatGPTのカスタム指示でエラー時のリトライ・タイムアウト規則を定義する
ChatGPTのカスタム指示というと、
あなたは○○の専門家です。
回答は簡潔にしてください。
のように、役割や回答スタイルを設定する使い方をまず思い浮かべます。
今回はそこではなく、
「長時間の処理やエラーが発生したとき、どう動いてほしいか」
をカスタム指示として定義してみました。
結論から言うと、自然言語の指示でも、
- いつ開始するのか
- 何回試すのか
- 何秒間隔なのか
- いつ諦めるのか
- 成功したらどうするのか
- 失敗したら何を報告するのか
まで明確にすると、かなり「仕様書」に近い形になります。
きっかけ
ChatGPTにファイル処理や複数ステップの作業を依頼すると、処理が長くなることがあります。
そのとき気になったのが、
今も処理しているのか?
止まっているのか?
エラーになったのか?
再試行しているのか?
いつまで続くのか?
という点でした。
まず、
長時間の処理が必要になるなら、
本格的な処理を始める前に知らせてほしい。
と考えました。
そして次に、
エラーになった場合の動きも先に決めておけばよいのでは?
と思いました。
最初は短く書けばよいと思った
最初に考えたのは、これくらいの指示です。
エラーが発生した場合は10秒間隔で3回リトライしてください。
35秒経過したら処理を中断してください。
意味はなんとなく伝わります。
しかし、仕様として読むと曖昧な部分があります。
例えば、
- 1回目のリトライはエラー直後なのか、10秒後なのか
- 35秒はいつから数えるのか
- リトライするたびに35秒がリセットされるのか
- 3回目が失敗した後はどうするのか
- 35秒になったら4回目を実行するのか
- 途中で正常復旧した場合はどうするのか
などです。
プログラムの仕様なら、レビューで確認したくなる部分です。
そこで、自然言語の指示ももう少し明確にしてみました。
時系列を先に決める
エラー発生を0秒とします。
0秒 : Error
10秒 : Retry 1
20秒 : Retry 2
30秒 : Retry 3
35秒 : Abort
図にすると単純です。
Error
│
├── 10秒 ── Retry 1
│
├── 20秒 ── Retry 2
│
├── 30秒 ── Retry 3
│
└── 35秒 ── Abort
途中で正常に戻った場合は、その時点でリトライを終了し、通常処理へ戻します。
3回目が失敗しても、4回目は行いません。
これで、
最大3回
と、
エラー発生から全体で35秒
を別々の条件として扱えます。
私が実際に設定しているカスタム指示
以下が、現在私が実際にChatGPTのカスタム指示へ設定している内容です。
なお、35秒を含む数値は技術的な推奨値ではありません。私自身の利用感覚を基準に決めています。
# 長時間処理・エラー発生時の動作ルール
## 1. 長時間の処理・思考が必要な場合
* 回答の作成に長時間の思考、複数の処理、複数回のツール実行などが必要になると判断した場合は、処理を本格的に開始する前に、その旨をユーザーへ短く知らせてください。
* 通知では、これから何を行うかを簡潔に説明してください。
* 「待ってください」「○分かかります」など、待機を要求したり完了時間を約束したりする表現は使用しないでください。
* 長時間の処理中は、必要に応じて途中経過や判明した内容を簡潔に知らせてください。
## 2. 生成処理・ツール実行中にエラーが発生した場合
エラーが発生した時点を `0秒` として、復旧処理全体の制限時間を **35秒** とします。
### リトライ条件
* リトライ回数の上限:**3回**
* リトライ間隔:**10秒**
* 実行タイミング:
* エラー発生から10秒後:リトライ1回目
* エラー発生から20秒後:リトライ2回目
* エラー発生から30秒後:リトライ3回目
* 各リトライで正常に復旧した場合は、その時点でリトライ処理を終了し、通常の処理を続行してください。
* 3回目のリトライ後に失敗しても、4回目以降のリトライは行わないでください。
## 3. 35秒の最終期限
* エラー発生から **35秒以内** に正常状態へ復旧しなかった場合は、それ以上の処理・思考・リトライを中断してください。
* 中断時は、ユーザーに以下を簡潔に知らせてください。
* エラーが発生したこと
* 実施したリトライ回数
* 判明しているエラー内容
* 完了できなかった処理内容
* 推測で成功したことにしたり、正常終了したように回答したりしないでください。
## 4. 優先順位
エラー発生時は、以下の条件を同時に適用してください。
1. リトライは最大3回まで
2. リトライ間隔は10秒
3. エラー発生から35秒を全体の最終期限とする
4. 正常復旧した時点で即座に通常処理へ戻る
5. 35秒経過時点で正常でなければ処理を中断してエラーを報告する
なぜ35秒なのか
ここは重要なので明記しておきます。
35秒という値に技術的な根拠はありません。
ChatGPTの性能測定から算出したものでもありません。
ネットワークのタイムアウト値を参考にしたわけでもありません。
単純に、
「自分が待てる時間」
として決めました。
感覚としては、
これ以上何も分からない状態で待つくらいなら、一度失敗したと知らせてほしい。
というだけです。
したがって、この記事で35秒を推奨する意図はありません。
20秒でも60秒でも、自分が快適に使える時間を決めればよいと思います。
日本語の指示でも「仕様」として書く
今回面白かったのは、書いているものがプログラムではないことです。
JavaScriptでもC#でもありません。
普通の日本語です。
それでも、
エラー発生 = 0秒
10秒 = Retry 1
20秒 = Retry 2
30秒 = Retry 3
35秒 = Abort
と整理すると、かなり仕様らしくなります。
さらに、
- 正常復旧したらどうする
- 最大何回まで試す
- 上限到達後は何をしない
- 最終的に失敗したら何を報告する
まで書いています。
これは普段のシステム設計とかなり似ています。
自然言語だから曖昧でよいのではなく、
自然言語だからこそ、曖昧になりそうな部分を先に潰しておく。
という考え方です。
境界条件まで書く
特に気を付けたのが境界条件です。
今回なら、
30秒:3回目のリトライ
35秒:最終期限
です。
では、35秒になったらどうするのか。
ここを書かなければ、
35秒になったから、もう1回試す?
という解釈もできてしまいます。
そこで、
3回目のリトライ後に失敗しても、
4回目以降のリトライは行わない。
と明示しました。
プログラムでも、
< なのか
<= なのか
で結果が変わります。
自然言語の指示でも、
境界値の前後で何をするか
まで書いておくと解釈しやすくなります。
カスタム指示はタイマーAPIではない
ひとつ注意があります。
今回の、
10秒
20秒
30秒
35秒
という指定は、プログラム上のリアルタイムタイマーを実装したものではありません。
例えばJavaScriptの、
setTimeout(...)
のような仕組みとは違います。
今回設定しているのは、
「エラーが起きた場合、このように振る舞ってほしい」
という運用上の指示です。
そのため、
必ず10.000秒後に再実行される
といった厳密なリアルタイム制御を期待するものではありません。
自分としては、タイマー機能を実装したというより、
障害発生時の簡易Runbookを自然言語で渡している
という感覚に近いです。
カスタム指示を「性格設定」以外にも使う
カスタム指示を調べると、
あなたは○○です
私は○○の仕事をしています
簡潔に回答してください
といった使い方をよく見かけます。
今回は、
長時間になったらどうするか
エラーになったらどうするか
何回試すか
どこで諦めるか
失敗時に何を報告するか
まで指定してみました。
つまり、
「ChatGPTをどんな人格にするか」ではなく、「ChatGPTをどう運用したいか」を書いてみた
ということになります。
まとめ
今回、ChatGPTのカスタム指示に、
- 長時間処理時の事前通知
- エラー発生時のリトライ
- リトライ回数の上限
- リトライ間隔
- 全体の最終期限
- 異常終了時の報告内容
を定義しました。
やっていること自体は難しくありません。
重要だったのは、
「いつ」「何回」「どこまで」「成功したら」「失敗したら」を曖昧にしないこと
でした。
これはAI特有のテクニックというより、普段のシステム設計とよく似ています。
プログラムソースではなく、日本語で書く指示だからこそ、仕様として読み取れる形にしておく。
カスタム指示を「性格設定」だけではなく、自分専用の小さな運用ルールとして使うのも面白そうです。😺
関連リンク
生成AIやWeb技術を使った実験・検証を Neko3SE LAB で公開しています。