2 min read

LLM Agent Tool Guardrail 설계

툴 호출 권한 범위와 실패 복구 전략을 정의해 에이전트 오작동을 줄이는 방법

LLM Agent Tool Guardrail 설계 thumbnail

도입

LLM Agent를 프로덕션에 올리면 모델 성능보다 도구 사용 통제가 먼저 문제로 드러난다. 에이전트가 외부 API와 내부 시스템을 호출할 때 권한, 입력 검증, 실행 한도 없이 열어두면 사고 가능성이 커진다. 이 글은 Tool Guardrail을 정책 계층으로 설계하는 방법을 설명한다.

LLM Agent Tool Guardrail 설계 커버
Wikimedia Commons 기반 무료 이미지

문제 정의

에이전트 장애는 보통 잘못된 추론보다 잘못된 실행에서 발생한다.

  • 툴 호출 전 파라미터 검증이 없어 비정상 요청이 그대로 전달된다.
  • 민감 툴에 사용자 권한 컨텍스트가 전달되지 않는다.
  • 연쇄 호출 제한이 없어 루프 실행으로 비용 폭증이 발생한다.

가드레일은 프롬프트가 아니라 런타임 정책으로 강제해야 한다. 모델 출력은 항상 불완전하다고 가정하는 것이 안전하다.

핵심 개념

관점설계 기준검증 포인트
입력 검증JSON Schema 기반 파라미터 체크invalid call 차단률
권한 제어툴별 RBAC권한 위반 시도 탐지
실행 제한step/time/cost budget루프 실행 방지
감사tool call trace사후 재현 가능성

가드레일을 독립 컴포넌트로 두면 모델 교체 시에도 운영 정책을 유지할 수 있다. 이는 장기적으로 가장 큰 안정성 이점이다.

코드 예시 1: 툴 호출 검증 래퍼

import { z } from "zod";

const createTicketSchema = z.object({
  title: z.string().min(5),
  severity: z.enum(["low", "medium", "high"]),
  owner: z.string().min(2),
});

export async function guardedCreateTicket(input: unknown, ctx: { roles: string[] }) {
  const parsed = createTicketSchema.parse(input);
  if (!ctx.roles.includes("support")) {
    throw new Error("forbidden tool access");
  }

  return ticketClient.create(parsed);
}

코드 예시 2: 에이전트 실행 예산

export type AgentBudget = {
  maxSteps: number;
  maxToolCalls: number;
  maxCostUsd: number;
};

export function enforceBudget(state: { steps: number; toolCalls: number; costUsd: number }, budget: AgentBudget) {
  if (state.steps > budget.maxSteps) throw new Error("step budget exceeded");
  if (state.toolCalls > budget.maxToolCalls) throw new Error("tool budget exceeded");
  if (state.costUsd > budget.maxCostUsd) throw new Error("cost budget exceeded");
}

아키텍처 흐름

Mermaid diagram rendering...

트레이드오프

  • 엄격한 가드레일은 안전하지만 에이전트 자율성이 줄어 작업 성공률이 떨어질 수 있다.
  • 검증 레이어 추가로 지연이 증가하지만 잘못된 실행 비용을 크게 줄인다.
  • 정책 세분화는 유연하지만 운영 관리 포인트가 늘어난다.

정리

LLM Agent 운영의 핵심은 모델 지능이 아니라 실행 통제다. 툴 호출을 정책 엔진으로 감싸고 예산을 강제하면 비용과 보안 리스크를 동시에 관리할 수 있다.

이미지 출처

댓글