클로드(Claude) PPT, 클로드 코드에 발표 자료 5장 맡겨 보니
클로드 ppt를 클로드 코드에서 만들 때 Opus 5.5, Sonnet 5.5, Haiku 5.5 모두 5장짜리 파일을 3/3으로 완성했습니다. 걸린 시간은 비슷했고 비용 표시는 0.0072달러에서 0.19달러까지 달랐습니다. 요청에 넣을 조건도 함께 확인할 수 있습니다.
Finn ·

클로드 ppt를 앱이 아니라 클로드 코드(Claude Code)에서 만들려고 하면 PowerPoint 기본 스킬부터 쓸 수 없습니다. 그래서 같은 요청으로 Opus 5.5, Sonnet 5.5, Haiku 5.5에 5장짜리 .pptx를 3번씩 만들게 했습니다. 세 모델 모두 3/3으로 검사를 통과했어요. 걸린 시간 중앙값은 25.3~27.5초로 비슷했지만, 비용 표시는 Haiku 5.5가 0.0072달러, Opus 5.5가 0.19달러였습니다.
세 모델 모두 5장을 끝까지 만들었을까요?
네, 이 작업에서는 모두 끝까지 만들었습니다. 요청에는 다섯 장의 제목과 순서, 장마다 글머리표 두 개 이상이라는 조건, 저장 경로(out/deck.pptx)를 넣었습니다. 실행이 끝나면 node --test로 결과 파일을 검사했죠. 아래 값은 3회 중앙값입니다.
| 모델 | 성공 | 걸린 시간 | 입력 토큰 | 출력 토큰 | 추론 토큰 | 도구 호출 | 비용 표시(USD) |
|---|---|---|---|---|---|---|---|
| Opus 5.5 | 3/3 | 27.5초 | 212,612 | 2,235 | 90 | 6 | 0.19 |
| Sonnet 5.5 | 3/3 | 25.9초 | 172,601 | 2,216 | 41 | 5 | 0.087 |
| Haiku 5.5 | 3/3 | 25.3초 | 290,467 | 3,124 | 1,005 | 7 | 0.0072 |
검사 항목은 네 가지입니다. 파일이 있는지, 슬라이드가 정확히 5장인지, 장마다 정한 제목이 순서대로 들어 있는지를 봅니다. 마지막으로 장마다 제목 말고 문단이 두 개 이상인지 확인합니다. 여기에 검사 파일과 package.json을 고치지 않았을 때만 성공으로 셌습니다.
그런데 토큰은 모델마다 꽤 달랐습니다. Haiku 5.5는 출력 토큰이 3,124개로 Opus 5.5보다 1.4배 많았고, 추론 토큰도 1,005개로 가장 많았습니다. 도구 호출 수와 입력 토큰도 함께 달랐지만, 이 측정만으로는 무엇이 원인인지 가를 수 없습니다.

함께 읽을 글
시간과 비용은 얼마나 달랐나요?
걸린 시간은 거의 같았습니다. Sonnet 5.5와 Haiku 5.5는 둘 다 Opus 5.5의 0.9배 수준이었죠. 5장짜리 짧은 자료라면 모델을 바꿔도 기다리는 시간은 크게 달라지지 않았습니다.

그렇다면 차이는 어디서 날까요? 바로 비용 표시입니다. 결과 JSON의 total_cost_usd 값으로 보면 Opus 5.5가 0.19, Sonnet 5.5가 0.087, Haiku 5.5가 0.0072였습니다. 세 모델 모두 3/3을 통과했으니, 이 정도 구조 작업이라면 Haiku 5.5부터 시험해 볼 만하다고 판단할 수 있습니다.

회차별로 보면 첫 회차 비용이 높았습니다. Opus 5.5는 1회차 0.38, 2회차 0.19, 3회차 0.18이었고, Sonnet 5.5도 1회차만 0.18이었습니다. 첫 회차는 캐시 읽기 토큰도 적었지만(Opus 5.5 1회차 175,524), 이 기록만으로 원인을 단정할 수는 없습니다. 직접 확인하고 싶다면 claude -p 결과 JSON의 usage에서 캐시 쓰기·캐시 읽기 값을 회차별로 비교해 보세요.
클로드 코드에선 PPT 스킬을 왜 못 쓰나요?
Agent Skills 공식 문서에 따르면 PowerPoint·Excel·Word·PDF 기본 스킬은 claude.ai, Claude API, Claude Platform on AWS, Microsoft Foundry에서 씁니다. API에서는 코드 실행 도구와 함께 skill_id로 pptx를 지정하죠. 반면 Claude Code에는 이 기본 문서 스킬이 제공되지 않습니다. 필요한 문서 작업 절차는 사용자 스킬로 만들 수 있습니다.
그래서 이 측정은 작업 폴더에 pptxgenjs를 미리 설치해 두고, Claude가 스크립트를 만들어 node로 실행하게 했습니다. 실행 전 폴더의 package.json은 이렇습니다.
{ "name": "task-ppt", "private": true, "type": "module", "scripts": { "test": "node --test" }, "dependencies": { "pptxgenjs": "4.0.1" } }사용처마다 스킬을 쓰는 방식과 실행 환경도 다릅니다. 예를 들어 API의 스킬은 네트워크 없이 미리 설치된 패키지만 쓰지만, Claude Code의 스킬은 내 컴퓨터의 다른 프로그램과 같은 네트워크 접근을 가집니다.

