AIエージェントを本番環境に導入する際、最も重要なのは「坏了怎么办」——つまりエラーが発生した时的対応です。HolySheep AI(今すぐ登録)のAPIを活用すれば、堅牢な錯誤恢復システムをシンプルに実装できます。この記事では、API工作经验がまったくない初心者でも理解できるレベルから、効果的な錯誤恢復メカニズムをゼロから構築する方法を解説します。
錯誤恢復とは?なぜ重要か
AIエージェントはネットワーク遅延、API制限、一時的なサーバー障害など、さまざまな要因で失敗する可能性があります。私の実践経験では、本番環境のAPI呼び出しの約5〜15%が一時的なエラーで失敗します。こうしたエラーに適切に対応できなければ、ユーザー体験が大きく損なわれます。
錯誤恢復メカニズムには主に3つの柱があります:
- リトライ(自動再試行):一時的な障害を一時的なものとして扱う
- ロールバック(状態恢复):前の安全な状態にシステムを戻す
- 人的介入(エスカレーション):解決不可能な問題を人間が対処する
HolySheep AI APIの基本設定
まず、HolySheep AIのAPIに接続するための基本設定を学びましょう。HolySheep AIは登録だけで無料クレジットを獲得でき、レートは¥1=$1(公式¥7.3=$1の85%節約)で、レイテンシは<50msという高速応答が特徴です。
import requests
import time
import json
from datetime import datetime
class HolySheepAgent:
"""HolySheep AI API用于Agent錯誤恢復演示"""
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.max_retries = 3
self.retry_delay = 1.0 # 秒
def chat_completion(self, messages, model="gpt-4o"):
"""
HolySheep AI API呼び出しの基本メソッド
エラー時の自動リトライ機能を搭載
"""
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": messages,
"temperature": 0.7
}
for attempt in range(self.max_retries):
try:
response = requests.post(
f"{self.base_url}/chat/completions",
headers=headers,
json=payload,
timeout=30
)
# HTTPステータスコードで成功を判定
if response.status_code == 200:
return response.json()
elif response.status_code == 429:
# レート制限 — 指数バックオフでリトライ
wait_time = self.retry_delay * (2 ** attempt)
print(f"レート制限発生。{wait_time}秒後にリトライ...")
time.sleep(wait_time)
elif response.status_code >= 500:
# サーバーエラー — 短暂待機後にリトライ
wait_time = self.retry_delay * (attempt + 1)
print(f"サーバーエラー({response.status_code})。{wait_time}秒後にリトライ...")
time.sleep(wait_time)
else:
# クライアントエラー — リトライしても解決しない
raise Exception(f"APIエラー: {response.status_code} - {response.text}")
except requests.exceptions.Timeout:
print(f"タイムアウト発生。{self.retry_delay}秒後にリトライ...")
time.sleep(self.retry_delay)
except requests.exceptions.ConnectionError as e:
print(f"接続エラー: {e}。リトライ中...")
time.sleep(self.retry_delay)
raise Exception(f"{max_retries}回のリトライ後も失敗しました")
使用例
agent = HolySheepAgent("YOUR_HOLYSHEEP_API_KEY")
💡 スクリーンショットヒント:HolySheep AIダッシュボードの「API Keys」セクションで、新しいAPIキーを生成できます。キーは安全に保管し、ソースコードに直接記述しないようにしましょう。
指数バックオフによる高度なリトライ戦略
基本的なリトライをさらに強化するのが「指数バックオフ」です。リトライ間隔を指数関数的に増加させることで、サーバーへの負荷を軽減しながら確実に処理が完了するまで待機します。
import random
from functools import wraps
from typing import Callable, Any
class AdvancedRetryStrategy:
"""
高度なリトライ戦略
- 指数バックオフ
- ジッター(ランダム待機)
- リトライ回数上限
- 特定のエラー種別の判定
"""
def __init__(
self,
max_retries: int = 5,
base_delay: float = 1.0,
max_delay: float = 60.0,
exponential_base: float = 2.0,
jitter: bool = True
):
self.max_retries = max_retries
self.base_delay = base_delay
self.max_delay = max_delay
self.exponential_base = exponential_base
self.jitter = jitter
def calculate_delay(self, attempt: int) -> float:
"""リトライ間隔を計算"""
delay = min(
self.base_delay * (self.exponential_base ** attempt),
self.max_delay
)
# ジッターを追加して同時リクエスト衝突を回避
if self.jitter:
delay = delay * (0.5 + random.random() * 0.5)
return delay
def execute_with_retry(
self,
func: Callable,
*args,
**kwargs
) -> Any:
"""
リトライロジックを包裹
func: 実行する関数
"""
last_exception = None
for attempt in range(self.max_retries + 1):
try:
result = func(*args, **kwargs)
# 結果の妥当性をチェック
if self._is_valid_result(result):
if attempt > 0:
print(f"✅ {attempt}回目のリトライで成功")
return result
else:
raise ValueError("無効な結果 received")
except (ConnectionError, TimeoutError, requests.exceptions.Timeout) as e:
last_exception = e
if attempt < self.max_retries:
delay = self.calculate_delay(attempt)
print(f"⚠️ エラー: {type(e).__name__} - {delay:.2f}秒後にリトライ({attempt + 1}/{self.max_retries})")
time.sleep(delay)
except ValueError as e:
# ビジネスロジックエラー — 即座に失敗
raise e
except Exception as e:
# 未知のエラー — リトライの価値あり
last_exception = e
if attempt < self.max_retries:
delay = self.calculate_delay(attempt)
print(f"⚠️ 予期しないエラー: {e} - {delay:.2f}秒後にリトライ")
time.sleep(delay)
raise last_exception or Exception("リトライ上限に達しました")
def _is_valid_result(self, result: Any) -> bool:
"""結果が有効か判定"""
if result is None:
return False
if isinstance(result, dict):
return "error" not in result
return True
def retry_on_failure(max_retries=3, delay=1.0):
"""デコレータ版本のリトライ"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
strategy = AdvancedRetryStrategy(
max_retries=max_retries,
base_delay=delay
)
return strategy.execute_with_retry(func, *args, **kwargs)
return wrapper
return decorator
使用例
@retry_on_failure(max_retries=5, delay=0.5)
def call_holysheep_api(messages):
"""API呼び出しの例"""
response = requests.post(
"https://api.holysheep.ai/v1/chat/completions",
headers={
"Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "gpt-4o",
"messages": messages
},
timeout=30
)
return response.json()
呼び出し
result = call_holysheep_api([
{"role": "user", "content": "你好世界"}
])
print(result)
ロールバック机制:状态恢复の実装
リトライで解决できない場合、システムを 이전 상태(ロールバック)に戻す必要があります。特にマルチステップの処理では、各ステップの状態を保存しておき、失敗時に巻き戻す能力が重要です。
import copy
from enum import Enum
from typing import List, Optional, Any
from dataclasses import dataclass, field
from datetime import datetime
class CheckpointStatus(Enum):
"""チェックポイントの状態"""
COMPLETED = "completed"
FAILED = "failed"
ROLLING_BACK = "rolling_back"
@dataclass
class Checkpoint:
"""処理の状態保存用チェックポイント"""
step_id: int
step_name: str
state_before: Any
state_after: Optional[Any] = None
status: CheckpointStatus = CheckpointStatus.COMPLETED
timestamp: datetime = field(default_factory=datetime.now)
class StateManager:
"""
状態管理とロールバックを行うクラス
エージェントの各ステップの状態を保存・恢复
"""
def __init__(self):
self.checkpoints: List[Checkpoint] = []
self.current_state: dict = {}
def save_checkpoint(
self,
step_id: int,
step_name: str,
state_before: dict
) -> Checkpoint:
"""チェックポイントを保存"""
checkpoint = Checkpoint(
step_id=step_id,
step_name=step_name,
state_before=copy.deepcopy(state_before)
)
self.checkpoints.append(checkpoint)
print(f"📍 チェックポイント保存: Step {step_id} - {step_name}")
return checkpoint
def update_state(self, new_state: dict):
"""現在の状態を更新"""
self.current_state = copy.deepcopy(new_state)
def mark_step_failed(self, step_id: int):
"""ステップを失敗としてマーク"""
for cp in reversed(self.checkpoints):
if cp.step_id == step_id:
cp.status = CheckpointStatus.FAILED
break
def rollback_to(self, step_id: int) -> dict:
"""
指定ステップまでロールバック
step_id: このステップまで戻る(このステップの状態を恢复)
"""
# 対象チェックポイントを探す
target_checkpoint = None
for cp in self.checkpoints:
if cp.step_id == step_id:
target_checkpoint = cp
break
if not target_checkpoint:
raise ValueError(f"チェックポイント Step {step_id} が見つかりません")
print(f"🔄 ロールバック中: Step {step_id} - {target_checkpoint.step_name}")
# 後続のチェックポイントを削除
self.checkpoints = [
cp for cp in self.checkpoints
if cp.step_id <= step_id
]
# 対象チェックポイントの状態を恢复
self.current_state = copy.deepcopy(target_checkpoint.state_before)
# 対象チェックポイントより前は完了としてマーク
for cp in self.checkpoints:
if cp.step_id < step_id:
cp.status = CheckpointStatus.COMPLETED
elif cp.step_id == step_id:
cp.status = CheckpointStatus.ROLLING_BACK
return self.current_state
def full_rollback(self) -> dict:
"""最初の状態まで完全にロールバック"""
if not self.checkpoints:
return self.current_state
first_checkpoint = self.checkpoints[0]
print(f"🔄 完全ロールバック: {first_checkpoint.step_name}まで")
self.checkpoints = []
self.current_state = copy.deepcopy(first_checkpoint.state_before)
return self.current_state
class ResilientAgent:
"""
错误恢復機能付きのAIエージェント
リトライ・ロールバック・人的介入を統合
"""
def __init__(self, api_key: str):
self.state_manager = StateManager()
self.api_key = api_key
self.requires_human_intervention = False
self.intervention_request = None
def execute_with_recovery(
self,
steps: List[dict],
max_retries_per_step: int = 3
):
"""
恢复机制付きで処理を実行
steps: 各ステップの定義リスト
例: [{"id": 1, "name": "データ取得", "action": func}, ...]
"""
initial_state = copy.deepcopy(self.current_state if hasattr(self, 'current_state') else {})
self.state_manager.save_checkpoint(0, "初期状態", initial_state)
for step in steps:
step_id = step["id"]
step_name = step["name"]
action = step["action"]
# 現在の状態を保存
self.state_manager.save_checkpoint(
step_id,
step_name,
self.state_manager.current_state
)
# ステップを実行(リトライ付き)
try:
result = self._execute_step_with_retry(
action,
max_retries_per_step
)
# 状態を更新
self.state_manager.update_state(result)
print(f"✅ Step {step_id} 完了: {step_name}")
except MaxRetriesExceededError as e:
print(f"❌ Step {step_id} 失敗: {step_name}")
self.state_manager.mark_step_failed(step_id)
# ロールバックを実行
rollback_state = self.state_manager.rollback_to(step_id - 1)
print(f"↩️ Step {step_id - 1} までロールバック完了")
# 人的介入を要求
self._request_human_intervention(
step_id,
step_name,
str(e)
)
return
except CriticalError as e:
# 致命的なエラー — 完全ロールバック
print(f"🚨 致命的なエラー: 完全ロールバックを実行")
final_state = self.state_manager.full_rollback()
self._request_human_intervention(
step_id,
step_name,
str(e),
critical=True
)
return
print("🎉 全ステップ正常完了")
return self.state_manager.current_state
def _execute_step_with_retry(self, action, max_retries):
"""リトライ付きでステップを実行"""
last_error = None
for attempt in range(max_retries):
try:
return action(self.state_manager.current_state)
except RetryableError as e:
last_error = e
wait_time = 2 ** attempt
print(f" リトライ {attempt + 1}/{max_retries}: {wait_time}秒待機")
time.sleep(wait_time)
raise MaxRetriesExceededError(f"リトライ上限超過: {last_error}")
def _request_human_intervention(
self,
step_id: int,
step_name: str,
error_message: str,
critical: bool = False
):
"""人的介入を要求和"""
self.requires_human_intervention = True
self.intervention_request = {
"step_id": step_id,
"step_name": step_name,
"error": error_message,
"critical": critical,
"current_state": self.state_manager.current_state,
"timestamp": datetime.now().isoformat()
}
# 介入要求をログ/通知システムに送信
self._notify_human(
f"⚠️ 人的介入が必要です\n"
f"ステップ: {step_name} (ID: {step_id})\n"
f"エラー: {error_message}\n"
f"重要度: {'🔴 致命的' if critical else '🟡 高'}\n"
f"時刻: {self.intervention_request['timestamp']}"
)
def _notify_human(self, message: str):
"""人間に通知(實際にはメール/Slack/PagerDuty等)"""
# 例: Slack通知, メール送信, オペレーターシステムへの送信
print(f"\n{'='*50}")
print(message)
print(f"{'='*50}\n")
カスタムエラー类型
class RetryableError(Exception):
"""リトライ可能なエラー"""
pass
class MaxRetriesExceededError(Exception):
"""リトライ上限超過"""
pass
class CriticalError(Exception):
"""致命的エラー"""
pass
💡 スクリーンショットヒント:HolySheep AIダッシュボードの「Usage」セクションで、API呼び出しの履歴とレイテンシを確認できます。異常なパターンがないか定期的にチェックしましょう。
人的介入机制:何时如何 Escalate
すべてのエラーを自動化で解决できるわけではありません。特定のケースでは、人間による判断が必要です。HolySheep AIの<50msレイテンシを活かしつつ、適切なタイミングで人的介入を要求する設計を学びましょう。
from enum import Enum
from typing import Dict, List, Optional
from dataclasses import dataclass
import threading
import queue
class InterventionLevel(Enum):
"""介入レベルの定義"""
INFO = "info" # 情報共有のみ
WARNING = "warning" # 注意が必要
URGENT = "urgent" # 早急に対処が必要
CRITICAL = "critical" # 即座に人が対応必须
@dataclass
class InterventionTicket:
"""介入チケット"""
ticket_id: str
agent_id: str
error_context: Dict
level: InterventionLevel
suggested_actions: List[str]
created_at: str
status: str = "pending"
assigned_to: Optional[str] = None
resolution: Optional[str] = None
class HumanInterventionManager:
"""
人的介入管理系统
エスカレーションの自動化とチケット管理
"""
def __init__(self, notification_callback=None):
self.tickets: List[InterventionTicket] = []
self.ticket_counter = 0
self.notification_callback = notification_callback
self.escalation_rules = self._init_escalation_rules()
def _init_escalation_rules(self) -> Dict:
"""エスカレーション規則を定義"""
return {
# エラー类型: (介入レベル, リトライ回数閾値, 放置時間閾値[秒])
"authentication_error": (InterventionLevel.CRITICAL, 1, 60),
"rate_limit_exceeded": (InterventionLevel.WARNING, 5, 300),
"invalid_response": (InterventionLevel.URGENT, 3, 180),
"timeout": (InterventionLevel.INFO, 10, 600),
"data_corruption": (InterventionLevel.CRITICAL, 0, 30),
"content_filter_triggered": (InterventionLevel.WARNING, 2, 120),
}
def should_escalate(
self,
error_type: str,
retry_count: int,
error_message: str
) -> tuple:
"""
介入が必要か判定
返回: (should_escalate: bool, level: InterventionLevel, reason: str)
"""
rule = self.escalation_rules.get(error_type)
if rule is None:
# 不明なエラー类型 — 默认でWARNING
return True, InterventionLevel.WARNING, f"未知のエラー类型: {error_type}"
level, retry_threshold, _ = rule
if retry_count >= retry_threshold:
return True, level, f"リトライ回数 {retry_count} が閾値 {retry_threshold} を超過"
# 内容ベースの判定
if self._requires_immediate_intervention(error_message):
return True, InterventionLevel.CRITICAL, "重大な内容が検出されました"
return False, level, ""
def _requires_immediate_intervention(self, message: str) -> bool:
"""即時介入が必要か判定(内容ベース)"""
critical_patterns = [
"データ損失",
"システム停止",
"セキュリティ侵害",
"支払い関連",
"個人情 Bao露"
]
return any(pattern in message for pattern in critical_patterns)
def create_ticket(
self,
agent_id: str,
error_context: Dict,
level: InterventionLevel,
suggested_actions: List[str]
) -> InterventionTicket:
"""介入チケットを作成"""
self.ticket_counter += 1
ticket = InterventionTicket(
ticket_id=f"TICKET-{self.ticket_counter:06d}",
agent_id=agent_id,
error_context=error_context,
level=level,
suggested_actions=suggested_actions,
created_at=datetime.now().isoformat()
)
self.tickets.append(ticket)
# 通知を送信
if self.notification_callback:
self.notification_callback(ticket)
print(f"🎫 介入チケット作成: {ticket.ticket_id} [{(level.value).upper()}]")
return ticket
def resolve_ticket(self, ticket_id: str, resolution: str):
"""チケットを解決済みにマーク"""
for ticket in self.tickets:
if ticket.ticket_id == ticket_id:
ticket.status = "resolved"
ticket.resolution = resolution
print(f"✅ チケット解決: {ticket_id}")
break
def get_pending_tickets(self, level: Optional[InterventionLevel] = None) -> List[InterventionTicket]:
"""保留中のチケットを取得"""
pending = [t for t in self.tickets if t.status == "pending"]
if level:
pending = [t for t in pending if t.level == level]
return pending