LLM 엔지니어링10장 · MCP 와 Prompt·Context Engineering11 / 22← 이전목차다음 →MetaContents

10장. MCP 와 Prompt·Context Engineering

실패의 종류

자동차 정비소는 고장을 종류별로 나눠 다르게 고칩니다. 바람 빠진 타이어는 바람만 넣으면 되고, 엔진 고장은 정비사가 봐야 합니다. LLM 서비스의 실패도 종류에 따라 다시 하면 되는 것, 고쳐서 다시 묻는 것, 사람에게 넘길 것으로 나뉩니다.

일시적 오류, 잘못된 출력, 도구의 업무 오류, 거짓 보고의 네 가지 실패를 카드로 놓은 그림

네 카드가 이 장에서 다루는 실패입니다. 일시적 오류(연결 끊김, Ollama 의 일시 오류)는 다시 하면 되고, 잘못된 출력(JSON 이 아님, 목록 밖의 값)은 까닭을 붙여 다시 묻고, 도구의 업무 오류(재고 모자람, 없는 품목)는 모델에게 알려 다른 길을 찾게 하고, 거짓 보고(하지 않은 예약을 했다고 말함)는 상태를 직접 확인해 잡습니다. 여기서 바람 빠진 타이어가 일시적 오류입니다.

실패마다 할 일

실패알아보는 법할 일
일시적 오류예외, is_error, HTTP 500잠깐 기다렸다 다시(횟수 한도)
잘못된 출력json.loads 실패, 검증 실패까닭을 붙여 다시 묻기
도구의 업무 오류{"오류": "재고가 모자랍니다"}모델에게 결과로 돌려줘 다른 길을 찾게
거짓 보고답의 말과 실제 상태가 다름상태(예약 목록)를 읽어 견주고, 다르면 바로잡기

다시 해도 되는 오류 가리기

Python
def retryable(error_text):
    """다시 하면 될 수 있는 오류인지 어림한다"""
    transient = ["timeout", "시간 초과", "연결", "Connection", "500", "일시적", "Error executing tool"]
    business = ["재고", "없습니다", "모자", "권한"]
    if any(w in error_text for w in business):
        return False            # 업무 오류는 다시 해도 같다
    return any(w in error_text for w in transient)

for e in ["Connection reset", "Error executing tool search_items", "물류 센터 의 T-202 재고는 6개라 10개를 예약할 수 없습니다"]:
    print(retryable(e), e)

연결 오류와 "Error executing tool"은 True(다시 해 볼 것), 재고가 모자란 업무 오류는 False(다시 해도 같음)입니다.

코드에 나오는 함수

코드쉬운 뜻
transient = [...]일시적 오류를 알리는 낱말 목록이다. transient 는 "잠깐 지나가는"이라는 뜻이다
business = [...]업무 오류를 알리는 낱말 목록이다. business 는 "업무"라는 뜻이다
any(w in error_text for w in business)목록의 낱말 가운데 하나라도 오류 글에 들어 있으면 True 다
return False업무 오류면 "다시 하지 말 것"으로 바로 답하고 함수를 끝낸다
return any(... transient)업무 오류가 아닐 때만 일시적 낱말이 있는지 보고 답한다

이 코드가 뜻하는 것

정비소 접수 창구로 읽어 봅니다. 접수 직원은 손님이 말한 증상에서 낱말을 듣고 분류합니다. "부품이 없다"는 말이 들리면 다시 시동을 걸어 봐도 소용없으니 바로 부품 주문으로 보냅니다. 그런 말이 없고 "잠깐 꺼졌다"는 말이 들리면 다시 시동을 걸어 보라고 합니다. 여기서 증상이 오류 글, "부품이 없다"류의 말이 business, "잠깐 꺼졌다"류의 말이 transient 입니다.

줄하는 일쉽게 말하면
if any(w in error_text for w in business):업무 낱말을 먼저 찾는다"부품이 없다"는 말이 있나
return False있으면 다시 하지 말라고 답한다다시 시동 걸어도 소용없음
return any(w in error_text for w in transient)없으면 일시적 낱말이 있는지 본다"잠깐 꺼졌다"는 말이 있나
for e in [...]: print(retryable(e), e)오류 글 셋을 넣어 본다손님 세 명 접수

결과에서 재고 오류 글에는 일시적 낱말이 없지만, 업무 낱말("재고")이 있어 False 가 되었습니다. 비유와 다른 점은, 직원은 말의 뜻을 알아듣지만 이 함수는 낱말이 글자 그대로 들어 있는지만 본다는 것입니다. 처음 보는 오류 문구는 틀리게 가를 수 있으니 기록을 보며 낱말 목록을 고쳐 갑니다.

작게 줄여서 눈으로 보기

두 목록의 낱말이 한 글에 함께 들어 있으면 어떻게 될까요? 아래 오류 문구는 설명을 위해 지어낸 것입니다.

Python
business = ["재고", "없습니다", "모자", "권한"]
transient = ["timeout", "연결", "Error executing tool"]

text = "Error executing tool reserve: 재고가 모자랍니다"   # 설명을 위해 지어낸 오류 문구
print("일시적 낱말이 있나:", any(w in text for w in transient))
print("업무 낱말이 있나:", any(w in text for w in business))
출력
일시적 낱말이 있나: True
업무 낱말이 있나: True
결과읽는 법
일시적 낱말이 있나: True"Error executing tool" 이 들어 있어 일시적 오류로도 보인다
업무 낱말이 있나: True"재고", "모자" 가 들어 있어 업무 오류로도 보인다

둘 다 True 라서, 어느 쪽을 먼저 보느냐가 답을 정합니다. retryable 은 업무 낱말을 먼저 보므로 이 글은 False(다시 하지 않음)가 됩니다. 업무 오류를 다시 하면 같은 실패만 되풀이하므로, 헷갈릴 때는 "다시 하지 않음" 쪽으로 기우는 편이 안전합니다.

주의할 점

  • 쓰기 도구(예약, 결제)를 무턱대고 다시 하면 두 번 실행될 수 있습니다. 첫 요청이 실제로는 성공했는지 상태를 확인하고 다시 합니다.
  • 오류를 삼키고 아무 일 없던 것처럼 넘어가지 않습니다. 몇 번 해도 안 되면 사용자에게 알리고 기록을 남깁니다.
← 이전 절10장 · 컨텍스트 줄이기다음 절 →10장 · 실패 복구 설계