0Pricing
AI Agents · 강의

도구 오류 감지 및 복구

도구에서 500 오류가 발생하면 충돌시키는 대신 오류를 모델에 반환하여 다른 방법을 시도하게 해보세요.

도구 오류 감지 및 복구은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.

도구는 실패합니다. 이에 대비하십시오.

실제 환경의 모든 도구는 때때로 실패합니다:

  • 네트워크 시간 초과
  • 호출률 제한
  • 모델이 전달한 잘못된 인수
  • 외부 서비스 중단
  • 유효하지 않은 인증

프로덕션 에이전트는 이러한 상황에서 안정적으로 복구해야 합니다.

항상 반환하고, 예외를 발생시키지 마십시오

에이전트 반복 과정 안에서 모든 도구 오류를 포착하고 콘텐츠로 반환하십시오. 예외로 인해 반복 과정이 중단되도록 해서는 안 됩니다:

def safe_dispatch(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
        return TOOLS[tool_call.function.name](**args)
    except json.JSONDecodeError:
        return {'error': 'Arguments are not valid JSON.'}
    except KeyError:
        return {'error': f'Unknown tool: {tool_call.function.name}'}
    except Exception as e:
        return {'error': f'{type(e).__name__}: {e}'}

구조화된 오류 형식

모델이 오류를 인식할 수 있도록 일관된 형식을 사용하십시오:

error = {'ok': False, 'error_type': 'TimeoutError', 'error_message': 'Tavily timed out after 10s', 'retryable': True}
print(error)

재시도 가능한 오류와 영구 오류 구분

일부 오류는 재시도할 가치가 있지만(시간 초과), 다른 오류는 그렇지 않습니다(404). 모델에 다음과 같이 알려주십시오:

if isinstance(e, requests.Timeout):
    return {'ok': False, 'retryable': True, 'error': str(e)}
if isinstance(e, ValueError):
    return {'ok': False, 'retryable': False, 'error': str(e)}

일시적 오류 자동 재시도

네트워크 호출에는 지수 백오프를 사용하여 재시도하십시오:

from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type

@retry(
    wait=wait_exponential(multiplier=1, max=10),
    stop=stop_after_attempt(3),
    retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def web_search(query):
    return requests.get('https://api.tavily.com/search', ...).json()

인수 검증

도구를 호출하기 전에 Pydantic 모델로 인수를 검증하십시오:

from pydantic import BaseModel, ValidationError

class SearchArgs(BaseModel):
    query: str
    k: int = 5

try:
    args = SearchArgs.model_validate_json(tool_call.function.arguments)
except ValidationError as e:
    return {'error': f'Bad arguments: {e}'}

모델에 오류 보여주기

오류를 도구 결과로 append하고 모델을 다시 호출하십시오. 모델이 스스로 수정하는 경우가 많습니다:

messages.append({
    'role': 'tool',
    'tool_call_id': tc.id,
    'content': json.dumps({'error': 'Argument k must be an integer'})
})
# Next model call: 'Sorry, let me retry with k=5...'

무한 오류 반복 방지

일부 모델은 오류를 보여주면 같은 잘못된 호출을 다시 시도합니다. 반복 횟수에 상한을 설정하고 반복을 감지하십시오:

recent_calls = []
for tc in msg.tool_calls:
    key = (tc.function.name, tc.function.arguments)
    if recent_calls.count(key) >= 3:
        return 'Agent stuck in retry loop, aborting.'
    recent_calls.append(key)

도구별 복구

잘 실패하는 것으로 알려진 도구의 경우, 반복문이 아니라 도구 내부에 재시도 로직을 구현하십시오:

def search_with_fallback(query):
    try:
        return tavily_search(query)
    except Exception:
        return bing_search(query)   # secondary provider

모든 호출에 시간 제한 설정

모든 외부 호출에는 시간 제한이 필요합니다. 그렇지 않으면 느린 서비스 하나 때문에 에이전트 전체가 멈춥니다:

import requests
response = requests.get(url, timeout=10)  # 10s

# For LLM calls:
from openai import OpenAI
client = OpenAI(timeout=30.0)

서킷 브레이커

도구가 반복해서 실패하면 회로를 "열고", 일정 시간 동안 해당 도구를 건너뛰십시오:

import time

class CircuitOpen(Exception):
    pass

def circuit(failure_threshold=5, recovery_timeout=60):
    def decorator(func):
        state = {'failures': 0, 'open_until': 0}
        def wrapper(*args, **kwargs):
            if time.time() < state['open_until']:
                raise CircuitOpen('circuit is open')
            try:
                result = func(*args, **kwargs)
                state['failures'] = 0
                return result
            except Exception:
                state['failures'] += 1
                if state['failures'] >= failure_threshold:
                    state['open_until'] = time.time() + recovery_timeout
                raise
        return wrapper
    return decorator

@circuit(failure_threshold=3, recovery_timeout=1)
def fragile_tool(x):
    if x < 0:
        raise ValueError('bad input')
    return x * 2

for x in [1, -1, -1, -1, -1]:
    try:
        print('ok', fragile_tool(x))
    except CircuitOpen as e:
        print('blocked:', e)
    except ValueError as e:
        print('failed:', e)

맥락을 포함한 오류 로깅

나중에 문제를 디버깅할 수 있을 만큼 기록하십시오. 도구 이름, 인수, 오류 유형, 스택 추적, 요청 ID, 사용자 ID, 추적 ID가 필요합니다. 관측 도구로 전송하십시오.

우아한 성능 저하

중요한 도구를 사용할 수 없을 때는 에이전트가 성공한 것처럼 가장하지 말고 사용자에게 솔직하게 알리십시오:

if all_search_tools_failed:
    return 'I was unable to search the web right now. Please try again in a few minutes.'

도구 오류 처리 패턴

에이전트 반복문 내부에서 도구 예외를 처리하는 가장 안전한 방법은 무엇입니까?

요약

도구는 실패합니다. 오류를 포착하고, 분류하고, 콘텐츠 형태로 구조화하여 에이전트가 복구하도록 하십시오. 운영 환경의 안정성을 위해 시간 제한, 재시도, 서킷 브레이커를 추가하십시오.

자주 묻는 질문

“도구 오류 감지 및 복구” 강의는 무료인가요?

네 — “도구 오류 감지 및 복구” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.

“도구 오류 감지 및 복구”에서 뭘 배우나요?

도구에서 500 오류가 발생하면 충돌시키는 대신 오류를 모델에 반환하여 다른 방법을 시도하게 해보세요. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Agents을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“도구 오류 감지 및 복구” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ReAct: 추론 + 행동 패턴
  2. 처음부터 ReAct 구현
  3. 일반적인 도구 세트(웹, 계산기, RAG)
  4. 도구 오류 감지 및 복구
← AI Agents(으)로 돌아가기