SiamCafe.net Blog
Technology

Midjourney Prompt Message Queue Design

midjourney prompt message queue design
Midjourney Prompt Message Queue Design | SiamCafe Blog
2025-07-27· อ. บอม — SiamCafe.net· 9,941 คำ

Midjourney Prompt และ Message Queue

Midjourney Prompt สั่ง AI สร้างภาพ ต้องชัดเจน เฉพาะเจาะจง Style Lighting Camera Angle Parameters Message Queue สำหรับ Async Communication ระหว่าง Services

รวมสองหัวข้อ ใช้ Message Queue จัดการ Prompt Queue สำหรับ AI Image Generation ที่ต้อง Process เป็น Batch

Midjourney Prompt Engineering

# === Midjourney Prompt Engineering ===
from dataclasses import dataclass, field
from typing import List, Optional

@dataclass
class MidjourneyPrompt:
    subject: str
    style: str = ""
    lighting: str = ""
    camera: str = ""
    color_palette: str = ""
    mood: str = ""
    details: List[str] = field(default_factory=list)
    negative: List[str] = field(default_factory=list)
    aspect_ratio: str = "16:9"
    version: str = "6.1"
    quality: float = 1.0
    stylize: int = 100
    chaos: int = 0

    def build(self) -> str:
        """สร้าง Prompt String"""
        parts = [self.subject]

        if self.style:
            parts.append(self.style)
        if self.lighting:
            parts.append(self.lighting)
        if self.camera:
            parts.append(self.camera)
        if self.color_palette:
            parts.append(self.color_palette)
        if self.mood:
            parts.append(self.mood)
        parts.extend(self.details)

        prompt = ", ".join(parts)

        # Parameters
        params = []
        params.append(f"--ar {self.aspect_ratio}")
        params.append(f"--v {self.version}")
        if self.quality != 1.0:
            params.append(f"--q {self.quality}")
        if self.stylize != 100:
            params.append(f"--s {self.stylize}")
        if self.chaos > 0:
            params.append(f"--chaos {self.chaos}")
        if self.negative:
            params.append(f"--no {' '.join(self.negative)}")

        return f"{prompt} {' '.join(params)}"

class PromptLibrary:
    """Prompt Library สำหรับ Midjourney"""

    def __init__(self):
        self.prompts: List[MidjourneyPrompt] = []
        self.categories = {}

    def add(self, category: str, prompt: MidjourneyPrompt):
        self.prompts.append(prompt)
        if category not in self.categories:
            self.categories[category] = []
        self.categories[category].append(prompt)

    def show_all(self):
        for cat, prompts in self.categories.items():
            print(f"\n  [{cat}]")
            for p in prompts:
                print(f"    {p.build()[:80]}...")

# ตัวอย่าง Prompts
library = PromptLibrary()

prompts = [
    ("Product Photography", MidjourneyPrompt(
        "luxury watch on marble surface",
        "product photography", "soft studio lighting",
        "macro lens 100mm", "gold and black tones",
        "elegant minimalist",
        ["sharp focus", "high detail", "reflections"],
        ["text", "watermark"],
        "1:1", stylize=200,
    )),
    ("Web Design", MidjourneyPrompt(
        "modern SaaS dashboard UI design",
        "clean minimal UI/UX", "flat design",
        details=["dark mode", "data visualization", "glassmorphism"],
        negative=["realistic photo"],
        aspect_ratio="16:9", stylize=150,
    )),
    ("Architecture", MidjourneyPrompt(
        "futuristic eco-friendly skyscraper",
        "architectural visualization", "golden hour sunlight",
        "wide angle lens", "green and glass tones",
        "sustainable utopian",
        ["vertical gardens", "solar panels", "sky bridges"],
        ["people", "cars"],
        "9:16", stylize=250,
    )),
    ("Character Design", MidjourneyPrompt(
        "cyberpunk female warrior",
        "anime style illustration", "neon rim lighting",
        "dynamic pose", "purple and cyan neon",
        "futuristic intense",
        ["detailed armor", "holographic HUD", "rain"],
        ["realistic", "photo"],
        "2:3", stylize=300, chaos=20,
    )),
]

for cat, prompt in prompts:
    library.add(cat, prompt)

print("Midjourney Prompt Library:")
library.show_all()

