AI 도구 목록

교정 검수에서 비용의 절반 넘게가 눈에 안 보이는 생각 토큰이었다

2026년 10월 14일Importants Studio

글을 올리기 전에는 proofread.py로 어색한 문장을 한 번 검사합니다. 결과는 지적 몇 줄이 담긴 JSON이라서, 처음에는 출력 비용도 작을 것이라 생각했습니다. 단가표에서 입력과 출력 가격만 보고 모델을 골랐던 이유입니다.

그런데 장부를 모아 보니 보이는 결과와 청구된 출력은 달랐습니다. 추론 모델은 답을 만들기 전에 쓴 생각 토큰도 출력 토큰에 포함해 돌려줍니다. 검수 결과가 짧아도 비용은 적지 않았습니다.

먼저 결론부터

  • 장부에는 2026-09-02부터 2026-10-13까지 527건의 검수 호출이 남아 있습니다.
  • 가장 많이 쓴 luna는 490편에서 $0.6655가 들었고, 편당 비용은 약 $0.00136이었습니다.
  • luna 전체 비용 중 출력분은 $0.4926으로 74%였으며, 추론 토큰만 계산해도 $0.3434로 전체의 51.6%였습니다.
  • 응답의 output_tokens에는 추론 토큰이 이미 포함됩니다. 화면에 보이는 JSON만 따로 세면 실제 비용을 놓칩니다.
proofread.py --cost
  • 출력 한도는 8000으로 두었습니다. 한도를 작게 잡으면 생각 토큰만 쓰다가 본문 없이 응답이 끝나는 문제가 있었습니다.
  • 같은 글을 다시 검사해도 새 지적은 거의 나오지 않아, 검사 결과를 저장한 뒤 두 번째부터는 저장본을 보여 주고 있습니다. 저장된 글은 412편입니다.

짧은 검수 결과만 보고 비용을 잘못 짚었습니다

코드에 적어 둔 luna의 단가는 100만 토큰당 입력 0.20, 출력 1.20입니다. terra는 입력 2.00, 출력 12.00입니다. 장부를 집계하니 출력 쪽이 더 컸습니다.

luna는 입력 864,702 토큰, 출력 410,499 토큰을 썼습니다. 입력분은 $0.1729였고 출력분은 $0.4926이었습니다. 출력 토큰이 입력보다 적어도 출력 단가가 높아서 비용의 74%를 차지했습니다.

구분입력 토큰출력 토큰추론 토큰합계
luna864,702410,499286,152$0.6655
terra49,41127,27123,963$0.4261
flash-7,5067,337$0.0318

검수 결과에는 문장 번호와 지적 유형, 수정 의견만 담깁니다. 그러나 응답의 output_tokens에는 모델이 내부에서 쓴 추론 토큰도 함께 들어옵니다. luna 출력 410,499 토큰 가운데 추론 토큰은 286,152였습니다. 출력의 69.7%입니다.

눈에 보이지 않는 부분이 더 컸습니다.

추론 토큰만 luna 출력 단가로 계산하면 $0.3434입니다. 전체 비용 $0.6655의 51.6%에 해당합니다. JSON 몇 줄만 보고 비용을 어림했던 방식이 여기서 맞지 않았습니다.

호출 전에는 생각 토큰을 셀 수 없었습니다

입력 토큰은 글 길이로 어느 정도 짐작이 됩니다. luna 한 편의 평균은 입력 약 1,765 토큰, 출력 약 838 토큰으로 장부에 남았습니다. 하지만 추론 토큰은 요청을 보내기 전에는 알 수 없었습니다.

그래서 호출별 응답 사용량을 logs/proofread-usage.jsonl에 남기게 했습니다. 추정값을 계산하는 대신, 응답이 돌아온 뒤 입력·출력·추론 토큰과 비용을 같이 기록하는 방식입니다.

luna 호출 비용도 폭이 있었습니다. 최저 $0.00022, 최고 $0.002502이었습니다. luna 490건 가운데 35건은 출력의 90% 이상이 추론 토큰이었습니다. 같은 분량의 글이라도 모델이 어느 문장에서 오래 머무르는지는 호출 전에는 분간되지 않았습니다.

terra 쪽은 더 선명했습니다. 출력 중 추론 토큰 비율이 87.9%였습니다. flash는 97.7%였습니다. terra의 편당 비용은 $0.0125로 luna의 약 9.2배였습니다. 다만 이 장부는 비용 기록일 뿐이라, 모델별 검수 품질 차이까지 말해 주는 것은 아닙니다.

출력 한도는 답변 길이만 제한하지 않았습니다

검수 호출은 reasoning effort를 low로 두고, max_output_tokens는 8000으로 설정했습니다.

문제는 생각 토큰도 같은 한도 안에 들어간다는 점입니다. 모델이 문장을 검토하는 데 토큰을 쓰고, 본문으로 돌려줄 JSON을 만들기 전에 한도에 닿는 일이 생깁니다. 코드 주석에는 생각만 하다 본문이 빈 채로 돌아온 경우를 적어 두었습니다.

max_output_tokens = 8000

이 값은 검수 결과의 최대 길이만 뜻하는 게 아닙니다. 모델이 결과를 내기 전까지 쓸 수 있는 생각의 공간까지 포함한 값입니다. 출력이 짧다고 한도를 줄이면 비용은 줄어들 수 있지만, 검사 자체가 끝나지 않는 경우가 생겼습니다.

프롬프트를 바꾼 뒤에는 재검사를 멈췄습니다

글 전체를 통째로 넣고 어색한 곳을 찾아 달라고 했을 때는 없음이 돌아왔습니다. 실제로 고칠 문장이 있어도 결과에서 빠졌습니다. 비용을 들이고도 검수 결과를 얻지 못한 셈입니다.

문장에 번호를 붙이고, 찾을 유형을 예시로 주고, JSON 형식을 강제한 뒤에는 시험에서 8개 중 8개를 찾았습니다. 멀쩡한 문장은 4개 중 오탐이 0개였습니다. 이 수치는 모델을 바꿔 비교한 결과가 아니라, 같은 모델에서 프롬프트 방식을 바꾼 기록입니다.

그 뒤 같은 글을 다시 보내는 일도 줄였습니다. 재검사에서는 새 지적이 거의 나오지 않았고 비용만 더해졌습니다. logs/proofread-checked.json에 결과를 저장해 두고, 이미 검사한 글은 저장된 결과를 보여 주도록 바꿨습니다.

검수 호출은 글 한 편에 한 번입니다. 그 한 번의 비용을 결정하는 것은 화면에 남는 JSON 길이만이 아니었습니다. 장부를 열어 보기 전까지는 보이지 않았던 생각 토큰이, 실제 비용의 절반을 넘고 있었습니다.