AI Engineering Academy · 강의

에이전트 실패와 무한 반복 처리

에이전트가 무한히 반복하거나 고장 난 도구를 계속 호출하지 않도록 시간 제한, 최대 반복 횟수, 오류 복구 프롬프트를 추가합니다.

레슨 4/413개 단계

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

에이전트가 실패하고 반복하는 이유

에이전트가 실패 반복에 빠지는 데에는 여러 이유가 있습니다. 고장 난 도구가 에이전트가 빠져나올 방법을 모르는 오류를 반환하거나, 모델이 잘못된 작업 구문을 계속 생성하거나, 사용 가능한 도구만으로는 해결할 수 없는 작업이 주어지거나, 다른 결과를 기대하며 에이전트가 약간씩 다른 인수로 같은 도구를 계속 호출하는 경우입니다. 안전장치가 없으면 API 예산만 소모되고 문제는 해결되지 않습니다.

최대 반복 횟수 제한

가장 간단한 보호 방법은 Thought/Action/Observation 주기의 횟수에 상한을 두는 것입니다. LangChain의 AgentExecutor는 max_iterations 매개변수를 받습니다. 제한에 도달하면 실행기가 반복을 중지하고 에이전트가 작업을 완료하지 못했다는 메시지를 반환합니다.

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=10,             # Hard stop after 10 steps
    max_execution_time=30.0,       # Also stop after 30 wall-clock seconds
    early_stopping_method='generate',  # Ask the model for a partial answer at the limit
    verbose=True
)

조기 중지: 최종 답변 강제하기

에이전트가 반복 횟수 제한에 도달하면 early_stopping_method='generate'가 다음과 같은 내용으로 모델에 마지막 한 번의 답변을 요청합니다. '단계 제한에 도달했습니다. 지금까지 알고 있는 내용을 바탕으로 최선의 최종 답변을 제시하십시오.' 이는 빈 응답을 반환하거나 오류로 종료하는 것보다 낫습니다. 사용자에게 유용한 내용을 제공할 수 있기 때문입니다.

# The 'generate' early_stopping_method adds this system instruction
# when max_iterations is reached:
#
# 'You have {N} steps remaining but the task is not complete.
#  Give your best final answer based on the information gathered so far.'
#
# Contrast with 'force' which abruptly terminates without generating an answer.

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=7,
    early_stopping_method='generate'
)

분석 오류를 우아하게 처리하기

모델이 Thought/Action 형식과 일치하지 않는 출력을 생성하면, 예를 들어 action 키워드가 없거나 잘못된 도구 이름을 사용하거나 일반 텍스트를 출력하면 에이전트가 OutputParserException을 발생시킵니다. handle_parsing_errors=True로 설정하면 오류를 관찰 결과로 다시 전달하여 모델이 스스로 수정하도록 할 수 있습니다.

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,
    # Custom error message fed back to the model:
    # handle_parsing_errors='Please format your response as Thought/Action/Action Input.'
)

# When a parse error occurs, the executor automatically adds:
# Observation: Could not parse LLM output. Please follow the format:
#   Thought: ...
#   Action: tool_name
#   Action Input: ...

반복적인 반복 감지 및 중단

일반적인 반복 패턴은 에이전트가 search('same query')를 연속으로 세 번 호출하고 매번 똑같이 쓸모없는 결과를 받는 경우입니다. 최근의 (도구, 입력) 쌍을 추적하여 반복 감지를 구현하십시오. 같은 조합이 두 번 넘게 반복되면 다른 접근 방식을 제안하는 관찰 결과를 삽입하십시오.

from collections import Counter

class LoopDetector:
    def __init__(self, max_repeats: int = 2):
        self.max_repeats = max_repeats
        self.call_counts = Counter()

    def check(self, tool_name: str, tool_input: str) -> bool:
        key = f'{tool_name}:{tool_input}'
        self.call_counts[key] += 1
        if self.call_counts[key] > self.max_repeats:
            return True  # Loop detected
        return False

    def get_warning(self) -> str:
        return ('You have called this tool with the same input multiple times. '
                'Try a different approach, different search terms, or a different tool.')

도구 수준의 오류 처리

견고한 에이전트에는 견고한 도구가 필요합니다. 모든 도구는 자체 예외를 포착하고 Python 예외를 발생시키는 대신 구조화된 오류 메시지를 반환해야 합니다. 오류 유형과 에이전트가 재시도할지, 접근 방식을 바꿀지, 상위 담당자에게 전달할지를 판단할 수 있도록 제안도 포함하십시오.

from langchain_core.tools import tool
import requests

@tool
def get_company_data(company_name: str) -> str:
    '''Retrieve company information from the business database.
    Input: company name as a string.
    '''
    try:
        resp = requests.get(
            f'https://api.example.com/companies/{company_name}',
            timeout=5
        )
        if resp.status_code == 404:
            return f'No company found with name "{company_name}". Try the exact legal name or ticker symbol.'
        if resp.status_code == 429:
            return 'Rate limit exceeded. Wait 60 seconds before trying again.'
        resp.raise_for_status()
        return resp.json().get('summary', 'No summary available.')
    except requests.Timeout:
        return 'The database is not responding. Try searching the web instead.'

API 실패 시 지수 백오프

