Ollama: Modelos Multimodais

Modelos Multimodais dão olhos à IA — veja uma imagem, descreva-a em palavras, tudo de uma vez.

💡 Dica: Modelos Multimodais (como llava, minicpm-v) são 2-3x maiores que Modelos apenas de texto, e o processamento de imagens requer computação adicional do codificador visual, então aceleração por GPU é fortemente recomendada. Em ambientes apenas com CPU, a velocidade de Inferência de Modelos Multimodais pode ser lenta demais para ser prática (1-3 tok/s). Uma GPU com 8GB+ de VRAM é o requisito básico para rodar Modelos Multimodais suavemente.

📋 Pré-requisitos: Você precisa dominar o seguinte primeiro

1. O Que Você Vai Aprender


2. Uma História Real de Uma Fundadora de SaaS

ℹ️ Info: Atualmente, os Modelos Multimodais suportados pelo Ollama são principalmente a série LLaVA (llava, llava-llama3, minicpm-v, etc.). A capacidade de compreensão visual não equivale à do GPT-4V, mas já é prática o suficiente para cenários de análise de captura de tela de UI, assistência OCR e descrição de produto.

💡 Dica: Para Modelos Multimodais, recomendamos usar llava:13b em vez de llava:7b — a compreensão visual da versão 13B é significativamente melhorada, especialmente em cenários que exigem descrição de detalhes (por exemplo, posições de elementos de UI, dados de gráficos). 7B é adequado para classificação simples; 13B é adequado para descrição e análise.

(1) O Problema: Muitas Capturas de Tela de Feedback de Usuários para Revisar

A equipe de e-commerce GlobalShop da Alice recebe mais de 50 itens de feedback de usuários diariamente, cada um com uma captura de tela de UI. Analisar capturas de tela manualmente e escrever relatórios de feedback é muito demorado. Alice quer automatizar esse processo.

(2) A Solução: Modelo de Visão Analisa Capturas de Tela Automaticamente

Usando o Modelo LLaVA para analisar automaticamente capturas de tela de UI e gerar relatórios de feedback estruturados:

BASH
ollama run llava "What UI issues do you see in this image?" /path/to/screenshot.png

3. Arquitetura de Modelos Multimodais

⚠️ Aviso: Modelos Multimodais (como llava) são 2-3x maiores que Modelos apenas de texto e o processamento de imagens consome mais VRAM. Uma GPU com 8GB de VRAM pode lidar apenas com imagens de baixa resolução; imagens de alta resolução podem causar OOM (out of memory). Teste com imagens pequenas primeiro.

(1) Princípios do Vision-Language Model (VLM)

100%
flowchart TD
    A[Entrada de Imagem] --> B[Codificador Visual<br/>CLIP/ViT]
    B --> C[Embeddings de Imagem]
    D[Entrada de Texto] --> E[Tokenizer de Texto]
    E --> F[Embeddings de Texto]
    C --> G[Camada de Projeção]
    F --> G
    G --> H[Modelo de Linguagem<br/>LLaMA/Mistral]
    H --> I[Saída de Texto]
Componente Função Exemplo de Modelo
Codificador Visual Extrair características da imagem CLIP ViT-L/14
Camada de Projeção Alinhar espaços visual e linguístico Adaptador MLP
Modelo de Linguagem Gerar descrição textual LLaMA 2 / Mistral

(2) Comparação de Modelos Multimodais Disponíveis

Modelo Parâmetros Tamanho Pontos Fortes Tipos de Imagem
llava 7B 4.7 GB Descrição geral de imagens Fotos/capturas de tela/documentos
llava-llama3 8B 5.5 GB Raciocínio mais forte + visão Compreensão de cenas complexas
llava:13b 13B 7.4 GB Maior precisão Reconhecimento de detalhes
minicpm-v 8B 5.2 GB OCR + chinês Documentos/tabelas
bakllava 7B 4.7 GB Leve e rápido Imagens simples

▶ Exemplo 1: Baixar e Executar LLaVA

BASH
# Pull the multimodal model
ollama pull llava

# Basic image description (CLI with file path)
ollama run llava "Describe this image in detail" /path/to/photo.jpg

# Without image: text-only mode
ollama run llava "What is machine learning?"

Saída:

TEXT
I'm a helpful AI assistant running locally on your machine...

4. Métodos de Entrada de Imagem via CLI

(1) Dois Métodos de Entrada de Imagem

⚠️ Nota: Imagens são automaticamente redimensionadas para a resolução máxima suportada pelo Modelo (tipicamente 336×336 ou 448×448 pixels) antes de serem alimentadas ao Modelo. Detalhes de imagens originais de resolução muito alta podem ser perdidos neste processo. Se você precisa que o Modelo reconheça texto pequeno ou detalhes em uma imagem, recorte a imagem para a área-chave primeiro em vez de enviar a imagem inteira em alta resolução.

