ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 에이전트 루프의 실행력, 행동(Action) — 생각에서 변화로 나아가는 도구 호출
    IT 2026. 6. 7. 21:00
    에이전트 루프의 실행력, 행동(Action) — 생각에서 변화로 나아가는 도구 호출

    AI 에이전트 루프의 세 번째 단계는 행동(Action)이다. 관찰을 통해 상황을 인지하고 계획을 세웠다면, 이제는 세운 계획을 실천에 옮겨 로컬 시스템이나 코드베이스에 물리적 변화를 가할 차례다. 행동 단계는 에이전트가 뇌(LLM)에서 벗어나 비로소 손과 발을 움직여 실제 세상에 영향을 주는 핵심적인 순간이다.

    이 글에서는 에이전트 루프의 강력한 추진체이자 가장 위험할 수도 있는 행동 단계에서 수행하는 구체적인 일과 안전장치, 그리고 앞뒤 단계와의 유기적 연결 관계를 상세히 분석한다.

    ① 행동(Action) 단계에서 수행하는 일

    행동은 에이전트가 도구 호출(Tool Call, 모델이 스스로 필요한 함수와 인자를 선택하여 시스템에 실행을 요청하는 형태) 메커니즘을 사용해 현실의 파일 시스템과 셸 환경을 조작하는 과정을 의미한다. 단순한 텍스트 출력을 넘어, 실제 파일을 열고, 고치고, 명령어를 실행하는 실천적 행위다.

    행동 단계의 구체적인 수행 항목은 다음과 같다.

    • 도구 실행 번역 (Tool Execution Translation): LLM이 생성한 정형 데이터(주로 JSON, 데이터를 구조화하여 전송하기 위한 표준 경량 텍스트 포맷)를 해석하여 로컬 API 호출이나 CLI(Command Line Interface, 명령 줄 인터페이스) 명령어 실행으로 변환한다.
    • 샌드박스(Sandbox, 격리된 가상 환경) 내 실행: 호스트 시스템을 안전하게 보호하기 위해, 모든 파일 수정과 명령어 실행을 도커(Docker, 격리된 컨테이너 환경을 제공하는 플랫폼) 컨테이너나 권한이 제한된 하위 프로세스 내부에서 격리하여 실행한다.
    • 파일 및 상태 변경: 코드베이스의 파일을 쓰거나(Write) 수정(Edit)하고, 패키지를 빌드하거나 로컬 데몬(Daemon, 백그라운드 프로세스)을 구동하는 등 실행 환경의 물리적 변화를 일으킨다.
    • 결과 데이터 캡처 (Output Capturing): 도구 실행 과정에서 발생한 표준 출력(Stdout), 표준 에러(Stderr), 그리고 프로세스의 종료 상태(Exit Code) 등을 수집한다.

    diagram

    다이어그램 설명. 왼쪽에서 LLM이 요청한 정형 도구 요청(JSON)이 들어오면, 중간의 격리된 샌드박스 내부에서 신뢰 경계(가역성 판단)를 검증하고 행동을 실행한다. 이 과정에서 발생한 표준 출력(Stdout), 표준 에러(Stderr), 그리고 종료 코드(Exit Code)는 오른쪽의 결과 수집 단계를 거쳐 다음 검증 단계로 보존되어 전달된다.

    ② 왜 행동을 해야 하는가?

    추론 능력만 있고 실행 능력이 없는 지능은 탁상공론에 그친다. 에이전트가 에이전트로서의 실질적 가치를 증명하려면 가상 공간에 변화를 만드는 행동 단계가 반드시 수반되어야 한다.

    행동 단계가 필수적인 이유는 다음과 같다.

    1. 수동적 조언자에서 능동적 대행자로의 전환: 챗봇은 "이 코드를 고쳐 보세요"라는 조언을 줄 뿐이지만, 에이전트는 파일 쓰기 도구를 활용해 코드를 직접 수정하는 주체적인 역할을 담당한다.
    2. 현실적인 피드백 생성: 생각 단계에서 예상하지 못한 숨은 버그나 컴파일 에러는 실제로 명령어를 실행해 보고 코드를 고쳐 보아야만 수집된다.
    3. 개발 생산성 제고: 패키지 설치, 빌드 트리거, 파일 정제와 같은 기계적인 반복 업무를 사람 대신 에이전트가 실행하므로 개발 프로세스가 크게 단축된다.

    ③ 앞단계 및 뒷단계와의 연결고리

    행동은 계획(Planning)에서 구체적인 실행 명령을 위임받아 실행하고, 그 실행 결과를 검증(Verification) 단계로 보내는 징검다리 역할을 한다.

    이전 단계 (계획) 현재 단계 (행동) 다음 단계 (검증)
    "가상환경의 requests 패키지를 Poetry로 설치하라는 하위 목표를 수립한다." 샌드박스 셸 내부에서 poetry add requests 명령어 도구를 실행한다. 설치 완료 후, 패키지가 정상 임포트되는지 테스트 코드로 즉시 검사한다.
    • 이전 단계(계획)와 연결: 계획 단계에서 쪼개어 세운 상세 스텝 중 최상위 스텝을 행동 단계가 접수한다. 에이전트 엔진은 그 스텝에 맞는 구체적 도구(Tool Call) 형태(인자, 파일 경로 등)로 변환해 행동을 실행한다.
    • 다음 단계(검증)와 연결: 행동 단계에서 도구를 실행해 파일이 변경되거나 컴파일 결과가 수집되면, 이 물리적 상태를 검증 단계로 토스한다. 검증 단계는 이 결과를 분석해 성공 여부를 판정하게 된다.

    ④ 실질적으로 어떻게 동작하는가? (사례 중심)

    개발 프로세스 중 가장 민감한 "특정 파일 쓰기 및 명령어 실행"이 실제로 어떻게 이루어지는지 구체적인 데이터 구조와 설계 원리를 통해 살펴본다.

    1. 도구 실행 파싱과 매직 래퍼 (Magic Wrapper)

    LLM은 정형화된 JSON 프로토콜을 통과하여 파일 수정 요청을 반환한다. 행동 엔진은 이 JSON을 파싱하고, 실제로 replace_file_content 같은 API를 동작시킨다. 아래는 그 예시다.

    // LLM이 생성한 행동 요청 (JSON)
    {
      "tool": "replace_file_content",
      "arguments": {
        "TargetFile": "/workspace/src/utils.py",
        "StartLine": 12,
        "EndLine": 15,
        "TargetContent": "def calculate_tax(amount):\n    return amount * 0.1",
        "ReplacementContent": "def calculate_tax(amount):\n    # 2026년 신규 법률 세율 반영\n    return amount * 0.12",
        "Description": "세율을 10%에서 12%로 상향 조정합니다.",
        "Instruction": "세율 업데이트",
        "AllowMultiple": false
      }
    }
    

    코드 설명. 에이전트 행동 엔진은 이 JSON 데이터를 받아서 파이썬의 파일 처리 API를 호출한다. 이때 단순하게 텍스트를 덮어쓰지 않고, StartLineEndLine 범위 내에서 TargetContent와 파일 내용이 정확하게 일치하는지 한 번 더 대조하는 검증 래퍼(Wrapper)를 씌워 작동시킨다. 이는 LLM이 잘못된 줄 번호를 짚어 엉뚱한 코드를 깨뜨리는 오작동을 원천 봉쇄하기 위함이다.

    2. 비가역적 행동과 신뢰 경계 (Trust Boundary)의 방어선

    행동 중에는 git reset 등으로 되돌릴 수 있는 가역적인 행동(파일 읽기, 로컬 빌드)이 있는가 하면, 원격 저장소 푸시(git push)나 실서버 배포, 혹은 파일 영구 삭제(rm -rf)처럼 되돌리기 힘든 비가역적인 행동도 존재한다.

    안전한 에이전트는 행동 단계의 시작점에 다음과 같은 신뢰 경계 필터를 두어 통제한다.

    # 비가역적 명령어에 대해 사용자 명시 승인을 요구하는 가드레일 예시
    DANGEROUS_COMMAND_PATTERNS = ["rm -rf", "git push", "docker system prune", "curl -X POST"]
    
    def execute_action(action_payload):
        tool_name = action_payload.get("tool")
        args = action_payload.get("arguments", {})
        
        if tool_name == "run_command":
            cmd_line = args.get("CommandLine", "")
            # 위험한 패턴이 명령줄에 감지되면
            if any(pat in cmd_line for pat in DANGEROUS_COMMAND_PATTERNS):
                # 사람에게 승인을 가로채 요청 (Escalation)
                approval = request_human_approval(title="위험한 명령어 감지", command=cmd_line)
                if not approval:
                    raise PermissionError("사용자가 실행을 취소했습니다.")
                    
        # 안전성이 입증된 행동만 실제 샌드박스로 진입
        return run_in_sandbox(tool_name, args)
    

    코드 설명. 행동을 실행하기 전, 명령행 인자를 정규식이나 블랙리스트 단어 조합과 대조한다. 위험 수준이 높은 행동이 감지되는 즉시 자율 모드를 중단하고 사람의 직접적인 명시적 승인을 구하는 구조로 전환된다. 자율성을 확보하면서도 대형 참사를 차단하는 최소한의 제어 장치다.

    정리하며

    행동(Action)은 에이전트의 생각을 실체적 결과물로 변환시키는 손과 발이다. 강력한 도구와 실행력이 부여되는 단계인 만큼, 격리된 실행 샌드박스와 철저한 신뢰 경계(Trust Boundary) 설계가 함께 맞물려야 한다. 안전벨트가 단단히 매여 있을 때야말로, 에이전트의 거침없는 자율 주행(루프)이 완성될 수 있다.


    이 글은 생성형 AI의 도움을 받아 작성되었습니다. 원본 자료를 기반으로 AI가 초안을 생성하고, 작성자가 검토·편집하였습니다.

Designed by Tistory.