Education*
Devops
Architecture
F/B End
B.Chain
Basic
Others
CLOSE
Search For:
Search
BY TAGS
linux
HTTP
golang
flutter
java
fintech
개발환경
kubernetes
network
Docker
devops
database
tutorial
cli
분산시스템
www
블록체인
AWS
system admin
bigdata
보안
금융
msa
mysql
redis
Linux command
dns
javascript
CICD
VPC
FILESYSTEM
S3
NGINX
TCP/IP
ZOOKEEPER
NOSQL
IAC
CLOUD
TERRAFORM
logging
IT용어
Kafka
docker-compose
Dart
n8n - Gemma3 모델을 이용한 이미지 분석 AI Agent 개발
Recommanded
Free
YOUTUBE Lecture:
<% selectedImage[1] %>
yundream
2025-07-01
2025-07-01
77
이 글에서는 오픈소스 자동화 플랫폼인 n8n을 활용하여, 로컬에 업로드된 이미지를 Vision AI 모델로 분석하고, 그 결과를 Slack으로 자동 전송하는 실제 워크플로우 구축 과정을 단계별로 소개한다. 파일 트리거부터 이미지 분석, 메시지 전송까지의 전체 자동화 시나리오를 실습 중심으로 설명하며, 생성형 AI와 워크플로우 자동화의 결합이 어떻게 비즈니스 업무를 혁신할 수 있는지 구체적으로 살펴본다. 아직 n8n을 해본적이 없다면 https://www.joinc.co.kr/w/n8n-intro 문서를 먼저 읽어보자. ## 시나리오 이번 글에서 테스트해볼 시나리오다. 이미지 파일을 업로드 하면 업로드 이벤트가 트리거 되고 파일의 내용을 Base64 인코딩 한다음, 프롬프트와 함께 Gemma3 모델로 전송해서 상품 마케팅 정보를 생성한다. 그리고 이 내용을 Slack을 통해서 담당자에게 전달한다.  1. Local File Trigger Node 2. /opt/n8n 디렉토리에 이미지 파일이 업로드 되면 이를 Trigger로 워크플로우를 실행한다. 3.  Local File Trigger Node는 파일 업로드 이벤트를 감지하여, 업로드된 파일의 경로, 이름, 크기 등 메타 정보를 반환한다. 4. Read File Node: 5. 파일의 실제 내용을 읽어 바이너리 데이터와 메타 정보를 출력한다. 6. Binary To Base64 7. 파일의 바이너리 데이터를 Base64로 인코딩한다. 8. Gemma3 Vision analysis 9. Google의 Gemma 3:12b 비전 모델을 이용해 이미지 정보를 추출한다. 10. 추출한 이미지 정보를 Slack으로 전송한다. ## n8n 서버 실행 docker로 n8n 서버를 실행하기로 했다. ``` docker run -it \ --name n8n \ -v /home/yundream/n8n:/opt/n8n \ -e PUID=$(id -u yundream) \ -e PGID=$(id -g yundream) \ --network host \ -e N8N_BASIC_AUTH_ACTIVE=true \ -e N8N_BASIC_AUTH_USER=admin \ -e N8N_BASIC_AUTH_PASSWORD=yourpassword \ n8nio/n8n ``` * -v /home/yundream/n8n:/opt/n8n: 호스트의 /home/yundream/n8n 디렉토리를 컨테이너의 /opt/n8n에 마운트했다. * PUID: 기본적으로 컨테이너에 마운트된 볼륨은 root 권한만 사용할 수 있으나, 일반 계정(yundream)으로도 접근할 수 있도록 PUID를 지정했다. * PGID: yundream 그룹으로 마운트 볼륨에 접근 할 수 있게 했다. 사용자가 **/home/yundream/n8n **에 파일을 업로드 하면 컨테이너의 **/opt/n8n**에 업로드 되고 **Local file trigger node** 가 트리거 된다. ## Local file trigger node 워크플로우 실행을 담당하는 트리거 노드다. 동작 방식은 아래와 같다. 1. 파일 업로드 이벤트 트리거: /opt/n8n 디렉토리에 새로운 파일이 업로드 되면 node 가 실행된다. 2. 업로드된 파일의 이름, 크기, 타입 등 메타정보 추출 **Local File**을 선택한다.  이벤트를 Trigger 할 파라미터를 설정한다. * Trigger On: Changes Involving a Specific Folder. 폴더 단위에서 파일 이벤트를 감지한다. * Folder to Watch: 이벤트를 기다릴 디렉토리 위치 * Watch for: 기다릴 이벤트. 파일 추가, 삭제, 업데이트 등 기다릴 이벤트를 선택 할 수 있다.  이제 해당 디렉토리에 파일을 복사하면 이벤트가 Trigger 되는 걸 확인 할 수 있다.  아래는 예제로 사용한 이미지다.  ## Read Image File Node Local File Trigger는 파일 업로드 이벤트만 감지하며, 파일의 실제 내용을 읽지는 않는다. 파일의 내용을 읽으려면 Read File Node를 사용해야 하며, Local File Trigger에서 전달받은 파일 정보를 Input으로 사용한다. * **Read/Write Files From Disk Node**를 선택한다. * File Selector 를 설정한다. \*.jpg 에 대해서 처리하도록 설정했다.  저장 한 다음 준비한 이미지 파일을 /home/yundream/n8n/input 으로 복사하면 아래와 같이 파일을 읽는 것을 확인 할 수 있다.  파일 이름, 확장자 Mime Type, 파일 크기등의 주요 정보를 확인 할 수 있다. ### Binary To Base64 Read File Node는 파일의 바이너리 데이터를 읽는다. Gemma3 Vision 모델은 Base64 형식의 입력을 요구하므로, Read File Node의 출력을 Base64로 변환해야 한다. 실제로 Read File Node에서 이미 Base64로 데이터를 읽을 수 있으므로, 별도의 Code 노드를 만들 필요는 없다. (예제에서는 이해를 돕기 위해 Code 노드를 추가한 것으로 보인다.) Code 타입 Node를 만들어보자.  이 노드는 Input 데이터를 읽어서 base64 로 저장한다.(아래 Javascript 코드를 보면 base64 인코딩 하는 부분이 없다. Read File Node에서 데이터를 읽으면서 Base64로 읽기 때문으로 굳이 Code 노드를 만들 필요는 없을 것이다. 예제라서 그런거라고 생각하고 넘어가자)  디렉토리에 파일을 업로드 하면 아래와 같이 Output 정보가 만들어지는 걸 확인 할 수 있다. 이 Output은 다음 노드의 Input으로 전달 될 것이다.  ## Gemma3 Vision analysis LLM의 멀티모달 능력을 이용해서 입력된 이미지로 부터 "마케팅 및 제품 전시"에 필요한 정보들을 추출 한다. Ollama는 HTTP API를 제공하기 때문에 **HTTP Reques**t 노드를 준비하면 된다. ##### Vision 모델 준비 - Gemma 3:12b (ollama) Ollama를 이용해 개인 PC에 Vision 모델 환경을 구축했다. * 우분투 리눅스 25.04 * GPU: NVIDIA GeForce RTX 4060TI 16G. 쓸데없이 VRAM만 키웠지 게이밍 성능이 좋지 않다고 까이고 있는데, 16G VRAM을 지원하는 GPU 가격을 생각하면 매우 훌륭한 가성비 장비다. * ollama: 로컬에서 LLM 테스트 환경을 구축 할 수 있다. 25년 6월 현재 최신 버전은 0.6.0 이다. https://ollama.com/download 에서 간단하게 설치 할 수 있다. 선택 할 수 있는 Vision 모델은 아래와 같다. * Llama 3.2 Vision: Meta에서 공개한 Vision 모델 * Gemma 3: 멀티모달을 잘 지원하는 구글 답게 LLM 모델인 Gemma 3 에서는 Vision 기능을 기본 지원한다. * Qwen2.5-VL 이 중에서 Gemma 3를 선택했다. ##### HTTP Request Node 설정 Ollama의 Chat API는 POST http://host:11434/api/chat 이다. METHOD와 URL을 설정한다.  Ollama에 보낼 Body Payload를 설정한다. * Content Type: application/json  Body는 아래와 같이 설정했다. ```json { "model": "gemma3:12b", "messages": [ { "role": "user", "content": "당신은 의류 패션 이커머스 플랫폼의 전문 마케터이자 카피라이터입니다.\n제공된 모델 착용 사진을 면밀히 분석하여, 모델이 착용한 \"주요 의류 상품\" 에 대한 마케팅적 강점과 고객의 구매를 유도할 수 있는 매력적인 정보를 추출하고, 이를 아래 정의된 마크다운(Markdown) 형식으로 반환하세요.\n\n[작업 지시]\n* 사진 속 모델이 착용한 \"가장 중심이 되는 의류 상품\" 하나에 대해서만 정보를 추출합니다. (예: 원피스, 상의, 하의 등)\n* 추출된 정보는 아래 명시된 마크다운 스키마에 따라 마케팅적 관점에서 매력적이고 감성적인 언어로 작성되어야 합니다.\n* 고객의 구매 욕구를 자극하고, 상품의 가치를 높이는 데 집중하세요.\n* 정보를 명확히 식별하기 어렵거나 해당되지 않는 필드는 빈 문자열로 처리합니다.\n\n[마크다운 스키마 및 필드 설명]\n\n * product_marketing_name_suggestion: \"상품의 매력을 담은 마케팅용 이름 제안 (예: '데일리 무드 니트 가디건', '시크 오피스룩 블라우스')\"\n * marketing_headline: \"고객의 시선을 사로잡을 짧고 강렬한 마케팅 헤드라인 (20자 이내)\"\n * target_customer_profile: \"이 상품을 가장 좋아할 만한 타겟 고객층 설명 (예: '편안함과 스타일을 동시에 추구하는 2030 여성', '활동적인 라이프스타일을 즐기는 남성')\"\n * key_selling_points_benefits:\n * \"핵심 판매 포인트 및 고객이 얻을 수 있는 이점 1 (예: '어떤 룩에도 잘 어울리는 뛰어난 활용도')\"\n * \"핵심 판매 포인트 및 고객이 얻을 수 있는 이점 2 (예: '하루 종일 편안한 착용감을 선사하는 부드러운 소재')\"\n * \"핵심 판매 포인트 및 고객이 얻을 수 있는 이점 3 (예: '체형 커버에 탁월한 세련된 실루엣')\"\n * \"...\"\n * overall_style_vibe: \"상품이 주는 전반적인 스타일 무드/분위기 (예: '꾸민 듯 안 꾸민 듯 내추럴 시크', '우아하고 세련된 페미닌 무드', '힙하고 트렌디한 스트릿 감성')\"\n * ideal_occasions_moods:\n * \"이 상품이 가장 빛날 이상적인 상황/장소 또는 연출 가능한 분위기 1 (예: '일상 속 편안한 데일리룩', '중요한 미팅을 위한 오피스룩', '특별한 날을 위한 데이트룩')\"\n * \"이상적인 상황/장소 또는 연출 가능한 분위기 2\"\n * \"...\"\n * design_highlights_marketing:\n * \"고객에게 어필할 만한 디자인적 특징 강조 (예: '얼굴을 화사하게 밝혀주는 넥라인', '유니크한 디테일로 시선 집중', '고급스러움을 더하는 은은한 광택')\"\n * \"디자인적 특징 강조 2\"\n * \"...\"\n * color_mood_description: \"색상이 주는 감성적인 느낌과 활용성 (예: '어떤 피부톤에도 잘 어울리는 따뜻한 뉴트럴 베이지', '시크하고 세련된 분위기를 연출하는 딥 블랙')\"\n * styling_suggestions_marketing\"\n * \"이 상품을 활용한 매력적인 스타일링 제안 1 (예: '데님 팬츠와 매치하여 캐주얼하게, 스커트와 매치하여 여성스럽게')\"\n * \"스타일링 제안 2 (예: '액세서리 하나로 포인트를 주어 나만의 개성 표현')\"\n * \"...\"\n * \"emotional_appeal_keywords\"\n * \"고객이 이 상품을 통해 느낄 수 있는 감정/경험 키워드 (예: '자신감', '편안함', '세련됨', '특별함', '트렌디함')\"\n * \"감정/경험 키워드 2\"\n * \"...\"\n * call_to_action_idea: \"고객의 구매를 유도하는 짧은 문구 제안 (예: '지금 바로 당신의 옷장에 추가하세요!', '놓치지 마세요, 한정 수량!')\"", "images": [ "{{$json.base64}}" ] } ], "stream": false } ``` images에 base64 값을 넣었다. 이 노드가 실행되면, 프롬프트와 함께 base64로 인코딩된 이미지 데이터가 Gemma3 모델로 전달된다. ## Slack send Message Gemma3 Vision Analysis 노드는 이미지 분석 결과를 Output으로 전달한다. 이 결과를 Slack으로 전송하기 위해 Slack Send Message 노드를 추가했다. Slack 으로 메시지를 보내기 위해서는 Slack App(봇)을 만들고 OAuth 토큰을 발급 받아야 한다. 1. https://api.slack.com/apps 로 접속 2. 새 App 생성 1. Create New App 버튼 클릭 2. From scratch 선택 3. 앱 이름 입력(예: n8n-bot) 4. 앱을 설치할 워크스페이스 선택 5. Create App 클릭 3. Bot User 추가 1. 왼쪽 메뉴에서 "App Home" 클릭 2. "Add a Bot User" 클릭 3. Display name과 Default username 입력 4. Add Bot User 클릭 4. 권한(Scope) 설정 1. 왼쪽 메뉴에서 OAuth & Permissions 클릭 2. Scope 섹션에서 Bot Token Scopes 에서 아래 권한 추가 1. chat:write (메시지 전송 권한) 2. 필요시 files:write, channels:read 추가 3. Add on OAuth Scope 버튼 클릭 5. 앱 워크스페이스에 설치 1. Install App to Workspace 버튼 클릭 2. 권한 요청 화면에서 Allow 클릭 6. Bot User OAuth Token 복사 1. 설치 후 OAuth & Permissions 페이지로 이동 2. Bot User OAuth Token(**xoxb-... 로 시작**)을 복사: 이 값은 n8n의 Slack send Message 노드 설정시 사용 7. Slack App을 채널에 초대 1. Slack에서 메시지를 보낼 체널에 '"/invite @앱이름" 명령어로 봇을 초대 아래와 같이 Slack and Message 를 설정한다.  * Method: POST * URL: https://slack.com/api/chat.postMessage * 앞서 복사한 OAuth Token을 Header 에 설정한다. * Name: Authorization * Value: Bearer xoxb-9121.... 마지막으로 Body Payload를 설정한다.  ## 테스트 아래와 같은 워크플로우를 만들었고, 성공적으로 이미지를 분석하는 것을 확인했다.  지금까지 잘 따라왔다면 slack으로 메시지가 전달되는 것을 확인 할 수 있다.  ## 정리 n8n은 다양한 서비스와의 연동, 직관적인 워크플로우 설계, 그리고 손쉬운 자동화 구현이 가능한 오픈소스 자동화 플랫폼이다. Slack, Google Drive, Email, 데이터베이스 등 다양한 외부 서비스와의 통합을 지원하여 복잡한 비즈니스 로직도 시각적으로 쉽게 구현할 수 있다. 최근 LLM(대형 언어 모델)의 발전으로, 기존 워크플로우에 생성형 AI를 통합하는 것이 가능해졌다. 특히 LLM이 발전하면서 기존의 워크플로우에 생성형-AI를 통합할 수 있게 됐다. 1. 자동화된 콘텐츠 생성 및 요약 2. 비실시간 챗봇/고객응대: n8n은 기본적으로 트리거 기반 워크플로우 자동화 도구이기 때문에 SSE, WebSocket과 같은 실시간 양방향 통신 기능이 내장되어 있지 않다. 이 점은 특히 실시간성이 중요한 챗봇이나 즉각적인 고객 응대에는 한계로 작용 할 수 있다. 3. 데이터 분석 및 의사결정 지원 등 다양한 영역에 LLM을 도입 할 수 있을 것이다. ## n8n vs Airflow n8n과 Airflow는 모두 워크플로우 자동화 도구라는 공통점이 있다. 두 도구의 주요 차이점을 아래와 같이 비교 정리한다 ##### 공통점 * 워크플로우 자동화: 여러 작업(Taks, Node)를 연결해 자동화 파이프라인을 만든다. * 시각적/코드 기반 워크플로우 설계: 작업의 순서, 조건, 반복등을 정의 할 수 있다. * 다양한 외부 서비스와의 연동: API 호출, 파일 처리, 데이터베이스 작업 등 다양한 작업을 지원한다. ##### 차이점 | **구분** | **n8n** | **Airflow** | | ---------- | ----------------------------- | ----------------------------------------- | | **주요 목적** | No-code/Low-code 자동화, 통합, RPA | 데이터 파이프라인, ETL, 배치 스케줄링 | | **사용 방식** | 웹 UI에서 드래그&드롭, 간단한 코드 가능 | Python 코드로 DAG(Directed Acyclic Graph) 작성 | | **설치/운영** | Docker, 클라우드, 데스크탑 등 간편 설치 | 주로 서버/클러스터 환경, 복잡한 설치 필요 | | **확장성** | 플러그인/노드 추가, 커뮤니티 활발 | Python 기반 커스텀 오퍼레이터, 확장성 높음 | | **대상 사용자** | 비개발자, 개발자 모두 | 주로 데이터 엔지니어, 개발자 | | **트리거** | 이벤트 기반(HTTP, 파일, 스케줄 등 다양) | 주로 스케줄(시간 기반), 센서 | | **시각화** | 강력한 웹 UI, 시각적 워크플로우 편집 | DAG 그래프 시각화, UI는 상대적으로 단순 |
Recent Posts
n8n - Gemma3 모델을 이용한 이미지 분석 AI Agent 개발
n8n 시작하기
ChatBox: 다양한 LLM을 하나의 인터페이스에서! (ChatGPT, Gemini, Claude, Ollama)
computer vision tutorial - OpenCV를 이용한 color detecting
vLLM을 이용해서 오픈소스 LLM 서비스 구축하기
Vertex Gemini 기반 AI 에이전트 개발 06. LLM Native Application 개발
최신 경량 LLM Gemma 3 테스트
MLOps with Joinc - Kubeflow 설치
Vertex Gemini 기반 AI 에이전트 개발 05. 첫 번째 LLM 애플리케이션 개발
LLama-3.2-Vision 테스트
Archive Posts
Tags
AI
LLM
Copyrights © -
Joinc
, All Rights Reserved.
Inherited From -
Yundream
Rebranded By -
Joonphil
Recent Posts
Archive Posts
Tags