
폼 안의 AI는 눈을 가린 평범한 Claude였다 ── 「AI 요약 설명」을 드디어 작성하는 이야기
요약
VBA를 통해 시트 데이터를 요약하여 Claude에게 전달하고, Claude Code CLI를 활용해 엑셀 시트의 구조와 매크로를 분석하는 AI 도구 개발 사례를 소개합니다. 헤드리스 환경에서 도구 사용 권한을 인자(Argument)로 전달함으로써 AI가 추측이 아닌 실제 매크로 코드를 읽고 분석하게 만든 과정을 다룹니다.
핵심 포인트
- VBA로 시트 데이터, 수식 패턴, 이름 정의를 다이제스트로 구성하여 프롬프트에 전달
- Claude Code CLI를 백그라운드에서 호출하는 파이프라인 구축
- 헤드리스 AI에게 인자(Argument)를 통해 도구 사용 권한을 부여하여 분석 능력 향상
- 읽기 권한은 AI에게, 쓰기 권한은 인간에게 부여하는 안전한 설계 원칙 적용
「다음은 AI 요약 설명을 작성하겠습니다」라고 예고한 뒤, 다른 기사들을 계속 끼워 넣었습니다. 지난번에는 이것이었습니다.
기대하셨던 분(혹시 계신다면), 죄송합니다. 드디어 작성합니다.
다만, 솔직히 고백하자면 미뤄왔던 데에는 이유가 없습니다. 폼(Form) 자체는 이미 만들어져 있었습니다. 수식 해설과 데이터 검수 폼을 작성했던 회차에서 「검수 폼을 복제하면 거의 다 만들 수 있을 전망」이라고 썼는데, 전망대로 복제하자마자 바로 작동했습니다. 작동해 버리면 기사는 뒷전이 되기 마련입니다.
그렇게 묵혀두는 동안, 이 폼 안에서 사건이 일어났습니다. 이번에는 폼 소개와 그 사건의 전말을 함께 쓰겠습니다. 결론부터 말씀드리자면──폼 안에 있던 AI는 한정판 AI가 아니라, 눈을 가린 평범한 Claude였습니다.
AI 요약 설명 폼: 열려 있는 시트를 AI에게 전달하여 「이것은 어떤 표인가」를 설명하게 하는 도구입니다. 시트의 내용은 VBA가 자동으로 요약하여 전달합니다 - 사용하고 있었더니, AI가 「도구 사용을 허가해 주시면, 매크로를 특정하여 보고하겠습니다」라고 물어왔습니다.
대화가 이어지고 있는 것처럼 보였습니다 - 실제로는 매번 백지 상태의 AI였습니다. 같은 시트를 보고, 같은 결론에 도달하며, 같은 부탁을 하고 있을 뿐── 그리고 제가 몇 번이나 「좋아」라고 대답해도, 그 대답은 전달되지 않는 구조였습니다
- 정체는 기동 방식에 있었습니다. 헤드리스(Headless) 기동의 AI에게는 허가를 묻는 화면이 없었고, 도구가 모두 봉쇄되어 있었습니다.
반대로 말하면, 인자(Argument)로 허가를 전달하면 사용할 수 있다는 뜻입니다 - 인자를 추가했더니, AI는 실제로 매크로를 검색하여 읽고, 추측이 아닌 실물을 바탕으로 대답하게 되었습니다. 대화도 정말로 이어지게 되었습니다. 스크린샷의 타임스탬프 기준으로, 발견으로부터 36분 만에 일어난 일입니다 - 쓰기 계열의 도구는 전달하지 않았습니다.
읽기는 전개, 쓰기는 인간의 손── 이 선긋기는 의도적으로 남겨두었습니다
먼저 예고했던 내용을 회수하겠습니다. 폼의 외관은 지금까지의 AI 폼들과 마찬가지로 투박한 구조입니다.
대상: 열려 있는 시트 이름과 사용 범위가 표시됨 -
지시: 「어떤 표인지 설명해줘」 「입력 규칙을 추측해줘」 등의 정형화된 콤보 + 자유 기입 -
AI: 엔진(Claude / Gemini)과 모델을 콤보로 선택 -
실행: 수십 초 내에 아래 칸에 답이 돌아옴
핵심은 역시 AI에게 무엇을 전달하느냐입니다. 버튼을 누르면 VBA가 시트를 읽고, 다음과 같은 다이제스트(Digest)를 구성합니다.
- 북(Book) 이름과 시트 목록 (최대 30장)
- 대상 시트의 사용 범위와, 실제 데이터의 상단 40행 × 30열 (탭 구분)
- 수식 패턴 (같은 식이 아래로 드래그되어 있다면 R1C1 방식으로 비교하여 1행으로 압축. 최대 800셀 분량)
- 이름 정의 (내부 이름을 제외하고 최대 20개)
이것을 프롬프트(Prompt)에 붙여넣어 파일로 쓰고, 백그라운드에서 Claude Code의 CLI를 호출하여 답을 파일로 받습니다. 매크로 수정 회차부터 계속 사용해 온, 평소와 다름없는 파이프라인입니다.
처음 보는 북을 인계받았을 때, 「이 시트는 무엇을 하고 있으며, 어디에 무엇을 입력하는가」를 사람에게 묻는 대신 폼에 묻는다. 그것이 이 도구의 역할입니다. 여기까지가 예고했던 범위. 여기서부터가 사건입니다.
자신의 파일 관리 북의 「수정」이라는 시트에서, 지시란에 다음과 같이 입력하고 실행했습니다. 「실제 동작은 매크로(VBA)를 특정해줘」 ── 제목답게 데이터가 비어 있는 시트였기에, 어떤 매크로가 이것을 사용하는지 알고 싶었습니다.
돌아온 답변의 내용은 다음과 같았습니다.
도구 실행이 허가되지 않았으므로, 시트 정보로부터의 추측으로 답변하겠습니다.
그 뒤에 이어지는 것은 「~라고 생각됩니다」라는 추측입니다. 매크로를 읽을 수 있다면 확정할 수 있지만, 시트 정보만으로는 확정할 수 없다고 AI 스스로가 쓰고 있습니다.
다시 한번 실행하자, 이번에는 이렇게 돌아왔습니다.
도구(mcp__vba-manager__vba)의 사용을 허가해 주시면, 매크로를 특정하여 보고하겠습니다. 실행하시겠습니까?
물어본다면 대답하고 싶어집니다. 지시란에 「써도 좋아」라고 입력하고 실행했습니다. 그러자 AI는 또다시 똑같은 것을 물어오는 것입니다.
이때 저는 「대화가 이어지고 있다」고 느끼고 있었습니다. 한 번의 왕복으로 끝나는 도구일 텐데, 상대방은 이전 이야기를 기억하고 있으며 허가를 기다리고 있는── 그렇게 보였습니다. 그래서 평소의 파트너(Claude Code의 터미널 측)에게 물었습니다. 「이게 대체 어떻게 된 일이야?」
코드를 읽게 했더니, 몇 분 만에 정체가 밝혀졌습니다.
우선, 대화는 이어지고 있지 않았습니다. 폼(Form)은 실행될 때마다 프롬프트(Prompt)를 처음부터 새로 구성하여 새로운 AI를 기동합니다. 이전의 주고받은 내용은 단 한 줄도 전달되지 않습니다. 즉, 제가 대화하고 있었던 상대는 매번 처음 만나는 신선한 상태의 AI였습니다.
그렇다면 왜 대화처럼 보였을까요? 전달되는 시트의 다이제스트(Digest)가 매번 같았기 때문입니다. 새로운 AI가 동일한 시트를 보고, 동일한 결론에 도달하며, 동일한 요청을 합니다. 받는 입장에서는 동일한 상대가 대화를 이어가고 있는 것과 구별할 수 없습니다.
그리고 잔혹하게도, 저의 "사용해도 좋아"라는 말은 누구에게도 닿지 않았습니다. 도구(Tool)의 허가는 AI 기동 시의 인자(Argument)로만 결정됩니다. 지시란에 적은 답변은 다음 신선한 AI에게 전달되는 전언은 될 수 있어도, 허가가 되지는 않습니다. 묻고, 허락하고, 다시 묻는──저는 닿지 않는 허가를 손으로 계속 실어 나르고 있었던 셈입니다.
그렇다면 애초에 왜 "허가되지 않았던" 것일까요?
폼이 AI를 호출하는 커맨드(Command)는 claude -p로, 이른바 헤드리스(Headless) 기동입니다. 일문일답 방식으로 사용하는 비대화형 모드이기에, 허가를 묻는 화면이 존재하지 않습니다. 물을 상대가 없는 이상, 미리 허가되지 않은 도구의 호출은 문답무용으로 거절됩니다. 폼의 기동 커맨드에는 허가 인자(--allowedTools)가 붙어 있지 않았습니다. 그뿐인 일이었습니다.
여기서 흥미로운 점은, AI에게 도구가 보이고는 있었다는 것입니다. 제 환경에는 열려 있는 Excel 북(Book)을 COM을 통해 조작하는 자작 도구(VBA 매니저·GitHub에 공개되어 있음)가 MCP 서버로서 사용자 전체에게 등록되어 있습니다. 헤드리스로 기동한 AI로부터도 그 도구는 목록에 올라와 보입니다. 그래서 이름을 알고 있었고, 사용하려고 했습니다. 손을 뻗은 순간, 인자의 벽에 부딪혀 튕겨 나갔을 뿐입니다.
즉, 폼 안에 있었던 것은 기능이 삭제된 한정판 AI가 아니었습니다. 터미널에서 저와 함께 일하고 있는 것과 동일한 Claude가, 눈이 가려지고 손이 묶인 채 시트 요약본 한 장만을 전달받고 앉아 있었던 것입니다. "~로 생각됩니다"라는 추측은 능력의 한계가 아니라, 눈이 가려진 결과였습니다.
여기까지 이해했다면 다음 질문은 하나입니다. 인자를 추가하면 눈가리개를 벗길 수 있을까?
테스트부터 시작했습니다. 터미널 측에서 폼과 동일한 헤드리스 형식에 --allowedTools를 하나 추가하여, "열려 있는 북의 목록을 가져와라"라고 던졌습니다. 돌아온 답은 추측이 아니라 북 이름 그 자체였습니다. 헤드리스 AI가 실제로 실행 중인 Excel을 붙잡은 것입니다.
대화의 지속도 시도했습니다. CLI에는 --session-id(이 대화에 이름을 붙임)와 --resume(그 이름의 대화로 돌아감)라는 인자가 있습니다. 첫 번째에 "사과, 귤, 포도를 기억해"라고 전달하고, 두 번째에 --resume으로 기동하여 "아까 그 3개는?"이라고 물었습니다. "사과, 귤, 포도."──기억하고 있었습니다. 일문일답 도구라고 생각했던 헤드리스 기동은, 이름표만 붙여주면 대화를 할 수 있습니다.
이제 폼에 배선하기만 하면 됩니다. 수정한 것은 실행 버튼의 프로시저(Procedure) 하나, 추가한 인자는 3개입니다.
--allowedTools: 도구의 사전 허가. 전달한 것은 매크로(Macro)나 범위를 읽는 계통뿐 -
--session-id: 첫 실행 시 VBA가 대화의 이름표(UUID)를 만들어 자기소개를 함 -
--resume: 두 번째 실행부터는 이름표로 동일한 대화로 돌아감
한 번 실수를 했습니다. 이름표인 UUID를 만드는 데 사용한 Windows 구성 요소(Scriptlet.TypeLib)가 런타임 에러(Runtime Error)를 일으킨 것입니다. 난수로부터 직접 구성하는 방식으로 교체하여 해결했습니다. 스크린샷의 타임스탬프로 측정하니, 에러 화면이 17:34, 수정되어 작동한 것이 17:37──수리는 3분이었습니다.
동일한 시트, 동일한 지시로 다시 한번 실행했습니다. 이번의 답은 다음과 같습니다.
즉 "수정" 시트는 여러 Excel 파일에 동일한 셀 수정을 일괄 적용하기 위한 지시 리스트입니다. 현재 데이터가 비어 있으므로(헤더만 있음), 실행하면 "수정 시트에 데이터가 없습니다"라며 중단됩니다.
또한 연속계산표수정이라는 별도의 매크로도 검색되었으나, 이것은 "수정" 시트를 직접 참조하지 않으므로 이 시트와는 별개의 처리 계통으로 보입니다.
「〜라고 생각됩니다(〜と思われます)」가 사라진 것은 아닙니다. 하지만 위치가 바뀌었습니다. Before의 추측은 "매크로를 읽을 수 없으므로, 시트의 외관을 통한 상상"이었습니다. After는 실제로 매크로를 검색하고 본문을 읽은 뒤, "참조하고 있지 않다"라는 실측 근거를 바탕으로 선을 긋고 있습니다. 데이터가 비어 있으면 실행이 어디서 멈추는지까지, 코드를 읽은 자의 말투입니다.
Before의 스크린샷이 17:01, 이 After가 17:37. 눈가리개를 발견한 시점부터 벗겨내기까지 36분이 걸렸습니다.
가장 큰 변화는, 선두 40행 × 30열이라는 제한의 의미가 바뀌었다는 점입니다.
지금까지 그 다이제스트(Digest)는 AI에게 있어 세계의 전부였습니다. 41행부터 아래도, 31열부터 오른쪽도, 옆의 시트도 존재하지 않았습니다. 그래서 폼의 설명문에는 "큰 표는 앞부분만"이라는 주의 사항이 있었고, 답변에는 "확정할 수 없습니다"라는 말이 나열되어 있었습니다.
지금은 다릅니다. 다이제스트는 첫 번째 실마리에 불과합니다. 뒷내용이 궁금하면 범위를 읽으러 가고, 매크로가 궁금하면 검색해서 본문을 읽습니다. 어디까지 조사할지를 전달하는 쪽이 아니라 AI 쪽이 결정합니다. 요약을 "전달받는" 도구에서, 북(Book)을 "조사하는" 도구로 바뀌었습니다.
한편, 전달하지 않은 것이 있습니다. 바로 쓰기(Write) 계열의 도구입니다. 이것은 의도적인 선 긋기로, 눈가리개는 벗겼지만 장갑은 낀 채로 두었습니다.
이유는 단순합니다. 헤드리스(Headless) AI에게는 확인을 요청할 화면이 없기 때문입니다. 쓰기까지 허용하면 "묻지 않고 쓰기를 끝내버리는" 상대가 됩니다. 읽고, 지적하고, 제안하는 것까지가 AI입니다. 북에 손을 대는 것은 답변을 확인한 인간이 버튼을 눌렀을 때──매크로 수정 폼에서 이어지는 이 형식을 여기서도 지키기로 했습니다. 읽기는 전면 개방, 쓰기는 인간의 손가락입니다.
배포하는 사람의 입장에서 하나 더 덧붙이자면, 이 인자(Argument)는 "상한선을 여는" 것이지 "하한선을 요구하는" 것이 아닙니다. --allowedTools는 해당 도구가 있다면 사용해도 좋다는 사전 허가입니다.
VBA 매니저(VBA Manager)가 설치되지 않은 환경에서는 AI에게 도구가 보이지 않을 뿐, 에러가 발생하지 않으며 지금까지처럼 시트 요약으로부터의 추측으로 답변합니다. 도구를 가진 사람의 환경에서만 멋대로 격이 올라갑니다. 배포물로서 나쁘지 않은 성질이라고 생각합니다.
관례대로 분류하겠습니다.
사실: 폼의 기동 커맨드에 허가 인자가 없으며, 헤드리스 기동 시에는 허가되지 않은 도구가 거부된다는 점(AI 자신의 답변 문구와 코드로 확인). 인자를 추가한 후, AI가 매크로를 검색·독해하여 답변한 점(스크린샷 있음). --resume으로 이전 대화 내용(세 가지 과일)을 답변한 점(실측). Before 17:01 · After 17:37 · 에러로부터 복구까지 3분(스크린샷의 타임스탬프. 공개 전에 재확인하겠습니다). 수정된 프로시저(Procedure)가 1개라는 점.
견해: "대화가 이어지는 것처럼 보였던" 원인을 "동일한 다이제스트로부터 동일한 결론·동일한 질문이 재현되었기 때문"이라고 읽고 있는 점(다른 요인을 망라적으로 배제한 것은 아닙니다). "읽기는 전면 개방, 쓰기는 인간의 손가락"이 배포 도구로서 적절한 선 긋기라는 판단.
- 이 폼이 포함된 북은 계속해서 미공개 상태입니다. 이번 개수를 통해 "대화가 이어지게" 되었지만, 폼의 구조는 왕복(One-turn) 시대 그대로입니다. 답변란은 최신 항목 하나로 덮어씌워지며, 대화를 새로 시작하는 "새로운 이야기" 버튼도 아직 없습니다.
대화가 이어지는 내용에 비해 그릇이 따라가지 못하고 있습니다 ── 이 부분을 다시 만든 후에야 진정한 공개를 할 수 있습니다. - 구동하려면 Claude Code CLI의 셋업과 로그인이 필요합니다. 도구 허가(MCP ·--allowedTools)는 그 다음 단계의 이야기이며, 누구의 Excel에서도 즉시 작동하는 것은 아닙니다. - 36분 만에 끝난 이유는 도구 측(VBA 매니저와 MCP 등록)이 미리 준비되어 있었기 때문입니다. 제로 베이스에서 36분이 아닙니다. 1년 치의 밑준비 중 마지막 36분입니다.
세 번 미뤄왔던 숙제를 마치며 깨달은 것이 있습니다. 미루길 잘했다는 것입니다. 만약 7월 중에 썼다면, 이 글은 "검품 폼을 복제하여 요약 폼을 만들었습니다"로 끝났을 것입니다.
폼 안의 AI는 처음부터 평범한 Claude였습니다. 부족했던 것은 능력이 아니라, 허가 인자 두세 개였습니다. 눈가리개의 정체가 그것뿐이었다는 것을 알았을 때의 기분은, 아마 "말문이 막힌다"는 표현이 가장 가까웠을 것 같습니다.
눈가리개는 벗겨졌습니다. 장갑은 낀 채로입니다.
다음에는 대화가 이어진다는 전제로 폼을 다시 만들겠습니다. 그릇이 내용물을 따라잡게 되면 다시 쓰겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기