클로드로 요약시켰더니 문체가 좀 딱딱해졌네용
최근에 LLM wiki 쌓다가 Claude SDK를 코어로 박아둔 에이전트 하나 구축해서 쓰고 있는데 리더역할에서도 쓰임이 많네요 한번 구축 해보셔요! Mastra나 Harmes 아니여도 가볍게 구축 가능합니다.
지난 주말 슬랙에서 멘션 한 번으로 부르면 BigQuery로 직접 숫자를 재고 문서까지 정리해 주는 비서 봇을 만들었다. 처음엔 "내가 시키는 일을 대신하는 자동화" 정도로 생각했는데, 막상 손을 대보니 기능을 붙이는 일은 금방 끝났다. 진짜 시간을 잡아먹은 건 따로 있었다. 스스로 판단해 움직이는 무언가를, 어떻게 안전하고 믿을 만하게 길들이느냐는 문제였다.
이건 봇 개발기지만, 사람한테 일을 맡기고 신뢰를 쌓는 과정과 놀랄 만큼 닮아 있었다. 그래서 코드를 모르는 분이 읽어도 남는 게 있을 것 같아, 반복해서 부딪힌 지점을 글로 정리했다.
LLM Wiki도 잘 관리해야된다
처음엔 단순하게 생각했다. 봇이 더 많은 걸 알아서 하게 하려면, 더 많은 걸 건드릴 수 있게 풀어주면 되지 않을까. 그래서 봇이 내 위키 문서에 곧장 글을 쓰게 해봤다. 결과는 며칠 만에 난잡해진 문서 더미였다. 무엇이 검토된 것이고 무엇이 봇이 임의로 갈겨놓은 것인지 구분이 안 갔다.
여기서 배운 게 컸다. 자율성은 권한의 크기로 사는 게 아니었다. 봇은 자기 작업물을 한곳(임시 보관함)에만 쌓도록 막고, 그걸 정식 문서로 올리는 결정은 내가 슬랙 버튼을 눌렀을 때만 일어나게 바꿨다. 봇이 자기 자신을 개선하는 기능까지 붙였지만, 그때도 "권한을 정의하는 규칙 자체"는 손대지 못하게 잠가뒀다. 스스로 자기 권한을 넓힐 수 있으면 어떤 잠금장치도 의미가 없으니까.
일을 맡길 때와 똑같다. 재량은 넓게 주되, 되돌리기 어려운 결정의 스위치는 사람 손에 남겨둔다.
할루시네이션은 드러나게
초기 봇은 일하는 동안 "작업 중…" 한 줄을 계속 덮어쓰기만 했다. 답은 결국 나왔지만, 그사이 봇이 무슨 단계를 거쳤는지 흔적이 없었다. 답이 이상해도 어디서 어긋났는지 알 길이 없었고, 그래서 봇이 내놓는 결과를 온전히 믿기 어려웠다.
고치려고 들여다보니 황당했다. 봇의 실행 엔진은 매 단계 "지금 무슨 도구를 어떻게 쓰는 중"이라는 정보를 이미 넘겨주고 있었다. 나는 그걸 받아서 그냥 버리고 있었을 뿐이다. 새 데이터를 만들 필요가 없었다. 이미 흐르던 신호를 덮어쓰는 대신 차곡차곡 쌓아 보여주기만 하면 됐다.
그러고 나니 봇을 대하는 내 태도가 달라졌다. 신뢰는 좋은 결과가 아니라, 과정이 보일 때 생긴다. 사람도 결과만 툭 던지는 동료보다 "지금 여기까지 했고 이건 막혔다"를 보여주는 동료를 더 믿게 되는 것과 같다.
봇이 모른다고 하는걸 막기
운영 관련 요청을 받으면 봇이 종종 지레짐작으로 "그건 못 합니다"라며 발을 뺐다. 그런데 실제로 한두 번 조회해보게 했더니, 거절했던 것 중 상당수가 멀쩡히 답할 수 있는 일이었다. 모른다는 이유로 안 된다고 단정해버린 것이다.
그래서 규칙을 바꿨다. 확신이 없을 때의 기본 동작을 추측이 아니라 측정으로. 못 한다고 판정하기 전에 먼저 실제로 한 번 재보고, 그다음에 판단한다. 이건 분석 작업에서 늘 강조하던 원칙과 똑같았다. 그럴듯한 틀만 늘어놓지 말고 이번에 바로 숫자를 재라는 것. 사람이든 봇이든, 모를 때 가장 나쁜 습관은 모름을 단정으로 포장하는 일이다.
그 밖에 결정들
위의 세 줄기가 골격이라면, 그 아래엔 비슷한 결을 가진 결정이 몇 개 더 있었다.
무거운 범용 도구보다 가벼운 전용 통로를 기본값으로. 팀과 이슈 진행 상황을 묻는 건 자주 하는 일인데, 만능 도구로 물으면 느리고 비쌌다. 같은 일을 한 번에 끝내는 가벼운 전용 조회기를 따로 만들어 1순위로 두고, 범용 도구는 그게 실패할 때만 쓰는 폴백으로 내렸다. 자주 하는 일일수록 "할 수 있는 가장 가벼운 방법"을 기본으로 두는 게 쌓이면 큰 차이를 만든다.
알림은 행동할 수 있어야 한다. 모호하면 침묵만 못하다. 봇이 재시작될 때마다 "재시작됐어요"라고 알리게 했더니, 이게 정상인지 사고인지 알 수가 없었다. 문제가 나면 같은 알림이 도배됐다. 직전 기록을 보고 최초 가동인지, 정상 재시작인지, 사고로 추정되는지를 구분해 알리고, 도배는 짧은 시간 묶음으로 눌렀다. 알림 하나하나가 사람의 주의를 가져간다는 걸 잊으면 안 됐다.
경계는 부탁이 아니라 코드로 막는다. 이 봇은 내 메모·문서 전체를 작업 공간으로 쓴다. 아무나 부르거나 민감한 파일을 읽으면 그대로 사고다. 외부 문서나 메시지 안에 "이걸 어디에 공유해라" 같은 지시가 숨어 들어올 수도 있다. 그래서 호출은 나만 가능하게 잠그고, 평가·보상 같은 최상위 민감 영역은 읽기 자체를 차단했다. 외부에서 흘러든 지시는 신뢰하지 않게 했다. 보안은 다 만든 뒤에 덧붙이는 게 아니라, 초기에 박아둬야 하는 골조였다.
창구는 여럿이어도 비서는 하나. 처음엔 슬랙 전용으로 짰는데 데스크톱 앱을 붙이려니 로직이 슬랙에 엉켜 있었다. 모든 호출이 거치는 단일 엔진을 가운데 두고 입구만 여러 개 붙이는 구조로 다시 짰다. 슬랙에서 부르든 앱에서 부르든 같은 맥락으로 흐르고, 한쪽에서 한 일이 다른 쪽에도 바로 보인다.
기능을 더하는 일보다, 스스로 움직이는 무언가를 안전하고 예측 가능하게 길들이는 일에서 훨씬 많이 배웠다.