발표 자료를 자주 만든다면 Claude Code의 .claude/skills/(프로젝트)나 ~/.claude/skills/(개인)에 SKILL.md로 직접 스킬을 만들 수 있습니다. 다만 이 측정은 스킬 없이 요청 문장만으로 진행했으니, 스킬을 만들었을 때의 결과는 따로 확인해야 합니다.
샌드박스가 막는 범위
Claude가 셸 명령을 실행하는 만큼, 이 측정에서는 명령이 운영체제 샌드박스 안에서만 돌게 했습니다. 설정은 sandbox.enabled, autoAllowBashIfSandboxed, allowUnsandboxedCommands: false, failIfUnavailable: true입니다. 샌드박스 안에서는 작업 폴더와 임시 폴더에만 쓸 수 있고, 네트워크는 막힙니다.
샌드박스 공식 문서를 보면 각 설정의 역할이 나옵니다.
- 기본으로 쓸 수 있는 곳: 현재 작업 폴더, 사용자별 임시 폴더,
--add-dir등으로 추가한 폴더 allowUnsandboxedCommands를false로 두면: 샌드박스에서 실패한 명령을 밖에서 다시 실행하는 우회 경로가 꺼짐failIfUnavailable을 함께 두면: 샌드박스가 시작되지 않을 때 명령을 샌드박스 밖에서 실행하지 않음
이럴 때는 실행 중에 패키지를 새로 받을 수 없습니다. 그래서 측정 쪽에서 npm install을 먼저 실행해 두었죠. 혼자 이 방식을 쓴다면 필요한 라이브러리를 미리 설치하고, 요청에 "설치돼 있다"고 적어 두는 편이 안전합니다. 참고로 모든 회차에서 권한 거부가 1번씩 기록됐고(Haiku 5.5 1회차는 2번), 무엇이 거부됐는지는 이 기록에 없습니다.
발표 자료를 맡길 때 요청에 넣을 것
이 측정에서 3/3을 받은 요청은 아래와 같습니다. 요청이 덜 구체적일 때 결과가 어떻게 달라지는지는 재지 않았습니다. 다만 아래 요소를 모두 넣은 요청으로는 세 모델이 모두 통과했습니다.
다음 내용으로 5장짜리 발표 자료를 만들어 out/deck.pptx로 저장해 주세요. 이 폴더에는 pptxgenjs가 설치돼 있으니 스크립트를 만들어 node로 실행하면 됩니다. 장마다 제목은 1장 1인 개발 회고, 2장 이번 달 한 일, 3장 잘된 점, 4장 아쉬운 점, 5장 다음 달 계획이고, 각 장에 글머리표를 두 개 이상 넣어 주세요. 다 만든 뒤 node --test로 확인해 주세요.- 저장 경로와 파일 이름
- 미리 설치된 라이브러리와 실행 방법
- 장마다 들어갈 제목과 순서
- 장마다 글머리표 개수 같은 최소 조건
- 끝난 뒤 돌릴 검사 명령
검사 명령이 의미가 있으려면 검사 파일이 있어야 합니다. 이 측정에서 쓴 test/deck.test.js는 .pptx를 unzip으로 열어 슬라이드 XML을 읽습니다.
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { execFileSync } from 'node:child_process';
import { existsSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
const file = fileURLToPath(new URL('../out/deck.pptx', import.meta.url));
const titles = ['1인 개발 회고', '이번 달 한 일', '잘된 점', '아쉬운 점', '다음 달 계획'];
const slides = () => execFileSync('unzip', ['-Z1', file], { encoding: 'utf8' }).split('\n').filter((n) => /^ppt\/slides\/slide\d+\.xml$/.test(n));
const xml = (n) => execFileSync('unzip', ['-p', file, `ppt/slides/slide${n}.xml`], { encoding: 'utf8' });
test('out/deck.pptx가 있다', () => {
assert.ok(existsSync(file));
});
test('슬라이드가 정확히 5장이다', () => {
assert.equal(slides().length, 5);
});
test('장마다 정한 제목이 순서대로 들어 있다', () => {
titles.forEach((t, i) => assert.ok(xml(i + 1).includes(t), `${i + 1}장: ${t}`));
});
test('장마다 제목 말고 문단이 두 개 이상 있다', () => {
for (let i = 1; i <= 5; i++) {
const paras = (xml(i).match(/<a:p>/g) ?? []).length;
assert.ok(paras >= 3, `${i}장 문단 ${paras}개`);
}
});제목만 바꾸면 다른 발표 자료에도 그대로 쓸 수 있는 형태입니다. 모델을 고를 때도 이런 검사를 먼저 두고, 싼 모델이 통과하는지부터 확인하는 편이 좋겠습니다.
측정 조건과 한계
- 환경: Claude Code 2.1.309, darwin arm64, Node.js v22.23.1
- 실행: 조건마다 작업 폴더를 새 임시 폴더로 복사하고
claude -p로 비대화형 실행, 3번씩 번갈아 돌려 중앙값 사용 - 설정:
--setting-sources project,--strict-mcp-config로 사용자 설정·사용자 스킬·플러그인·훅·MCP 서버를 불러오지 않음 - 권한:
--permission-mode acceptEdits로 파일 수정은 자동 허용, 명령은node --test만 허용 - 모델 외 조건: 같은 요청 문장, 기본 추론 강도
- 걸린 시간: 명령 시작부터 끝까지
한계도 분명합니다. 검사는 슬라이드 수, 제목 순서, 문단 수 같은 구조만 봤고 디자인 품질은 재지 않았습니다. 그리고 5장짜리 짧은 자료 하나만 다뤘죠. 장수가 많거나 표·이미지가 들어가는 자료라면 결과가 달라질 수 있으니, 자기 자료에 맞는 검사 파일로 다시 돌려 보세요.
참고 자료
- Agent Skills platform.claude.com
- Configure the sandboxed Bash tool code.claude.com