Baseline
10장 생성 · 내용 보완 필요
- 작성 도구
- PptxGenJS
- 슬라이드
- 10
- 네이티브 표 / 차트
- 10 / 0
- 모델 이미지 입력
- 10개
- 실행 시간
- 221초
- 첫 파일 관측
- 157초
- 관측 최고 메모리
- 504 MiB
- 모델 호출
- 20회
- 총비용
- $0.0768
- 구조 검사
- 통과
같은 10장 요청 · 같은 Gemma 모델 · 같은 설치 도구. 기존 Baseline / GenOffice / Claude PPT 결과에 GenOffice + uni-verification 조건 1회를 추가했습니다.
장별 작성·검사 왕복을 줄이면 빨라지는지 확인하기 위해 기존 GenOffice에 일괄 작성·검증 조건 1회를 추가했습니다. 같은 10장 요청과 Gemma 모델로 실제 PPTX와 PDF를 만들었고, 원본 스킬 대비 변경 내용과 최종 산출물을 함께 공개합니다.
공식 스킬의 3단계만 C1 방식으로 바꿨습니다. style·outline 작성과 outline 검사는 그대로 두고, 10장 JSON을 함께 작성한 뒤 한 terminal 호출에서 모든 페이지를 검사합니다. 페이지 파일은 각각 유지하며, 오류가 있는 장만 수정·재검사합니다. 최종 PPTX 생성·렌더·전체 이미지 검수·audit도 유지합니다.
여기서 uni-verification은 검증을 조율하는 모델 왕복을 묶는다는 뜻입니다. CLI의 페이지별 검사까지 한 번으로 줄이거나 검사를 생략한다는 뜻은 아닙니다. 이 변경은 일괄 작성과 style·outline 반복 읽기 제거도 포함하므로 검증 병합만의 효과를 분리한 실험은 아닙니다.
기존 GenOffice → uni-verification: 전체 실행 428.9 → 466.7초(+8.8%), 첫 파일 관측 416.8 → 433.1초(+3.9%), 모델 호출 20 → 15회(−25%), 비용 $0.071373 → $0.078557(+10.1%). 출력 토큰은 20,330 → 30,136개입니다. 기존은 DeepInfra, 추가 실행은 CoreWeave로 라우팅됐습니다. 모델 ID는 같지만 공급자·시각·생성 내용은 통제되지 않았습니다.
실제 동작은 6장+4장의 두 응답으로 최초 작성 → 10장 일괄 검사 → style 및 2–10번 페이지 수정 → 10장 전체 재검사였습니다. 마지막 페이지 검사 10건은 모두 audit·outline·offPalette 지적이 없었습니다. 오류 장만 재검사하라는 지침 대신 정상 장도 다시 검사했으며, GUI 렌더 실패 뒤 공통 LibreOffice 경로를 사용하지 않아 모델 이미지 검수는 누락됐습니다.
참고 C1의 c1-r1은 361.0초·17회·29/45, c1-r2는 529.6초·14회·30/45입니다. 두 실행의 평균 최종 파일 시간은 445.3초입니다. Luna를 사용한 외부 실험의 수치를 이번 Gemma의 개선율로 환산하지 않았습니다.
기존 세 조건은 17시대 실행을 보존했고, uni-verification을 별도 세션에서 추가 실행했습니다. Docker 이미지 digest·Hermes revision·GenOffice 원본 스킬 hash·사용자 원문·공통 환경 지침이 일치합니다. 모든 조건은 독립된 메모리와 작업 공간을 사용합니다.
google/gemma-4-31b-it · reasoning medium · 30분/80턴 · 조건별 2 CPU / 2 GiB · 순차 생성 · LibreOffice 공통 렌더
10장 생성 · 내용 보완 필요
10장 생성 · 시각 검수 미준수
10장 생성 · 일괄 검사 수행 · 이미지 검수 미준수
10장 생성 · 스킬·내용 보완 필요
비용은 OpenRouter 응답의 usage.cost입니다. 누락이 있으면 미확인으로 표시합니다. 첫 파일·메모리는 3초 간격으로 관측한 값입니다. 이미지 입력 수는 실제 모델 요청에 포함된 서로 다른 이미지 수이며, 평가자가 사후 렌더한 이미지는 포함하지 않습니다.
Langfuse 재조회: 기존 GenOffice 20/20 호출(2026-10-22 19:06 KST), 추가 uni-verification 15/15 호출(19:15 KST). 추가 비용 $0.07855734가 로컬 OpenRouter 응답 합계와 일치했습니다. 기존 Baseline 20/20·Claude PPT 26/26은 앞선 17:55 KST 조회 기록입니다.
다음 내용으로 경영진 보고용 PowerPoint 10장을 만들어 주세요. 디자인은 깔끔하고 세련되게, 표와 도표를 적극적으로 써 주세요. 주제: 강남A현장 3분기 공정·안전·원가 현황 보고 (2026년 7~9월) 1. 표지: 강남A현장 3분기 현황 보고, 2026.10.21, 공사관리팀 2. 현장 개요: 지하 4층·지상 25층 업무시설, 연면적 48,200㎡, 공사기간 2025.03~2027.08, 공정률 계획 52% / 실적 49% 3. 월별 공정률: 7월 계획 40%·실적 39%, 8월 46%·44%, 9월 52%·49% 4. 주요 공종 진행: 골조 지상 14층 완료(계획 16층), 외장 커튼월 착수(5층까지), 설비 배관 지하층 완료, 전기 간선 공사 60% 5. 지연 원인: 8월 집중호우 6일 작업 중지, 철근 수급 지연 4일, 타워크레인 정기점검 2일 6. 만회 대책: 10월부터 골조 2개 조 운영, 주말 작업 4회, 커튼월 협력사 인원 30% 증원, 11월 말 계획 공정률 회복 목표 7. 안전 현황: 3분기 무재해 92일, 아차사고 보고 14건(추락 5·낙하물 4·전도 3·기타 2), 안전교육 이수율 98%, 위험성평가 개선 조치 21건 완료 8. 원가 현황: 실행예산 1,420억 원, 3분기 누적 집행 690억 원(48.6%), 자재비 상승으로 철근 +3.2억·레미콘 +1.8억 증액 예상 9. 협력사 현황: 협력사 9팀, 3분기 평가 상위(신우건설·대명설비), 개선 필요 1팀(외장 인원 부족) 10. 4분기 계획 및 요청 사항: 골조 25층 완료, 커튼월 15층, 공정률 70% 목표 / 요청: 철근 단가 조정 승인, 동절기 보양비 2.5억 사전 승인원문 TXT · SHA-256
520e01ad767dc435d70a5cb30fb49ca8f7317aa424bcf5eae675ce33770e2166This is an authorized presentation workflow comparison. Use the user's original question as the content brief and preserve every fact. Save the final presentation to /data/workspace/gangnam-review.pptx and keep your source files in /data/workspace.
Installed tools: GenOffice CLI 0.10.0, PptxGenJS 4.0.1, Node.js, Python, LibreOffice, Poppler, markitdown, Pillow, lxml, defusedxml, React, react-icons and sharp. Node modules are available through NODE_PATH=/opt/presentation-tools/node_modules. Local PptxGenJS API declarations are /opt/presentation-tools/node_modules/pptxgenjs/types/index.d.ts. Consult installed API definitions or tool help when an API is uncertain; do not repeatedly guess after an error. Korean Noto fonts are available.
There is no restriction against intermediate style sheets, outlines, page specifications or scripts. No palette, typography, layout template, chart count or table count is prescribed beyond the user's question. Follow the original authoring and quality workflow of the skill preloaded by Hermes --skills. Skill resource paths are relative to its actual directory. Do not load or consult other presentation skills. With no preloaded presentation skill, choose freely among the same installed tools.
The GenOffice GUI renderer is unavailable inside this headless environment. For all conditions use this shared visual QA route: libreoffice -env:UserInstallation=file:///tmp/lo-model --headless --convert-to pdf --outdir /data/workspace /data/workspace/gangnam-review.pptx, then pdftoppm -jpeg -r 110 /data/workspace/gangnam-review.pdf /data/workspace/slide. Inspect the rendered slide images with vision_analyze; it passes actual pixels to this same Gemma model. Generating image files is not visual inspection.
Before reporting completion, check that the final PPTX exists, opens, contains exactly the requested ten slides and all requested facts, and that the required skill checks succeeded. Inspect every slide, correct issues you find in the source, and rerender after corrections. If generation fails, use the returned error and installed documentation to repair it. Never report a file as created unless it exists. Report unresolved limitations honestly. All conditions share this environment and user question. Each condition is limited to 30 minutes and 80 model calls.
실행 자원 설정(프롬프트 외): {"memory": "2g", "cpus": 2, "nodeHeapMiB": 512, "parallelism": 1, "workerNetwork": "internal; OpenRouter only through authenticated model proxy"}환경 입력 TXTBaseline은 발표자료 스킬을 적재하지 않습니다. GenOffice는 --skills genoffice, Claude PPT는 --skills pptx로 실행합니다. 도구·문서·라이브러리·모델·원문·제한 시간은 같습니다. 기본 내장 스킬은 비활성화하여 다른 발표자료 스킬이 섞이지 않게 했습니다.
추가 조건도 --skills genoffice를 사용하되 격리된 컨테이너에 실험용 스킬을 읽기 전용으로 마운트했습니다. 운영 스킬은 변경하지 않았습니다. 원문·환경 지침 hash와 실제 모델 입력의 스킬 전문 포함 여부를 추가 실행 JSON에 기록했습니다.
{
"harnessCommit": "835c3dd038d903182a66ecc45e34bf5e0de65f00",
"image": "sha256:58e31cc6d0553d3f65fd11406a2143b3b87a578288e331d2d0654058f8ca30a9",
"resourcePolicy": {
"memory": "2g",
"cpus": 2,
"nodeHeapMiB": 512,
"parallelism": 1,
"workerNetwork": "internal; OpenRouter only through authenticated model proxy"
}
}| 항목 | 이번 실험 | 해석 |
|---|---|---|
| 원문 | 강남A현장 831자 원문 동일 | 이전 실험과 SHA-256 일치 |
| 스킬 적재 | 네이티브 CLI --skills | 이전 수동 본문 주입 방식에서 변경 |
| 공식 작성 흐름 | 중간표현 허용, 원본 스킬 전문 전달 | 전달 여부와 실제 준수 여부는 별도 확인 |
| 모델·후보 | Gemma · 기존 세 조건 + 일괄 검증 1회 | 참고 보고서의 GPT-6 Luna·다수 후보와 다름 |
| 렌더·격리 | LibreOffice · Docker 내부망 | GenOffice GUI·gVisor 환경과 다름 |
| 평가 | 실제 파일·명령·수치·이미지 확인 | 참고 보고서의 블라인드 채점은 미실시 |
이미지를 누르면 확대됩니다. 생성 이후 산출물 자체를 사람이 수정하지 않았습니다.
{
"nativeSessionId": "20261022_174150_6905ec",
"inputVerification": {
"exactBrief": true,
"commonEnvironment": true,
"fullSelectedSkill": null,
"reasoningEffort": "medium",
"model": "google/gemma-4-31b-it",
"nativeCliCommand": [
"python",
"-m",
"hermes_cli.main",
"chat",
"--query-file",
"/data/question.txt",
"--format",
"stream-json",
"--toolsets",
"terminal,file,vision",
"--max-turns",
"80",
"--run-budget",
"1800",
"--reasoning",
"medium",
"--yolo"
]
},
"skillHashes": {},
"workflow": {
"genofficeCreate": 0,
"stagedCheck": 0,
"genofficeAudit": 0,
"claudeValidate": 0,
"markitdown": 0,
"modelViewedImages": 10,
"successfulVisionCalls": 10,
"successfulStagedCheckResults": 0,
"successfulGenofficeAuditResults": 0
},
"trace": {
"traceId": "94a3fc382ec6817edad227eaacde6364",
"runId": "gangnam-native-v2-1792658073884-baseline",
"environment": "hermes-migration-validation",
"checkedAt": "2026-10-22T08:55:08.751Z",
"httpStatus": 200,
"timestamp": "2026-10-22T08:41:49.389Z",
"observations": 20,
"totalCost": 0.076757735
},
"traceId": "94a3fc382ec6817edad227eaacde6364",
"externalVerification": {
"pptx": true,
"validator": 0,
"genofficeAudit": 0,
"renderer": 0,
"at": "2026-10-22T08:45:39.269Z"
}
}{
"nativeSessionId": "20261022_173436_62ecfa",
"inputVerification": {
"exactBrief": true,
"commonEnvironment": true,
"fullSelectedSkill": true,
"reasoningEffort": "medium",
"model": "google/gemma-4-31b-it",
"nativeCliCommand": [
"python",
"-m",
"hermes_cli.main",
"chat",
"--query-file",
"/data/question.txt",
"--format",
"stream-json",
"--toolsets",
"terminal,file,vision",
"--max-turns",
"80",
"--run-budget",
"1800",
"--reasoning",
"medium",
"--yolo",
"--skills",
"genoffice"
]
},
"skillHashes": {
"genoffice": "fb61206b7b60fa901f0cdfb9286d066b0a77bab927b3ac4686598f17ee864e55"
},
"workflow": {
"genofficeCreate": 1,
"stagedCheck": 17,
"genofficeAudit": 1,
"claudeValidate": 0,
"markitdown": 0,
"modelViewedImages": 0,
"successfulVisionCalls": 0,
"successfulStagedCheckResults": 16,
"successfulGenofficeAuditResults": 1
},
"trace": {
"traceId": "5d5720bd417de7476aac7468213a7a54",
"runId": "gangnam-native-v2-1792658073884-genoffice",
"environment": "hermes-migration-validation",
"checkedAt": "2026-10-22T08:55:06.890Z",
"httpStatus": 200,
"timestamp": "2026-10-22T08:34:34.999Z",
"observations": 20,
"totalCost": 0.071373465
},
"traceId": "5d5720bd417de7476aac7468213a7a54",
"externalVerification": {
"pptx": true,
"validator": 0,
"genofficeAudit": 0,
"renderer": 0,
"at": "2026-10-22T08:41:51.561Z"
}
}{
"nativeSessionId": "20261022_190728_81cc2f",
"inputVerification": {
"exactBrief": true,
"commonEnvironment": true,
"fullSelectedSkill": true,
"reasoningEffort": "medium",
"model": "google/gemma-4-31b-it",
"nativeCliCommand": [
"python",
"-m",
"hermes_cli.main",
"chat",
"--query-file",
"/data/question.txt",
"--format",
"stream-json",
"--toolsets",
"terminal,file,vision",
"--max-turns",
"80",
"--run-budget",
"1800",
"--reasoning",
"medium",
"--yolo",
"--skills",
"genoffice"
]
},
"skillHashes": {
"genoffice-uni": "3710e1fcae8ce2ba3b5e19c321957baa436cba36cbcab74c1df7b84dd205a58d"
},
"workflow": {
"genofficeCreate": 1,
"stagedCheck": 3,
"genofficeAudit": 2,
"claudeValidate": 0,
"markitdown": 0,
"modelViewedImages": 0,
"successfulVisionCalls": 0,
"successfulStagedCheckResults": 21,
"successfulGenofficeAuditResults": 1
},
"batchVerification": {
"initialAuthoringBatches": [
[
1,
2,
3,
4,
5,
6
],
[
7,
8,
9,
10
]
],
"pageCountBeforeFirstPageCheck": 10,
"pageCheckTerminalRounds": 2,
"perPageCheckResults": 20,
"checks": [
{
"message": 6,
"command": "genoffice slides check /data/workspace/gangnam-review/outline.json --json",
"pageFilesExisted": 0,
"reports": [
{
"kind": "outline",
"page": null,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
}
]
},
{
"message": 23,
"command": "for f in /data/workspace/gangnam-review/pages/*.json; do genoffice slides check \"$f\" --json; done",
"pageFilesExisted": 10,
"reports": [
{
"kind": "page",
"page": 0,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 1,
"status": "ok",
"auditFindings": 2,
"outlineFindings": 0,
"offPalette": 2
},
{
"kind": "page",
"page": 2,
"status": "ok",
"auditFindings": 1,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 3,
"status": "ok",
"auditFindings": 3,
"outlineFindings": 0,
"offPalette": 2
},
{
"kind": "page",
"page": 4,
"status": "ok",
"auditFindings": 3,
"outlineFindings": 0,
"offPalette": 2
},
{
"kind": "page",
"page": 5,
"status": "ok",
"auditFindings": 3,
"outlineFindings": 0,
"offPalette": 1
},
{
"kind": "page",
"page": 6,
"status": "ok",
"auditFindings": 4,
"outlineFindings": 0,
"offPalette": 1
},
{
"kind": "page",
"page": 7,
"status": "ok",
"auditFindings": 3,
"outlineFindings": 0,
"offPalette": 2
},
{
"kind": "page",
"page": 8,
"status": "ok",
"auditFindings": 2,
"outlineFindings": 0,
"offPalette": 3
},
{
"kind": "page",
"page": 9,
"status": "ok",
"auditFindings": 2,
"outlineFindings": 0,
"offPalette": 0
}
]
},
{
"message": 39,
"command": "for f in /data/workspace/gangnam-review/pages/*.json; do genoffice slides check \"$f\" --json; done",
"pageFilesExisted": 10,
"reports": [
{
"kind": "page",
"page": 0,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 1,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 2,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 3,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 4,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 5,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 6,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 7,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 8,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 9,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
}
]
}
],
"latestPageChecks": [
{
"kind": "page",
"page": 0,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 1,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 2,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 3,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 4,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 5,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 6,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 7,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 8,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
},
{
"kind": "page",
"page": 9,
"status": "ok",
"auditFindings": 0,
"outlineFindings": 0,
"offPalette": 0
}
],
"allTenLatestChecksClear": true,
"successfulToolResults": 33,
"visionCalls": [],
"sourceMutationAfterFirstVision": null,
"responseLatencySeconds": [
15.476,
26.882,
100.088,
62.946,
2.916,
11.605,
52.647,
48.147,
85.791,
4.139,
3.465,
2.454,
7.267,
5.241,
17.451
],
"inputTokens": 683111,
"outputTokens": 30136,
"tokenUsageCoverage": {
"recorded": 15,
"responses": 15
},
"providers": [
"CoreWeave"
]
},
"trace": {
"traceId": "c07ba0e3c546f4012ced4255ea4fa8b3",
"runId": "gangnam-uni-v1-1792663646356-genoffice-uni",
"environment": "hermes-migration-validation",
"checkedAt": "2026-10-22T10:15:28.996Z",
"httpStatus": 200,
"timestamp": "2026-10-22T10:07:26.787Z",
"observations": 15,
"totalCost": 0.07855734
},
"traceId": "c07ba0e3c546f4012ced4255ea4fa8b3",
"externalVerification": {
"pptx": true,
"validator": 0,
"genofficeAudit": 0,
"renderer": 0,
"at": "2026-10-22T10:15:20.236Z"
}
}{
"nativeSessionId": "20261022_174536_70ac61",
"inputVerification": {
"exactBrief": true,
"commonEnvironment": true,
"fullSelectedSkill": true,
"reasoningEffort": "medium",
"model": "google/gemma-4-31b-it",
"nativeCliCommand": [
"python",
"-m",
"hermes_cli.main",
"chat",
"--query-file",
"/data/question.txt",
"--format",
"stream-json",
"--toolsets",
"terminal,file,vision",
"--max-turns",
"80",
"--run-budget",
"1800",
"--reasoning",
"medium",
"--yolo",
"--skills",
"pptx"
]
},
"skillHashes": {
"claude": "a7ff03e2c85b636f55232a6b1555f5dd90216b7a1a359ab289d8364e6acbc6a0"
},
"workflow": {
"genofficeCreate": 0,
"stagedCheck": 0,
"genofficeAudit": 0,
"claudeValidate": 2,
"markitdown": 1,
"modelViewedImages": 10,
"successfulVisionCalls": 10,
"successfulStagedCheckResults": 0,
"successfulGenofficeAuditResults": 0
},
"trace": {
"traceId": "7dfafabf7195725afe1e53ae8d3333ec",
"runId": "gangnam-native-v2-1792658073884-claude",
"environment": "hermes-migration-validation",
"checkedAt": "2026-10-22T08:55:11.060Z",
"httpStatus": 200,
"timestamp": "2026-10-22T08:45:34.962Z",
"observations": 26,
"totalCost": 0.28316044
},
"traceId": "7dfafabf7195725afe1e53ae8d3333ec",
"externalVerification": {
"pptx": true,
"validator": 0,
"genofficeAudit": 0,
"renderer": 0,
"at": "2026-10-22T08:54:57.843Z"
}
}