본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 04. 00:37

AI에게 3D 캐릭터를 움직이게 하기. 단, '추론은 단 한 번뿐'이라는 점에 집착한 이야기

요약

AI 에이전트의 과도한 추론 비용 문제를 해결하기 위해, 단 한 번의 추론만으로 3D 애니메이션을 생성하는 도구 Animato를 소개합니다. LLM은 짧은 Python 코드를 생성하는 역할만 수행하고, 무거운 연산은 로컬 CPU에서 처리하여 효율성을 극대화했습니다.

핵심 포인트

  • 에이전트 루프를 최소화하여 추론 비용과 GPU 부하 절감
  • LLM은 코드 생성에만 집중하고 무거운 작업은 로컬에서 수행
  • 충분한 컨텍스트를 제공하여 단 한 번의 추론으로 정답 도출
  • Blender(bpy)를 활용한 로컬 기반의 애니메이션 처리

최근의 AI 에이전트(AI Agent)는 엄청나게 편리하지만, 한 가지 계속 마음에 걸리는 점이 있습니다.

"이거, 좀 너무 많이 호출하는 거 아니야?"

무언가를 부탁할 때마다 모델이 뒤에서 수십 번씩 자문자답하며 GPU를 5분, 10분씩 계속 돌리고, 정신을 차려보면 무료 할당량(Free tier)이 다 녹아버립니다. 작동할 때는 똑똑해 보이지만, 뒷모습을 상상하면 "아니, 그렇게까지 많이 생각하지 않아도 되는데"라는 기분이 들곤 하죠.

그래서 3D 애니메이션을 만드는 도구를 작성하던 중, 그 위화감이 가장 강하게 느껴졌습니다. 기왕 하는 김에 "AI를 가능한 한 적게 사용한다"라는 방향에 올인한 도구를 만들어 보았기에, 그 이야기를 해보려 합니다.

리포지토리는 여기입니다.

Animatoの動作プレビュー

리깅(Rigging)이 된 3D 모델을 업로드하고, "손을 흔들어줘"와 같이 일본어(또는 영어)로 작성하면 재생 가능한 애니메이션이 돌아오는 도구입니다. Blender를 열 필요도 없고, GPU도 필요 없으며, 구독 결제도 필요 없습니다.

제작 동기 — AI를 '더 많이'가 아니라 '더 적게' 쓰고 싶었다

3D 캐릭터에 움직임을 주는 것은 보통 꽤 번거롭습니다. Blender를 배우거나, 유료 모션 생성 서비스에 돈을 써야 하죠. 후자는 간편하지만 내부가 블랙박스이고 비용도 발생합니다.

"AI에게 시키면 되잖아"라고 생각할 수도 있지만, 여기서 처음 이야기로 돌아갑니다. 이른바 AI 에이전트 계열의 도구에 통째로 맡기면, 모델이 모델을 불러오고, 시행착오를 거치고, 렌더링하는 과정을 전부 AI 측에서 처리하려고 하기 때문에 추론(Inference) 횟수가 점점 불어납니다.

많은 "AI 에이전트" 도구들은 모델을 용광로처럼 다룹니다. 사용자의 프롬프트(Prompt) 하나가 뒤에서 수십 번의 투기적인 호출로 분기되고, 각각이 GPU 클러스터를 5~10분씩 계속 돌립니다. 개발자의 지갑과 지구의 탄소 예산을 동시에 태우고 있는 셈입니다. 게다가 그 대부분은 굳이 할 필요가 없는 처리인 경우가 많습니다.

프로바이더(Provider)는 이러한 습관을 기꺼이 보조해 줍니다. 오늘 호출마다 적자를 내더라도, 내일 당신을 의존하게 만들고 싶으니까요. ...뭐, 그것도 하나의 비즈니스이긴 하지만, 우리가 거기에 올라탈 의리도 없다고 생각했습니다.

그래서 생각을 반대로 바꿨습니다. 이 프로젝트는 그 정반대에 승부수를 던집니다.