도구가 외부 API를 호출할 때 일시적인 실패는 흔히 발생합니다. 도구 함수 내부에 지수 백오프를 적용한 재시도 로직을 추가하십시오. 시도 사이의 대기 시간을 늘려 가며 최대 3번까지 재시도하면 됩니다. 이렇게 하면 에이전트가 재시도에 대해 알 필요 없이 요청 제한과 짧은 장애를 투명하게 처리할 수 있습니다.

import time
import requests
from langchain_core.tools import tool

@tool
def reliable_search(query: str) -> str:
    '''Search with automatic retry on failure. Input: search query string.'''
    max_retries = 3
    for attempt in range(max_retries):
        try:
            resp = requests.get(
                'https://api.duckduckgo.com/',
                params={'q': query, 'format': 'json'},
                timeout=10
            )
            resp.raise_for_status()
            data = resp.json()
            return data.get('AbstractText', 'No results found.')
        except requests.RequestException as e:
            if attempt < max_retries - 1:
                wait = 2 ** attempt  # 1s, 2s, 4s
                time.sleep(wait)
            else:
                return f'Search failed after {max_retries} attempts: {str(e)}'

에이전트 수준의 시간 제한 예산

개별 도구의 재시도도 유용하지만, 전체 에이전트 실행에 대한 총 실제 경과 시간 제한도 필요합니다. 작업이 SLA에서 허용하는 시간(예: 30초)보다 오래 걸리면 반복을 중지하고 정상적인 성능 저하 응답을 반환하십시오. LangChain의 max_execution_time 매개변수가 실행기 수준에서 이를 처리합니다.

import asyncio

async def run_with_timeout(user_input: str, timeout_seconds: float = 30.0) -> str:
    try:
        result = await asyncio.wait_for(
            agent_executor.ainvoke({'input': user_input}),
            timeout=timeout_seconds
        )
        return result['output']
    except asyncio.TimeoutError:
        return ('I am taking longer than expected to answer this question. '
                'Please try again with a simpler question, or check back later.')

분석을 위한 실패 기록

모든 에이전트 실패는 데이터입니다. 사용자 입력, 모든 중간 단계, 실패 원인, 사용된 반복 횟수를 포함한 전체 추적 정보를 데이터베이스나 관찰 가능성 플랫폼에 기록하십시오. 실패 패턴을 분석하면 신뢰할 수 없는 도구, 에이전트가 처리하지 못하는 질문 유형, 가장 자주 발생하는 반복을 파악할 수 있습니다.

import logging
import json

logger = logging.getLogger('agent')

def run_and_log(user_input: str) -> str:
    try:
        result = agent_executor.invoke(
            {'input': user_input},
            return_intermediate_steps=True
        )
        if not result.get('output'):
            logger.warning('Agent returned empty output', extra={
                'input': user_input,
                'steps': len(result.get('intermediate_steps', []))
            })
        return result['output']
    except Exception as e:
        logger.error('Agent failed with exception', extra={
            'input': user_input,
            'error': str(e),
            'error_type': type(e).__name__
        })
        return 'I encountered an error. Please try rephrasing your question.'

프롬프트에 복구 힌트 삽입

실패 패턴을 감지하면 다음 에이전트 프롬프트에 복구 지침을 동적으로 삽입할 수 있습니다. 예를 들어 검색 도구가 계속 실패한다면 '웹 검색 도구가 현재 안정적으로 작동하지 않습니다. 이 질문에는 지식 기반 도구를 우선 사용하십시오.'와 같은 힌트를 추가하십시오. 이렇게 하면 하드 코딩된 대체 로직 없이도 에이전트가 작동하는 해결책을 향하도록 유도할 수 있습니다.

실패 시나리오 테스트

실패 시나리오를 위한 명시적인 테스트 모음을 구축하십시오. 모든 도구가 오류를 반환할 때, 모델이 max_iterations에 도달할 때, 입력에 답할 수 있는 질문이 없을 때, 모델이 존재하지 않는 도구를 호출할 때 어떤 일이 발생하는지 테스트하십시오. 상황이 아무리 적대적이어도 에이전트는 항상 합리적인 메시지를 반환해야 하며 애플리케이션이 중단되어서는 안 됩니다.

빠른 확인

에이전트 실패를 처리하고 반복을 방지하는 방법에 대한 이해도를 확인해 보십시오.

단원 요약

이 단원에서는 다음을 배웠습니다. max_iterations와 max_execution_time은 에이전트 실행 시간에 엄격한 제한을 설정합니다. handle_parsing_errors는 형식 오류를 모델에 다시 전달하여 스스로 수정하도록 합니다. 또한 도구는 예외를 발생시키는 대신 예외를 포착하고 설명적인 오류 문자열을 반환해야 합니다. 다음으로 구조화된 도구 통합을 위한 OpenAI의 기본 함수 호출 기능을 살펴보겠습니다.

무료로 시작

AI 튜터와 함께 Python을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“에이전트 실패와 무한 반복 처리” 강의는 무료인가요?

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

“에이전트 실패와 무한 반복 처리”에서 뭘 배우나요?

에이전트가 무한히 반복하거나 고장 난 도구를 계속 호출하지 않도록 시간 제한, 최대 반복 횟수, 오류 복구 프롬프트를 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“에이전트 실패와 무한 반복 처리” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. ReAct 프레임워크: 사고, 행동, 관찰
  2. 에이전트를 위한 도구 정의
  3. LangChain으로 ReAct 에이전트 구축하기
  4. 에이전트 실패와 무한 반복 처리
← AI Engineering Academy(으)로 돌아가기