Post

[LLM Agent Patterns] Day 4: 툴 사용 안전성 - 권한 최소화와 Human-in-the-Loop

[LLM Agent Patterns] Day 4: 툴 사용 안전성 - 권한 최소화와 Human-in-the-Loop

서론: 에이전트가 틀렸을 때의 비용

에이전트가 웹을 검색하다 실패하면 재시도하면 된다. 에이전트가 데이터베이스 레코드를 삭제하거나 외부 API에 트랜잭션을 전송하면 복구가 어렵다. 툴의 위험성은 균일하지 않다. 이 차이를 무시한 설계가 프로덕션 장애의 주요 원인이다.

1. 툴 위험도 분류

모든 툴을 동일하게 취급하지 않는다.

위험도특성예시
읽기 전용부작용 없음검색, 파일 읽기, DB 조회
낮은 부작용되돌릴 수 있음임시 파일 생성, 초안 저장
높은 부작용되돌리기 어려움DB 삽입/갱신, 이메일 전송
파괴적복구 불가DB 삭제, 외부 결제, 코드 실행

에이전트에게 노출하는 툴은 파괴적 툴을 기본적으로 제외하고, 필요한 경우 Human-in-the-Loop를 통해서만 허용한다.

2. 최소 권한 원칙 적용

에이전트는 현재 작업에 필요한 최소한의 툴만 가져야 한다.

1
2
3
4
5
6
7
# 나쁜 예: 모든 툴을 기본 제공
tools = [search, read_file, write_file, delete_file, send_email, run_sql]

# 좋은 예: 작업 유형에 따라 툴셋 제한
research_tools  = [search, read_file]
write_tools     = [write_file]
admin_tools     = [delete_file, run_sql]  # 별도 승인 필요

툴셋은 에이전트 인스턴스 생성 시 고정하고, 런타임에 동적으로 확장하지 않는다.

3. Human-in-the-Loop 설계

되돌릴 수 없는 작업 전에는 사람의 확인을 요구한다.

3.1 트리거 조건 정의

1
2
3
4
5
6
7
8
9
HITL_REQUIRED = [
    "delete_record",
    "send_email",
    "execute_payment",
    "deploy_code",
]

def should_require_human_approval(tool_name: str) -> bool:
    return tool_name in HITL_REQUIRED

3.2 승인 흐름

1
2
3
4
5
에이전트가 파괴적 툴 호출 결정
  └─ 승인 요청 생성 (대상 툴, 파라미터, 이유 포함)
  └─ 사람에게 알림 (UI, Slack 등)
  └─ 승인 → 툴 실행
  └─ 거부 → 에이전트에게 거부 이유 전달 → 대안 탐색

3.3 타임아웃 처리

승인 대기 중 에이전트를 일시 정지하고, 타임아웃 시 안전한 기본 동작(취소 또는 보류)을 실행한다.

4. 에러 처리 설계

툴 실패는 예외가 아니라 정상 경로다. 에이전트가 실패를 처리하는 방식을 명시적으로 설계해야 한다.

4.1 에러 유형별 전략

에러 유형전략
일시적 실패 (네트워크, 타임아웃)지수 백오프 재시도
권한 오류재시도 없음, 사용자에게 권한 부족 안내
잘못된 파라미터LLM이 파라미터를 수정해 재시도
툴 서비스 불가폴백 툴 또는 작업 중단

4.2 에러 정보 전달

에이전트는 에러 메시지를 그대로 컨텍스트에 전달하면 안 된다. 구조화된 형식으로 변환한다.

1
2
3
4
5
6
7
8
9
10
# 나쁜 예
observation = str(exception)  # 스택 트레이스 그대로 전달

# 좋은 예
observation = {
    "status": "error",
    "error_type": "permission_denied",
    "message": "파일 쓰기 권한이 없습니다.",
    "retryable": False
}

5. 파라미터 검증

에이전트가 생성한 툴 파라미터를 실행 전에 검증한다.

  • 스키마 검증 (타입, 필수 필드)
  • 값 범위 검증 (예: SQL에서 LIMIT이 지나치게 크지 않은지)
  • 인젝션 패턴 탐지 (툴 파라미터를 통한 간접 인젝션 방지)

6. Day 4 체크리스트

  1. 툴을 읽기/낮은 부작용/높은 부작용/파괴적 4단계로 분류했다.
  2. 에이전트에게 현재 작업에 필요한 최소 툴만 노출했다.
  3. 파괴적 툴에 Human-in-the-Loop 승인 흐름을 구현했다.
  4. 툴 에러를 구조화된 형식으로 변환해 에이전트 컨텍스트에 전달한다.

다음 글 예고

Day 5에서는 에이전트 운영 패턴을 다룬다. 에이전트 신뢰성을 높이는 테스트 전략, 배포 패턴, 시리즈 전체 운영 성숙도 로드맵을 정리한다.

This post is licensed under CC BY 4.0 by the author.