Método Sintaxe Caso de Uso
Caminho de arquivo ollama run llava "prompt" /path/to/image.jpg Imagens locais, mais simples
Interativo Usar comando .image na conversa Entrada dinâmica de imagem

(2) Formatos de Imagem Suportados

Formato Extensão Tamanho Máximo Observações
JPEG .jpg/.jpeg Dentro dos limites Melhor para fotos
PNG .png Dentro dos limites Capturas de tela/conteúdo textual
WebP .webp Dentro dos limites Imagens web
GIF .gif Apenas primeiro frame Sem suporte a animação
⚠️ Nota: Imagens são redimensionadas para a resolução suportada pelo Modelo (tipicamente 336×336 ou 448×448 pixels). Detalhes de imagens de resolução muito alta podem ser perdidos.

▶ Exemplo 2: Interação Multimodal via CLI

BASH
# Start interactive session with image
ollama run llava

>>> .image /path/to/product-photo.jpg
>>> What product is shown and what are its key features?

# Output: The image shows a pair of premium wireless headphones...
# Key features include:
# 1. Over-ear design with memory foam cushions
# 2. Active noise cancellation
# 3. USB-C charging port visible on the left ear cup

>>> .image /path/to/chart.png
>>> Summarize the data trends shown in this chart

# Output: The chart displays quarterly revenue from 2023-2024...

Saída:

TEXT
I'm a helpful AI assistant running locally on your machine...

5. Chamadas Multimodais via API REST

(1) Formato de Requisição da API

Tanto /api/chat quanto /api/generate suportam o campo images, passando imagens codificadas em Base64:

Campo Tipo Descrição
images list[string] Lista de imagens codificadas em Base64
Cada imagem string Sem prefixo data:image/...

▶ Exemplo 3: Chamada de Imagem Base64 via API REST

BASH
# Convert image to Base64 and call API
IMAGE_BASE64=$(base64 -w 0 /path/to/photo.jpg)

curl http://localhost:11434/api/chat -d "{
  \"model\": \"llava\",
  \"messages\": [{
    \"role\": \"user\",
    \"content\": \"Describe this image\",
    \"images\": [\"$IMAGE_BASE64\"]
  }],
  \"stream\": false
}"

Saída:

TEXT
{"status":"ok","data":{}}

▶ Exemplo 4: Chamada Multimodal via SDK Python

PYTHON
import ollama
import base64
from pathlib import Path

def analyze_image(image_path: str, prompt: str, model: str = "llava") -> str:
    """Analyze an image using a multimodal model."""
    # Read and encode image
    image_data = base64.b64encode(
        Path(image_path).read_bytes()
    ).decode("utf-8")

    response = ollama.chat(
        model=model,
        messages=[{
            "role": "user",
            "content": prompt,
            "images": [image_data]
        }],
        stream=False
    )
    return response["message"]["content"]

# Usage
result = analyze_image(
    "/path/to/screenshot.png",
    "List all UI issues you can identify in this screenshot"
)
print(result)

Saída:

TEXT
# Function defined successfully

6. Cenários Práticos

(1) Comparação de Cenários

Cenário Entrada Modelo Recomendado Exemplo de Prompt
Descrição de produto Foto do produto llava "Describe this product for an e-commerce listing"
Análise de Bug Captura de tela de UI llava-llama3 "What UI bugs are visible in this screenshot?"
Assistência OCR Escaneamento de documento minicpm-v "Extract all text from this document image"
Interpretação de gráfico Gráfico de dados llava "Summarize the trends in this data chart"
Revisão de segurança Imagem de conteúdo llava "Does this image contain any unsafe content?"

▶ Exemplo 5: Análise de Captura de Tela de UI da Alice

PYTHON
import ollama
import base64
from pathlib import Path
import json

def analyze_ui_screenshot(image_path: str) -> dict:
    """Analyze a UI screenshot and return structured feedback."""
    image_data = base64.b64encode(
        Path(image_path).read_bytes()
    ).decode("utf-8")

    system_prompt = """You are a UI/UX expert reviewing application screenshots.
Analyze the screenshot and provide feedback in this JSON format:
{
  "issues": [{"type": "layout|color|text|accessibility", "description": "...", "severity": "high|medium|low"}],
  "summary": "Brief overall assessment"
}"""

    response = ollama.chat(
        model="llava-llama3",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": "Review this UI screenshot for issues",
             "images": [image_data]}
        ],
        stream=False,
        format="json",
        options={"temperature": 0.3}
    )

    try:
        return json.loads(response["message"]["content"])
    except json.JSONDecodeError:
        return {"raw": response["message"]["content"]}

# Usage
feedback = analyze_ui_screenshot("/path/to/app-screenshot.png")
print(json.dumps(feedback, indent=2))

Saída:

TEXT
# Function defined successfully

7. Exemplo Abrangente: Sistema de Assistente de Atendimento Multimodal

PYTHON
# ============================================
# Comprehensive: Multimodal customer service
# Image analysis + text chat for e-commerce
# ============================================

