로컬 AI 어시스턴트에 /yolo 버튼을 추가했습니다
요약
로컬 AI 어시스턴트 CliGate에서 반복적인 승인 절차의 번거로움을 해결하기 위해 '/yolo' 명령어를 도입했습니다. 사용자의 의도를 반영하여 연속적인 도구 호출을 자동 승인함으로써 작업 흐름의 마찰을 줄이고 효율성을 높였습니다.
핵심 포인트
- 반복적인 승인 요청이 사용자 경험을 저해하는 '승인 스팸' 문제 해결
- '/yolo' 플래그를 통해 대화 맥락 내 도구 호출 자동 승인 기능 구현
- 자연어 명령(예: '이제부터 그냥 하세요')을 통한 승인 의도 감지 기능 추가
- 파괴적인 동작에 대해서는 여전히 명시적 확인을 요구하는 안전 장치 유지
저는 위험한 행동을 하기 전에 물어보는 로컬 AI 어시스턴트를 좋아합니다.
하지만 같은 작업을 연속으로 여섯 번이나 승인하는 것은 정말 좋아하지 않습니다.
그것이 제가 CliGate를 작업하면서 계속 마주쳤던 실패 모드였습니다. 일반적인 작업은 하나의 합리적인 명령으로 시작하여, 그다음 명령, 또 그다음 명령으로 이어지는데, 모든 아주 작은 단계마다 새로운 확인을 요구했습니다.
그래서 저는 투박하지만 유용한 스위치를 추가했습니다:
/yolo
무모하게 들릴 수도 있지만, 실제 목표는 그 반대였습니다. 의미 없는 승인 스팸을 클릭하도록 저를 훈련시키지 않으면서도 어시스턴트가 더 빠르게 느껴지도록 만드는 것이었습니다.
안전의 잘못된 버전은 너무 수다스러웠습니다
기존의 루프는 서류상으로는 안전해 보였습니다:
어시스턴트가 변형 도구(mutating tool)를 선택함
-> 확인을 요청함
-> 사용자가 승인함
...
이것은 기술적으로는 정확합니다.
하지만 실제로는 매우 고통스럽습니다.
실제 작업은 단 한 번의 도구 호출(tool call)로 끝나는 경우가 드뭅니다. 문서를 읽거나, 프로젝트를 확인하거나, 채널을 통해 결과를 전송하는 것은 보통 여러 개의 작은 단계가 연속적으로 이어짐을 의미합니다. 모든 단계가 사용자를 방해한다면, 승인 시스템은 위험을 전달하는 것이 아니라 마찰(friction)을 전달하기 시작합니다.
그때가 바로 안전 UI가 배경 소음(background noise)으로 변하는 시점입니다.
/yolo는 승인 범위를 사용자의 의도와 일치시켰습니다
해결책은 "승인을 제거하는 것"이 아니었습니다. 그것은 "사용자가 실제로 의도한 바를 기억하는 것"이었습니다.
CliGate에서 /yolo는 대화 수준의 플래그(flag)를 전환합니다:
- 동일한 대화 내에서 이후의 변형 도구 호출(mutating tool calls)은 자동 승인됩니다.
- 어시스턴트는 모든 작은 후속 단계에 대해 묻는 것을 중단합니다.
- 사용자는
/safe를 통해 엄격 모드(strict mode)를 다시 켤 수 있습니다.
내부적으로 이 플래그는 대화 메타데이터의 assistantCore.autoApproveTools에 저장되며, 웹 채팅과 채널 대화 모두 동일한 단일 진실 공급원(source of truth)을 읽습니다.
이 세부 사항이 중요했던 이유는 웹 UI에서의 동작과 DingTalk 또는 Feishu에서의 동작이 서로 다르기를 원하지 않았기 때문입니다.
자연어는 슬래시 명령만큼이나 중요했습니다
더 흥미로운 부분은 사용자들이 항상 /yolo를 입력하지는 않는다는 점입니다.
그들은 다음과 같이 말합니다:
- "后续都同意" (이후는 모두 동의함)
- "不要再问我了" (더 이상 묻지 마세요)
- "直接执行" (직접 실행하세요)
- "from now on, just do it" (이제부터 그냥 하세요)
그래서 고정 승인 문구 감지(sticky-approval phrase detection) 기능도 추가했습니다.
이는 어시스턴트가 명령뿐만 아니라 일반적인 언어 표현을 통해서도 대화 전반에 걸친 동의를 인식할 수 있음을 의미합니다. 하지만 거절 문구는 여전히 별도로 처리하므로, "我不同意"(동의하지 않습니다)가 "同意"(동의)라는 단어를 포함하고 있다고 해서 실수로 자동 승인(auto-approve)이 활성화되지는 않습니다.
이것은 모델 프롬프트(model prompt)보다 제품 로직(product logic) 측면에서 더 중요한, 작지만 결정적인 부분 중 하나임이 드러났습니다.
여전히 높은 위험 경계선을 유지했습니다
/yolo라는 이름의 기능이 가진 함정은 명백합니다. 모든 것이 자동 승인된다면 안전은 가짜가 됩니다.
그래서 저는 하나의 엄격한 규칙을 유지했습니다.
일상적인 로컬 작업은 자동 승인 모드로 진행될 수 있지만, 진정으로 파괴적이거나 외부적인 동작은 여전히 새로운 명시적 확인이 필요합니다.
즉, 다음과 같은 작업들은:
- 파일 또는 디렉토리 삭제
- 파괴적인 방식으로 데이터 덮어쓰기
- 외부로 게시
- 다른 사람이나 다른 대화로 메시지 전송
- 양식(form) 제출
여전히 멈춰서 물어봐야 합니다.
이 경계선이 바로 이 모드를 사용 가능하게 만드는 핵심입니다. 어시스턴트는 저수준의 실행 단계에 대해서는 번거롭게 굴지 않으면서도, 결과가 실제로 되돌릴 수 없거나 외부적인 경우에는 여전히 동작을 멈출 수 있습니다.
이제 한 번의 확인으로 전체 배치를 처리할 수 있습니다
이 문제를 수정하는 동안 두 번째 버그도 발견했습니다.
때때로 하나의 대기 중인 확인(pending confirmation)이 여러 개의 대기 중인 도구 호출(tool calls)을 나타내는 경우가 있었습니다. 이전에는 이를 승인하면 첫 번째 호출만 실행되고 나머지는 조용히 누락되었습니다.
이제 확인 서비스(confirmation service)는 대기 중인 동작을 캡처된 모든 도구 호출로 확장하여 각 호출을 순서대로 실행합니다. 한 번의 승인은 첫 번째 항목뿐만 아니라 전체 배치(batch)가 실행됨을 의미합니다.
이것은 단순한 구현 세부 사항(implementation detail)처럼 들릴 수 있지만, 사용자 신뢰를 크게 변화시킵니다. UI에서 "확인됨"이라고 표시되면, 사용자는 의도한 동작이 부분적으로 사라지는 것이 아니라 완료되기를 기대하기 때문입니다.
결과는 덜 마법 같고 더 정직하게 느껴집니다
이번 변경 사항에서 제가 가장 마음에 드는 부분은 어시스턴트가 더 자율적으로 느껴지게 만든 것이 아니라는 점입니다.
그것을 더 정렬된(aligned) 상태로 느껴지게 만들었습니다.
이제 어시스턴트는 인간 협업자가 대화를 해석하는 방식에 더 가깝게 동작합니다:
- 만약 제가 "그냥 계속해"라고 말하면, 계속 진행합니다.
- 만약 제가
/yolo라고 말하면, 아주 사소한 단계마다 저에게 잔소리(nagging)하는 것을 멈춥니다. - 만약 다음 단계가 정말로 위험하다면, 여전히 일시 정지합니다.
- 만약 엄격 모드(strict mode)로 돌아가고 싶다면,
/safe를 통해 즉시 복구합니다.
이러한 균형이 바로 제가 로컬 제어 평면(local control plane)에 기대하는 것입니다. 최대의 자유도도, 최대의 격식(ceremony)도 아닌, 적절한 위치에 적절한 양의 마찰(friction)이 존재하는 상태 말입니다.
CliGate는 Claude Code, Codex CLI, 채널, 데스크톱 제어 및 어시스턴트 워크플로우를 한 곳으로 라우팅하기 위해 제가 사용하는 오픈 소스 로컬 제어 평면(local control plane)입니다: CliGate.
만약 여러분이 로컬 에이전트(local agents)를 구축하고 있다면, 승인 메모리(approval memory)와 실제 안전 경계(safety boundaries) 사이의 선을 어디에 긋고 계신가요?
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기