path
Jin's Lab
코드로 실험하고 기록하는 개발 일지 · J.Lab

Jin's Lab

코드로 실험하고 기록하는 개발 일지. 커리어와 삶의 방향을 탐색하며 기록하는 공간입니다

AI Image Generation

AI 이미지 트러블슈팅 기괴한 인물 일러스트를 해결하는 이중 방어법

J.Lab ·
목차

    자동으로 블로그 포스트를 발행하는 시스템을 구축하고 한동안은 정말 편하게 글을 썼다. 하지만 어느 날 자동 생성된 이미지를 보고 소스라치게 놀라고 말았다. 육아 정보를 다루는 KidStory 블로그에 올라간 아이 일러스트가 기괴한 모습으로 렌더링되어 있었기 때문이다.

    팔다리가 엉뚱하게 꺾여 있거나 개수가 맞지 않았고, 심지어 아이 옷에는 정체불명의 외계어 같은 뭉개진 글자들이 지저분하게 박혀 있었다. 이미지 유입이 중요한 핀터레스트와 육아 니치 시장에서 이런 기괴한 인물 이미지는 브랜드 신뢰도에 치명적인 타격이었다. 결국 하던 일을 모두 멈추고 본격적인 트러블슈팅에 착수했다.

    스플릿 스크린에서 오류가 발생한 AI 이미지를 수정하고 있는 개발자의 모습을 담은 깔끔한 아이소메트릭 일러스트

    기괴함을 유발한 두 가지 핵심 원인 분석

    문제를 해결하기 위해 먼저 왜 이런 참사가 발생했는지 면밀히 뜯어보았다. 첫 번째 원인은 이미지 생성 모델인 Pollinations flux에게 프롬프트를 넘겨줄 때 단순히 일러스트라고만 지시하고 구체적인 스타일을 못 박지 않았다는 점이었다. 스타일을 애매하게 지시하니 모델이 반사실적인 형태로 인물을 렌더링하면서 기괴한 해부학적 왜곡이 일어났다.

    두 번째 원인은 글자 삽입을 방지하는 네거티브 프롬프트 성격의 제약 조건이 누락되었다는 점이었다. 글자를 넣지 말라는 명확한 명령이 없다 보니 flux 모델이 빈 공간에 임의로 영문 텍스트를 생성했고, 이것이 뭉개지면서 지저분한 오탈자처럼 표현되었다. 결국 프롬프트와 코드 양쪽에서 강력한 제어가 필요하다는 결론을 내렸다.

    구글 앱스 스크립트 수정으로 구축한 이중 방어막

    단순히 프롬프트 지침만 수정해서는 모델이 지시 사항을 무시할 확률이 높았다. 그래서 나는 자동화 스크립트 파일인 Code_KidStory.gs를 직접 열어 두 단계를 거치는 이중 방어 처방을 설계했다. 먼저 이미지 생성 프롬프트 자체를 flat vector, no-text, no-realistic-people 등 사물 중심으로 구체화했다.

    특히 아이 일러스트가 필요한 경우에는 글의 맥락에 맞게 특정 월령이나 나이를 프롬프트에 직접 명시해 주었다. 이렇게 연령대를 정확하게 못 박아 주니 모델이 엉뚱하고 기괴하게 신체를 변형하는 현상이 눈에 띄게 줄어들었다.

    여기에 더해 생성 함수 레벨인 generateAndUploadImage 내부에 STYLE_ENFORCE 접미사를 하드코딩으로 심어버렸다. 제미나이의 출력 프롬프트 내용과 무관하게, API로 전달되는 모든 이미지 생성 요청 끝에 'flat vector illustration, no text, no distorted limbs'라는 스타일 제약을 강제로 주입한 것이다.

    왜곡된 형태와 텍스트를 차단하는 규칙이 작성된 코드 편집기를 묘사한 깔끔한 플랫 일러스트

    니치별 스타일 전파와 최적화 전략

    이러한 이중 방어 처방의 효과는 즉각적이었다. 수정 이후 발행된 포스트들의 이미지는 훨씬 깔끔하고 일관성 있는 flat 일러스트 형태로 일정하게 생성되었다. 나는 이 성공적인 이중 처방 방식을 또 다른 블로그 채널인 IssueLog에도 그대로 전파하여 시스템을 강화했다.

    다만 IssueLog에 적용할 때는 해당 블로그의 니치에 맞춰 미세 조정 프로세스를 거쳤다. 아기 월령 표기 옵션을 제거하고 차분한 민트 그린 대신 중립적인 톤을 활용하도록 세팅했으며, 인물보다는 추상적인 사물이나 개념 중심의 오브젝트가 렌더링되도록 규칙을 조율했다.

    기계나 테크 중심의 이미지를 주로 다루는 IT Story와 Lab 블로그의 경우는 인물 묘사 비율이 낮아 기괴한 오류가 발생할 확률이 적었기 때문에 일단 이번 코드 수정 대상에서 제외하고 보류해 두었다. 무분별하게 시스템 전체를 건드리기보다 실질적인 리스크가 있는 영역에 집중해 효율성을 높였다.

    기괴한 요소 없이 깔끔하고 미니멀하게 정리된 블로그 레이아웃과 일러스트를 나타낸 그래픽

    AI 이미지 실패 패턴을 극복하며 얻은 교훈

    이번 삽질을 거치며 AI 이미지 트러블슈팅의 핵심은 텍스트 렌더링 오류와 해부학적 왜곡이라는 2대 실패 패턴을 선제적으로 제어하는 데 있음을 절실히 깨달았다. 프롬프트 지침만으로는 모델의 탈선을 막기 어렵기 때문에, 이미지 생성 함수 레벨에서 강제로 네거티브 요소와 스타일을 주입하는 이중 장치가 매우 유효했다.

    무조건 화려하고 사실적인 이미지만을 고집하기보다 블로그의 성격에 맞춰 안전한 flat 일러스트 스타일을 고수하고 색상 팔레트를 커스텀하는 것이 트래픽 유지에도 안전하다. 한번 안정적으로 이중 방어 코드를 짜두니 이제는 더 이상 아침마다 기괴한 인물 이미지가 발행되었을까 봐 불안해하지 않아도 되어 무척 든든하다.

    AI Image Generation Flat Illustration Google Apps Script Negative Prompt Pollinations Flux
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    path
    J.Lab

    커리어와 삶의 방향을 탐색하며
    기록하는 공간입니다

    카테고리
    403 Forbidden Error 1 AdSense 1 AdSense Bot Detection 1 AI Automation 1 AI Image Generation 1 ai-automation 2 AI-Prompting 1 AIBlogAutomation 1 AICodeLog 1 AIContentGeneration 1 AIImageGeneration 1 AIWritingErrors 1 API Automation 2 API Retry Design 1 api-automation 1 API-Deprecation 1 api-error 1 api-fallback 1 api-retry-strategy 1 api-troubleshooting 1 APIDebugging 1 APIError 1 APIErrorHandling 1 APIIntegration 1 APITokenRenewal 1 AppsScript 1 appsScriptAutomation 1 AutomatedBlogging 1 automation 1 Automation 2 AutomationTroubleshooting 1 Backoff Algorithm 1 Base64Encoding 1 BatchProcessing 1 blog-automation 1 blog-customization 1 blog-migration 3 Blog-Sorting 1 blog-strategy 1 blog-theme-customization 1 blog-workflow 1 blogautomation 1 BlogAutomation 2 Blogger 4 Blogger API 2 Blogger Automation 1 Blogger SEO 1 blogger-api 3 blogger-automation 1 blogger-error-400 1 blogger-labels 1 blogger-seo 1 blogger-tips 1 Blogger-Tips 1 BloggerAPI 3 BloggerBypath 1 BloggerCustomization 2 BloggerFavicon 1 BloggerTemplate 1 BloggerTemplateEditing 1 BloggerTheme 1 BloggerThemeCustomization 1 BloggerXMLStructure 1 Blogging-Automation 1 BloggingTools 1 BlogQuality 1 BlogSpot 1 BWidgetBIncludable 1 CardClickHandler 1 CDATA 1 clamping-text 1 Code Integration 1 codelog 1 CodeLog 1 codeRefactoring 1 contentsequencing 1 cost-reduction 1 CSSOverlay 1 data-parsing 1 DatabaseDesign 1 DataRecovery 1 DateInjection 1 Debugging 2 dev-journey 1 DeveloperJourney 2 DevJourney 1 display-none-seo 1 dom-manipulation 1 dynamic-menu 1 Error-Handling 1 ErrorHandling 1 Execution Timeout 1 ExecutionLimit 1 exponential-backoff 1 FactChecking 1 FaviconEmbedding 1 Feed-API 1 filesystem 1 Flat Illustration 1 FluxModel 1 FreeAIImage 1 FrontEndDev 1 FrontendTips 1 GAS Blogger API 1 gas-automation 1 gas-optimization 1 gas-trigger 1 GASTimeout 1 gasTriggerManagement 1 GCP Project Linkage 1 Gemini 1 Gemini API 1 gemini-api 1 GeminiAPI 1 GeminiPrompt 1 GeminiPromptEngineering 1 GmailRestrictions 1 Google Apps Script 7 Google Discover 1 google-apps-script 3 Google-Apps-Script 1 google-blogger 1 googleAppsScript 1 GoogleAppsScript 6 googlesapps-script 1 hero-image 1 HTMLWidgetBlogger 1 http-429 1 HuggingFace 1 HuggingFaceAPI 1 ico-generator 1 Image Optimization 1 image-automation 1 image-optimization 1 In-App Browser 1 invalid-argument 1 javascript 3 JavaScript 2 javascript-automation 1 javascript-toc 1 jlab-codelog 1 JLabDevLog 1 json-schema 1 label-length-limit 1 linux 1 meta-description 1 Negative Prompt 1 notion-api 1 notion-database 1 notion-gas-integration 1 NotionAPI 1 NotionAutomation 1 notionintegration 1 NotionIntegration 1 OAuth Scope 1 pagination 1 payload-validation 1 permalink-management 1 PersonaDesign 1 pil-image-processing 1 Pinterest 1 Pollinations 1 Pollinations Flux 1 pollinations-api 1 PollinationsAI 1 PositionAbsolute 1 Prompt Design 1 Prompt Engineering 1 prompt-engineering 1 Prompt-Engineering 1 PromptEngineering 1 publishorder 1 python-favicon 1 queue-stuck 1 RandomDelay 1 rate-limiting 1 Refactoring 1 rfc3339 2 Robots Meta Tag 1 RSS Feed 1 scriptNotFound 1 Search Engine Optimization 2 Search-Engine-Optimization 1 SEO Tips 1 seo-optimization 4 SEO-Optimization 1 seriesmanagement 1 SidebarLinks 1 SNSMarketing 1 SVGIcon 1 table-of-contents 1 TechJournal 1 Template 1 ThreadsAPI 1 tistory-migration 1 transparent-favicon 1 triggerCleanup 1 Troubleshooting 1 unzip 1 URL Slug 1 vanilla-js 1 Web Development 1 Web Publishing 2 Web Security 1 web-development 1 Web-Development 1 web-development-tips 1 web-performance 1 web-scraping 1 WebAccessibility 1 WebDevelopment 3 WebDevelopmentTips 1 WebDevJourney 1 windows 1 WorkflowAutomation 1 XMLParser 1 XMLSpecialCharacters 1 XMLTheme 1 zip 1
    인기 글
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    다른 블로그
    IssueLog
    IssueLog
    issuelog.jinbytes.com
    KidStory
    KidStory
    kidstory.jinbytes.com
    IT Story
    IT Story
    jinbytes.com
    © Jin's Lab · J.Lab · All Rights Reserved
    jinbytes.com · Powered by Blogger