import ollama
import base64
from pathlib import Path
from dataclasses import dataclass
from typing import Optional

@dataclass
class MultimodalSupport:
    chat_model: str = "qwen2.5"
    vision_model: str = "llava"
    temperature: float = 0.3

    def handle_product_query(
        self, image_path: str, question: str
    ) -> str:
        """Answer product questions using image + text."""
        image_data = base64.b64encode(
            Path(image_path).read_bytes()
        ).decode("utf-8")

        response = ollama.chat(
            model=self.vision_model,
            messages=[{
                "role": "user",
                "content": f"Answer this question about the product shown: {question}",
                "images": [image_data]
            }],
            stream=False,
            options={"temperature": self.temperature}
        )
        return response["message"]["content"]

    def handle_damage_report(
        self, image_path: str, order_id: str
    ) -> str:
        """Process a damage report with photo evidence."""
        image_data = base64.b64encode(
            Path(image_path).read_bytes()
        ).decode("utf-8")

        # Step 1: Analyze damage from image
        damage_desc = ollama.chat(
            model=self.vision_model,
            messages=[{
                "role": "user",
                "content": "Describe the damage visible in this product photo. Be specific about the type and severity.",
                "images": [image_data]
            }],
            stream=False,
            options={"temperature": 0.2}
        )["message"]["content"]

        # Step 2: Generate response using chat model
        response = ollama.chat(
            model=self.chat_model,
            messages=[
                {"role": "system", "content": "You are an e-commerce customer service agent handling damage reports."},
                {"role": "user", "content": f"Order {order_id} has damage: {damage_desc}. Generate a polite response acknowledging the damage and explaining the refund/replacement process."}
            ],
            stream=False,
            options={"temperature": self.temperature}
        )
        return response["message"]["content"]

    def extract_text_from_image(
        self, image_path: str
    ) -> str:
        """OCR-like text extraction from document images."""
        image_data = base64.b64encode(
            Path(image_path).read_bytes()
        ).decode("utf-8")

        response = ollama.chat(
            model="minicpm-v",
            messages=[{
                "role": "user",
                "content": "Extract all visible text from this image. Preserve the original layout and formatting.",
                "images": [image_data]
            }],
            stream=False,
            options={"temperature": 0.1}
        )
        return response["message"]["content"]

# Usage
if __name__ == "__main__":
    service = MultimodalSupport()

    print("=== Damage Report ===")
    # print(service.handle_damage_report("damaged_item.jpg", "#12345"))

    print("=== Product Query ===")
    # print(service.handle_product_query("headphones.jpg", "Does this have noise cancellation?"))

    print("=== OCR Extraction ===")
    # print(service.extract_text_from_image("receipt.png"))

❓ Perguntas Frequentes

P: Modelos Multimodais e Modelos apenas de texto podem ser usados interchangeably? R: Não. Modelos Multimodais processam imagens + texto; Modelos apenas de texto só processam texto. Modelos Multimodais podem lidar com entrada apenas de texto sem imagens, mas Modelos apenas de texto não podem processar imagens.

P: A resolução da imagem afeta a velocidade de Inferência? R: Sim. Imagens de resolução mais alta codificam mais tokens, aumentando o tempo de Inferência. O Ollama redimensiona automaticamente para a resolução máxima suportada pelo Modelo — sem necessidade de ajuste manual.

P: Uma única imagem pode ter múltiplas perguntas? R: Sim. Liste múltiplas perguntas no prompt e o Modelo responderá uma a uma. No entanto, recomendamos focar em 1-2 perguntas por chamada para respostas mais precisas.

P: Quão boa é a capacidade em chinês do llava? R: llava é principalmente orientado para inglês. Para descrição de imagens em chinês, recomendamos minicpm-v ou qwen2.5-vl (se disponível). Usar prompts em chinês produzirá respostas em chinês.

P: Vídeo pode ser processado? R: Atualmente o Multimodal do Ollama suporta apenas imagens estáticas. Vídeo requer extrair quadros-chave como imagens primeiro, depois analisar quadro a quadro. GIF processa apenas o primeiro frame.

P: Imagens codificadas em Base64 são muito grandes, o que devo fazer? R: Comprima imagens para uma resolução razoável primeiro (por exemplo, dentro de 1024px). Qualidade JPEG definida para 80 é geralmente suficiente. Evite enviar originais de 10MB+.


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Baixe o Modelo llava, use o CLI para analisar uma foto de produto e descrever suas características.
  2. Intermediário (Dificuldade ⭐⭐): Use o SDK Python para implementar diálogo de múltiplas rodadas com imagem + texto — primeiro analise o conteúdo da imagem, depois faça perguntas de acompanhamento baseadas na análise.
  3. Avançado (Dificuldade ⭐⭐⭐): Construa uma ferramenta automatizada de revisão de capturas de tela de UI para Alice: insira uma captura de tela, produza um relatório de Bug estruturado em JSON (tipo, descrição, severidade), e classifique e arquive automaticamente.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%