AI가 실제로 무엇을 하는지 파악한다. 여기서 AI의 역할은 "짧은 Python 코드 한 줄을 쓰는 것"뿐입니다. 저렴한 추론이 한 번 실행될 뿐이지, 쿼터(Quota)를 다 써버리는 에이전트 루프가 아닙니다. -
무거운 처리는 로컬에서 한다. 모델 로드, 골격(Skeleton) 분석, 키프레임 베이크(Bake), 내보내기 같은 무거운 작업은 전부 bpy를 통해 자신의 CPU가 수행합니다. 여기에 토큰(Token)은 단 하나도 쓰지 않습니다. -
AI에게 처음에 모든 것을 전달한다. 프롬프트에 씬(Scene)의 단위, 모든 본(Bone), 로컬 축, head→tail 방향, 올바른 API 가이드까지 포함되어 있습니다. 정보를 제대로 입력받은 모델은 단번에 정답을 내놓기 때문에 재시도(Retry)의 폭풍이 일어나지 않습니다. 추론 시간이 짧다 = 서버 부하가 낮다 = 발열도 적다. -
돈을 일절 쓰지 않는다. 무료 LLM의 Web UI(프롬프트를 붙여넣고 코드를 다시 붙여넣기만 하면 됨)나 무료 할당량의 API 키를 사용합니다. 구독도, 신용카드도 필요 없습니다.

LLM은 "고가의 공유 리소스"라고 생각하고 사용하는 것이 좋다고 봅니다. 신중하게, 단 한 번만, 첫 시도에 답이 돌아올 수 있을 만큼 충분한 컨텍스트(Context)와 함께 말이죠.

구체적으로 AI에게 시키는 것은 "짧은 Python 스크립트를 한 줄 쓰는 것"뿐입니다. AI는 Blender에도, 파일에도, PC에도 전혀 손대지 않습니다. 그저 텍스트를 반환할 뿐입니다. 이로써 애니메이션 하나당 추론은 단 한 번으로 끝납니다. 재시도의 폭풍도, 백그라운드에서 몰래 쌓여가는 호출도 없습니다.

구조

전체 흐름은 다음과 같습니다.

모델 업로드 ──► /api/prompt ──► (AI가 bpy 스크립트를 작성) ──► /api/run 으로 실행
│
브라우저에서 프리뷰 ◄── /public/upload/<file> ◄──────────────────────┘
...

포인트는 서버 측이 AI에게 전달할 프롬프트를 이래도 되나 싶을 정도로 정성스럽게 만든다는 점입니다.

모델을 업로드하면 서버가 뒤에서 Blender(bpy)를 사용하여 실제로 해당 모델을 불러옵니다. 그리고,

  • 씬의 단위 (미터인지 센티미터인지)
  • 아마추어 (Armature, 골격) 정보
  • 모든 본 (Bone)의 이름, 부모-자식 관계, 로컬 축, head→tail 방향
  • 이미 포함되어 있는 애니메이션
    bpy 5.x API 치트 시트 (Cheat Sheet)
  • "이런 스크립트를 작성해줘"라는 엄격한 지시

이 모든 것을 텍스트로 정리하여 출력합니다. AI는 이 프롬프트를 읽고 Python을 작성합니다. 그뿐입니다.

은근히 효과를 발휘하는 것이 4번째인 API 치트 시트입니다. Blender의 bpy는 버전에 따라 API가 꽤 많이 바뀌어서, 인터넷상의 AI에게 평범하게 물어보면 아무렇지도 않게 3.x 시대의 "이미 존재하지 않는 함수"를 작성하곤 합니다. 그래서 프롬프트 안에 "지금 올바른 작성법은 이거야"라는 컨닝 페이퍼를 처음부터 동봉해 두었습니다.

정보를 아끼지 않고 처음에 전부 전달하면, 모델은 단 한 번에 정답을 돌려줍니다. 그래서 재시도(Retry)가 필요 없습니다.

