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