print("\n\nFull Prompt Examples:")
for cat, prompt in prompts:
    print(f"\n  [{cat}]")
    print(f"  /imagine {prompt.build()}")

Message Queue Architecture

# message_queue.py — Message Queue Design Pattern
import json
import time
import uuid
from dataclasses import dataclass, field, asdict
from typing import List, Dict, Callable, Optional
from datetime import datetime
from collections import deque
from enum import Enum

class MessageStatus(Enum):
    PENDING = "pending"
    PROCESSING = "processing"
    COMPLETED = "completed"
    FAILED = "failed"
    DEAD_LETTER = "dead_letter"

@dataclass
class Message:
    id: str
    payload: Dict
    status: MessageStatus = MessageStatus.PENDING
    retries: int = 0
    max_retries: int = 3
    created_at: str = ""
    processed_at: str = ""

    def __post_init__(self):
        if not self.id:
            self.id = str(uuid.uuid4())[:8]
        if not self.created_at:
            self.created_at = datetime.now().isoformat()

class SimpleMessageQueue:
    """Simple Message Queue Implementation"""

    def __init__(self, name: str, max_size: int = 1000):
        self.name = name
        self.max_size = max_size
        self.queue: deque = deque()
        self.dead_letter: List[Message] = []
        self.processed: List[Message] = []
        self.stats = {"enqueued": 0, "processed": 0, "failed": 0}

    def enqueue(self, payload: Dict) -> Message:
        """เพิ่ม Message เข้า Queue"""
        if len(self.queue) >= self.max_size:
            raise Exception(f"Queue full: {self.name}")

        msg = Message(id="", payload=payload)
        self.queue.append(msg)
        self.stats["enqueued"] += 1
        return msg

    def dequeue(self) -> Optional[Message]:
        """ดึง Message ออกจาก Queue"""
        if not self.queue:
            return None
        msg = self.queue.popleft()
        msg.status = MessageStatus.PROCESSING
        return msg

    def complete(self, msg: Message):
        """Mark Message as completed"""
        msg.status = MessageStatus.COMPLETED
        msg.processed_at = datetime.now().isoformat()
        self.processed.append(msg)
        self.stats["processed"] += 1

    def fail(self, msg: Message):
        """Handle failed Message"""
        msg.retries += 1
        if msg.retries >= msg.max_retries:
            msg.status = MessageStatus.DEAD_LETTER
            self.dead_letter.append(msg)
            self.stats["failed"] += 1
        else:
            msg.status = MessageStatus.PENDING
            self.queue.append(msg)  # Re-queue

    def dashboard(self):
        """Queue Dashboard"""
        print(f"\n{'='*50}")
        print(f"Queue: {self.name}")
        print(f"{'='*50}")
        print(f"  Pending: {len(self.queue)}")
        print(f"  Processed: {self.stats['processed']}")
        print(f"  Failed: {self.stats['failed']}")
        print(f"  Dead Letter: {len(self.dead_letter)}")
        print(f"  Total Enqueued: {self.stats['enqueued']}")

# ตัวอย่าง — AI Image Generation Queue
queue = SimpleMessageQueue("ai-image-generation")

# Enqueue Prompts
prompts_to_process = [
    {"prompt": "luxury watch on marble", "style": "product", "priority": "high"},
    {"prompt": "modern dashboard UI", "style": "web", "priority": "medium"},
    {"prompt": "futuristic skyscraper", "style": "architecture", "priority": "low"},
    {"prompt": "cyberpunk warrior", "style": "character", "priority": "high"},
    {"prompt": "cozy coffee shop interior", "style": "interior", "priority": "medium"},
]

for p in prompts_to_process:
    queue.enqueue(p)

# Process Queue
print("Processing Queue:")
while True:
    msg = queue.dequeue()
    if not msg:
        break
    print(f"  Processing: {msg.payload['prompt'][:30]}... [{msg.payload['priority']}]")
    queue.complete(msg)

queue.dashboard()

Production Queue with Redis

# === Production Message Queue with Redis ===
# pip install redis rq celery

