4. 함부로 실행하지 않는 Agent

승인과 실행 기록을 담을 자리

이 차시를 마치면

승인·재시도·실행기록을 담을 자리를 State 에 먼저 만듭니다.

승인, 재시도, 실행 기록을 담을 자리를 먼저 만듭니다. 이것을 나중에 하면 나머지 설계가 무너집니다.

State 를 네 갈래로 나눕니다

분류담는 것
Input State사용자에게 받은 값
Working State중간 처리 결과
Control State분기, 반복, 승인에 필요한 값
Output State최종 반환값

보안 특화 Agent 에서 가장 중요한 것은 Control State 입니다. 승인 여부와 실행 기록이 여기 들어갑니다.

코드

"""보안 특화 Agent의 State 설계 예 — raw의 State 4분류를 적용한 골격."""
from typing import Annotated, Literal, Optional
import operator

from typing_extensions import TypedDict


class SecureAgentState(TypedDict):
    # 1) Input state — 사용자에게 받은 값
    request: str
    requester_id: str

    # 2) Working state — 중간 처리 결과
    plan: str
    draft: str
    evidence_refs: list[str]          # 원문이 아니라 참조 ID만 저장

    # 3) Control state — 분기/반복/승인에 필요한 값
    risk_level: Literal["low", "high"]
    pending_action: str                # 실행할 내용을 확정한 값. 승인 화면에 보여 주는 것과 같다
    approved: bool
    retry_count: int
    executed_action_id: Optional[str]  # idempotency key. prepare_action에서 입력으로부터 만든다

    # 4) Output state — 최종 반환값
    result: str

    # 감사 로그는 누적한다. 병렬 노드가 함께 기록할 수 있으므로 reducer를 붙인다.
    audit_log: Annotated[list[str], operator.add]

이 코드는 py_compile 을 통과했고, import 후 TypedDict 정의가 실제로 생성되는 것까지 확인했습니다.

각 항목을 왜 넣었는가

항목근거
evidence_refs 에 원문 대신 참조 ID 만 저장State 영역 설계 질문 3번 — "대용량 원문 대신 ID 나 reference 만 저장할 수 있는가?"
audit_logoperator.add Reducer 부착"병렬 업데이트되는 필드를 단순 overwrite 로 바꾸는 것" 금지
retry_count 보유종료 조건(A-3)은 절대 유지 대상
executed_action_id 보유"idempotency key, 실행 여부 기록" 으로 보호하라는 서술

State 는 Checkpoint 저장소에 남습니다

이것이 보안 항목이기도 한 이유입니다. State 에 넣은 값은 Persistence backend 에 저장됩니다. 개인정보 원문을 State 에 담으면 Checkpoint 저장소가 개인정보 저장소가 됩니다. 분석

evidence_refs 방식은 성능뿐 아니라 이 문제도 함께 줄입니다.

다만 evidence_refs 만의 문제가 아닙니다. request 도 State 필드이므로 요청 원문이 모든 Checkpoint 에 남습니다. 요청문에 개인정보가 들어오면 Checkpoint 저장소를 그 수준으로 관리해야 합니다. 규칙은 하나입니다 — State 에 넣은 값은 모두 Checkpoint 에 남습니다. 분석

비유

서류 원본을 모든 결재 서류철에 복사해 끼워 넣는 것"원본은 3번 캐비닛 12번" 이라고 적어 두는 것의 차이입니다. 후자는 캐비닛 하나만 잠그면 되지만, 전자는 모든 서류철을 관리해야 합니다.

requester_id 에 대한 주의

확인 필요 requester_id값을 담는 자리일 뿐 검증 장치가 아닙니다. 누가 승인했는지 확인하는 방법, 즉 인증과 권한 확인은 학습팩에 서술이 없습니다. 실제 운영에서는 별도의 인증 계층이 필요합니다.

이해도 확인

문항을 불러오는 중입니다.