[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 체크리스트
- 툴을 읽기/낮은 부작용/높은 부작용/파괴적 4단계로 분류했다.
- 에이전트에게 현재 작업에 필요한 최소 툴만 노출했다.
- 파괴적 툴에 Human-in-the-Loop 승인 흐름을 구현했다.
- 툴 에러를 구조화된 형식으로 변환해 에이전트 컨텍스트에 전달한다.
다음 글 예고
Day 5에서는 에이전트 운영 패턴을 다룬다. 에이전트 신뢰성을 높이는 테스트 전략, 배포 패턴, 시리즈 전체 운영 성숙도 로드맵을 정리한다.
This post is licensed under CC BY 4.0 by the author.