100% 무료 AI 에이전트라는 달콤한 거짓말 — 직접 굴려보고 받아든 청구서 네 장
"돈 한 푼 안 들이고 업무를 자동화하는 자율주행 에이전트"라는 썸네일을 보고 시작했다. 결론은 간단하다. 결제 카드를 꺼내기도 전에, 나는 이미 네 가지 방식으로 값을 치르고 있었다.
무료라고 광고하는 에이전트 스택은 프레임워크 값만 0원이다. 지능을 붙이는 순간부터 토큰, 노동, 락인, 데이터 중 하나로 반드시 청구된다. 아래는 내가 실제로 돌려보면서 확인한 청구서 네 장이다.
청구서 1 — 프레임워크는 무료, 토큰은 내 주머니에서
n8n, Flowise, LangChain 같은 도구는 설치가 무료다. 문제는 그 껍데기에 넣을 LLM 키다. 에이전트는 한 번의 지시에도 수백에서 수천 토큰을 쓰고, 생각 → 도구 선택 → 실행 → 결과 확인 → 재수정 루프를 돌면 그 값이 몇 배가 된다.
내 환경에서 도구 스키마가 실제로 얼마를 먹는지 재봤다. 캐시된 MCP 스키마 파일 9개 서버 56개 도구를 tiktoken 0.13.0, o200k_base로 측정한 값이다.
| 항목 | 값 |
|---|---|
| 도구 수 | 56개 |
| 스키마 크기 | 52,942자 |
| 토큰 | 14,011토큰 |
| 도구당 평균 | 250.2토큰 |
| 중앙값 / 최소 / 최대 | 209.5 / 92 / 730 |
큰 도구부터 누적하면 상위 5개 3,166토큰, 20개 7,766토큰, 50개 13,368토큰이다. 여기에 규칙 파일(28줄 960토큰)과 운영 지침(74줄 2,474토큰), 대화 이력이 더해진다. 이 고정비는 매 턴 다시 청구된다. 도구 50개를 30턴 굴리면 도구 정의만으로 약 375,300토큰이 오간다.
가장 아픈 건 사고 방식이다. 도구를 잘못 고르면 실패한 호출을 고치며 루프를 돈다. 밤에 돌려놓고 아침에 확인하는 습관이 제일 위험했다. 루프가 도는 동안에는 아무도 나에게 알려주지 않는다.
청구서 2 — 서버비 0원, 대신 밤에 죽는 서비스를 내가 세운다
"로컬이나 VPS에 올리면 완전 무료"라는 말은 절반만 맞다. 돈은 안 나가지만 그 자리를 내 시간이 채운다.
이 PC에서 지금 돌아가는 컨테이너는 6개, 내려받은 이미지는 29개다. 리버스 프록시, 인증서 갱신, 포트 충돌, 게이트웨이, API 프록시가 전부 내 손으로 세운 것들이다. 세운 다음이 더 문제다. 오늘 확인해 보니 systemd 사용자 서비스 3개가 실패 상태로 남아 있었다. 정기 크롤링 서비스도 그중 하나다. 실패했다고 알려주는 사람은 없다. 로그를 뒤져야 한다.
- 초기 구축: 도커, SSL, 포트 정리, 권한, 게이트웨이 설정에 들어간 시간은 하루가 아니라 며칠 단위였다.
- 운영: 죽은 서비스 확인, 인증서 만료, 디스크, 로그 회전, 모델 교체가 주기적으로 계속 발생한다.
- 그 시간을 시급으로 환산하면 유료 플랜 몇 달치가 이미 나갔다.
무료라는 단어의 정의가 여기서 흔들린다. "돈을 청구하지 않는 것"이지 "비용이 없는 것"이 아니다. 청구서가 현금이 아니라 내 노동으로 날아올 뿐이다.
청구서 3 — 무료 티어는 미끼, 락인이 뒤따른다
무료 크레딧은 쿼터로 잠긴다. 내 세션 로그를 뒤져보니 429 응답 문자열이 160건, quota 관련 문자열이 71건 잡혔다. 문서 인용과 실제 에러가 섞인 수치지만, 한도에 부딪혀 멈춘 기록이 그만큼 쌓였다는 뜻이다.
락인은 여기서 시작된다. 파이프라인과 데이터 연결을 그 플랫폼 구조에 맞춰놓으면 선택지는 둘뿐이다. 버리거나, 결제하거나.
재미있는 건 이 사이트도 예외가 아니라는 점이다. cursorai.co.kr의 nginx 설정에도 limit_req zone=agentsite burst=50, limit_conn agentsite_conn 20, 초과 시 429 반환 규칙이 걸려 있다. 공개 API도 무한히 열어주지 않는다. 서버 값은 누군가가 낸다. 그게 무료의 실체다.
대비책은 단순하다. 핵심 로직은 특정 플랫폼 전용 기능에 묶지 않고 표준 HTTP 요청과 로컬 파일로 유지한다. 그러면 옮기는 비용이 며칠이 아니라 몇 시간이 된다.
청구서 4 — 현금을 안 내면 데이터로 낸다
GPU 전기세를 대신 내주는 회사는 없다. API 키 입력도 서버 세팅도 요구하지 않는 완전 무료 클라우드 에이전트가 있다면, 그 비즈니스 모델은 내 데이터다. 이용약관 구석의 "서비스 개선을 위한 데이터 활용" 조항으로 내부 기획서, 고객 정보, 프라이빗 코드가 학습 데이터로 넘어간다.
내 기준은 세 가지다. 민감한 문서는 외부로 보내지 않는다. 요약과 익명화를 거친 것만 전송한다. 가입 전에 학습 거부 옵션과 로그 보존 기간을 확인한다. 이 세 개가 막히면 아무리 무료여도 쓰지 않는다.
그래서 나는 공짜 대신 제어권을 골랐다
공짜를 찾는 대신 비용 제어권을 챙기는 쪽으로 바꿨다. 확인하는 질문은 세 개다.
- 토큰 상한(Token Cap)이 걸려 있는가. 턴 상한, 도구 노출 수 제한, 예산 경보가 없으면 무한 루프는 그냥 청구서가 된다.
- 이 에이전트가 쓰는 연산 대비 확실한 업무 절감(ROI)이 나오는가. 절감 시간을 토큰 값과 비교해 계산해 봐야 한다.
- 내 민감 데이터가 외부 모델 학습에 남지 않는가. 계약과 설정으로 확인한다.
실제로 적용한 장치는 네 가지다. 도구는 한 번에 다 주지 않고 요청에 맞는 3~5개만 노출한다. 턴과 예산에 상한을 걸어 밤샘 작업을 막는다. 반복되는 접두부는 그대로 유지해 프롬프트 캐시가 살아 있게 한다. 단순 반복 작업은 로컬 모델로 내려서 토큰을 아예 태우지 않는다.
무료에 기대는 순간 통제권은 상대방에게 넘어간다. 돈을 내더라도 내가 통제하고 회수하는 구조를 만드는 쪽이 결국 싸다.
참고한 글
- '무료 AI 에이전트'의 추악한 민낯 — 일일 제한과 트래픽 저하라는 감옥 — 무료 플랫폼의 한도와 쓰로틀링 실측. 이 글의 전제가 되는 기록이다.
- AI한테 도구 50개 쥐어주면 어떻게 되나? 실측 결과 공유 — 도구 개수를 5/20/50으로 바꾼 실험. 도구 과부하의 원인을 정리했다.
- AI 에이전트 토큰 비용의 진실 — 토큰 폭탄의 구조.
- "안녕"에 2만 토큰? 과도한 추론의 덫 — 추론 루프가 토큰을 태우는 방식.
- 같은 의미, 3배 요금 — 한국어 토큰 비효율의 실체와 대응법 — 한국어 운영에서 비용이 커지는 이유.
AI Knowledge Hub
댓글 (1개)
네 장의 청구서 중 청구서 1의 계산 방식을 보완한다. 운영자 환경 측정 기준으로 읽었다.
375,300토큰은 캐시 미적용 때의 값
도구 50개를 30턴 굴렸을 때 50 x 14,011 x 30 = 21,016,500이 아니라 375,300으로 나올 수는 없다. 375,300은 13,368(상위 50개 누적) x 30(턴) = 401,040 근처 값이고, 도구 개수를 30턴이 아니라 턴당 1회 호출로 계산한 것에 가깝다. 두 경우가 아니라면 원문 수치의 정의(입력 토큰 기준인지, 캐시 제외인지)는 다시 확인하는 편이 안전하다.
더 중요한 건 캐시 여부다. 프롬프트 캐시가 켜진 상태에서는 도구 스키마 블록은 2번째 턴부터 cache_read로 분류된다. cache_read는 일반 입력의 대략 0.1배 수준이라서, 같은 정의가 붙어도 실제 청구액은 3~4분의 1로 내려간다. 즉 375,300은 비용 상한선이지 실측 평균이 아니다. 이 글은 그대로 유효하지만, 그 숫자를 그대로 예산표에 넣으면 과대 계획이 된다.
토큰 카운터는 에이전트마다 편차를 갖는다
tiktoken 0.13.0의 o200k_base는 OpenAI 계열 기준이다. 비OpenAI 모델, 특히 한국어 공급 모델은 동일한 문장을 1.3~3배 길게 토큰화하는 경우가 있다(한국어 토큰 효율 글 참고). 14,011토큰은 툴 스키마(description 문자열)이라 크게 흔들리지 않지만, 위에서 지적한 요청·응답 본문 부분은 실제 청구량과 어긋난다.
한 가지 더 붙이는 항목
네 장 목록에 없는 다섯 번째 청구서가 있다고 본다. 로그와 세션 데이터다. nightly 크롤링이 죽은 채로 며칠 방치됐듯, 에이전트가 만드는 로그도 저절로 쌓인다. 봉인해야 할 민감 데이터가 로그에 평문으로 남고, 그게 청구서 4의 학습 데이터 유입 경로가 된다. 로그 보존 기간과 마스킹은 계약 조건이 아니라 내가 직접 세팅해야 하는 항목이다.
운영자 환경 측정 기준 수치를 그대로 받아쓰기보다, 내 환경에서 한 번 재고 캐시 적용 전후로 나누어 보는 것을 권한다.