# 1. Celery Task Queue (Production)
# tasks.py
# from celery import Celery
# import time
#
# app = Celery('tasks',
#     broker='redis://localhost:6379/0',
#     backend='redis://localhost:6379/1',
# )
#
# app.conf.update(
#     task_serializer='json',
#     accept_content=['json'],
#     result_serializer='json',
#     timezone='Asia/Bangkok',
#     task_acks_late=True,          # Acknowledge after processing
#     worker_prefetch_multiplier=1, # Process one at a time
#     task_reject_on_worker_lost=True,
#     task_default_retry_delay=60,  # Retry after 60 seconds
#     task_max_retries=3,
# )
#
# @app.task(bind=True, max_retries=3)
# def generate_image(self, prompt_data):
#     """Generate AI Image from Prompt"""
#     try:
#         prompt = prompt_data['prompt']
#         style = prompt_data.get('style', 'default')
#         # Call Midjourney API or Stable Diffusion
#         time.sleep(30)  # Simulate generation
#         return {"status": "completed", "image_url": f"/images/{self.request.id}.png"}
#     except Exception as exc:
#         self.retry(exc=exc, countdown=60 * (self.request.retries + 1))
#
# # Send task
# result = generate_image.delay({"prompt": "luxury watch", "style": "product"})
# print(f"Task ID: {result.id}")
# print(f"Status: {result.status}")
# print(f"Result: {result.get(timeout=120)}")

# 2. Docker Compose — Redis + Celery
# version: '3.8'
# services:
#   redis:
#     image: redis:7-alpine
#     ports: ["6379:6379"]
#
#   celery-worker:
#     build: .
#     command: celery -A tasks worker --loglevel=info --concurrency=4
#     depends_on: [redis]
#     environment:
#       CELERY_BROKER_URL: redis://redis:6379/0
#
#   celery-beat:
#     build: .
#     command: celery -A tasks beat --loglevel=info
#     depends_on: [redis]
#
#   flower:
#     build: .
#     command: celery -A tasks flower --port=5555
#     ports: ["5555:5555"]
#     depends_on: [redis]

# 3. Monitoring Commands
# celery -A tasks inspect active    # Active tasks
# celery -A tasks inspect reserved  # Reserved tasks
# celery -A tasks inspect stats     # Worker stats
# celery -A tasks purge             # Purge all tasks

queue_architecture = {
    "Broker": "Redis (Message Storage)",
    "Backend": "Redis (Result Storage)",
    "Workers": "Celery Workers (Concurrent Processing)",
    "Scheduler": "Celery Beat (Periodic Tasks)",
    "Monitoring": "Flower (Web Dashboard port 5555)",
    "Retry": "Exponential Backoff (60s, 120s, 180s)",
    "DLQ": "Dead Letter Queue for failed tasks",
}

print("Production Queue Architecture:")
for component, desc in queue_architecture.items():
    print(f"  {component}: {desc}")

Best Practices

Midjourney Prompt คืออะไร

ข้อความสั่ง Midjourney AI สร้างภาพ Subject Style Parameters --ar --v --q Prompt ดีต้องชัดเจน เฉพาะเจาะจง Style Lighting Camera Angle Color Palette

Message Queue คืออะไร

Design Pattern Async Communication Services Producer ส่ง Message Queue Consumer รับประมวลผล Decouple ไม่ต้องรอ Scale RabbitMQ Kafka AWS SQS Redis

Prompt Engineering สำคัญอย่างไร

ศาสตร์เขียน Prompt ได้ผลลัพธ์ต้องการ Syntax Parameters Style Keywords จัดลำดับคำ คำแรกน้ำหนักมาก Negative Prompt --no Multi-prompt :: กำหนดน้ำหนัก

วิธีออกแบบ Message Queue System ทำอย่างไร

Message Format JSON Schema Queue Type Point-to-point Pub/Sub Retry Policy Exponential Backoff Dead Letter Queue Monitor Queue Depth Consumer Lag Idempotent Consumers

สรุป

Midjourney Prompt ต้อง Subject Style Lighting Camera Parameters Message Queue จัดการ Async Processing Redis Celery Production Queue Retry Exponential Backoff Dead Letter Queue Monitor ด้วย Flower Idempotent Consumers ป้องกัน Duplicate

📖 บทความที่เกี่ยวข้อง

Midjourney Prompt Microservices Architectureอ่านบทความ → Midjourney Prompt Monitoring และ Alertingอ่านบทความ → Midjourney Prompt Career Development ITอ่านบทความ → ZFS on Linux Message Queue Designอ่านบทความ →

📚 ดูบทความทั้งหมด →