이 부분은 몇 번이나 시행착오를 겪으며 bpy의 함정을 꾸준히 제거해 나갔습니다. "웹에서 물어볼 수 있는 AI일수록 오래된 작성법을 쓰기 쉽다"는 점이 이번 프로젝트의 가장 큰 배움일지도 모릅니다.

AI를 움직이는 방법은 2가지. 둘 다 무료

이 부분이 제가 조금 마음에 드는 지점인데, 유료 플랜은 전혀 필요 없습니다. 원하는 방식을 선택할 수 있습니다.

방법 1: 수동 (API 키조차 불필요)

  • 프롬프트를 생성하여 복사
  • 그것을 원하는 무료 AI에 붙여넣기 (Gemini, ChatGPT, Claude, DeepSeek는 물론, 로컬의 LM Studio나 Ollama도 가능)
  • 돌아온 Python 코드를 복사
  • 앱에 다시 붙여넣고 "실행"

이상입니다. 요컨대, 평소에 하던 복사-붙여넣기를 두 번 할 뿐입니다. 키도 결제도 필요 없습니다. "브라우저에서 AI와 대화하는 것이 가장 저렴한 인터페이스구나"라는 것이 개인적인 발견이었습니다.

방법 2: 자동 (무료 범위의 API 키를 한 번만 등록)

에디터 설정에 무료 API 키를 넣어두면, 프롬프트 생성 → 모델 호출 → 스크립트 실행까지 앱이 알아서 해줍니다. Google의 generativelanguage API는 무료 할당량이 꽤 넉넉해서, 가끔 즐기기에는 충분합니다.

키는 브라우저의 localStorage에만 저장되며, 요청을 보낼 때마다 전송될 뿐 서버에는 일절 저장하지 않습니다.

어느 쪽이든, 애니메이션 1개당 추론은 1회입니다. 이 원칙은 절대로 깨뜨리지 않도록 했습니다.

약간의 주의사항

설계상의 이유로 솔직하게 적어두어야 할 점이 두 가지 있습니다.

  • 덮어쓰기는 파괴적입니다. 생성된 스크립트는 원래 업로드된 파일을 애니메이션 버전으로 덮어씁니다. AI의 코드가 틀렸을 경우 원본 파일이 사라지므로, 중요한 파일은 반드시 복사본을 만들어 두시기 바랍니다.
  • 이것은 설계상 원격으로 코드를 실행하는 엔드포인트입니다. 자식 프로세스(Child Process)로 분리하여 bpy의 크래시가 API를 휘말리게 하지 않도록 조치했지만, 샌드박스(Sandbox)는 아닙니다. /api/run은 임의의 Python을 실행합니다. 로컬 환경이나 신뢰할 수 있는 환경에서만 실행해 주세요. 공개 서버에 그대로 올리는 것은 절대 금물입니다.

마치며

직접 만들어보며 새삼 느낀 점은, "AI를 어떻게 똑똑하게 사용할 것인가"는 대개 "어떻게 하면 사용하지 않고 끝낼 것인가"와 거의 동의어라는 것이었습니다. AI에게 시킬 일을 "텍스트 한 편을 쓰는 것"까지 좁힐 수 있다면, 추론은 한 번으로 끝나고, 빠르고, 무료로 동작하며, 무슨 일이 일어나고 있는지 스스로 설명할 수 있습니다.

"AI 에이전트에게 전부 맡긴다"의 대척점에 있는, 조금은 삐딱한 접근 방식이지만, 이런 방식의 제작도 꽤 즐겁다는 것이 전달된다면 기쁘겠습니다.

라이선스는 MIT입니다. 사용해 보시고 "Blender 세션 한 번 분량, 혹은 LLM 호출 한 번 분량을 절약했네"라고 느끼신다면, ⭐를 눌러주시면 큰 힘이 됩니다.

그럼, 즐거운 3D 애니메이션 라이프 되시길.

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0