Ollama: Modelos Multimodais
Modelos Multimodais dão olhos à IA — veja uma imagem, descreva-a em palavras, tudo de uma vez.
📋 Pré-requisitos: Você precisa dominar o seguinte primeiro
- Aula 4: Gerenciamento de Modelos
1. O Que Você Vai Aprender
- Arquitetura de Modelos Multimodais: Codificador Visual + Decodificador de Linguagem
- Métodos de entrada de imagem via CLI
- Chamadas Multimodais via API REST: campo images
- Cenários práticos: descrição de produto, análise de Bug, assistência OCR
- Cenário de análise de captura de tela de UI da Alice
2. Uma História Real de Uma Fundadora de SaaS
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:
ollama run llava "What UI issues do you see in this image?" /path/to/screenshot.png
3. Arquitetura de Modelos Multimodais
(1) Princípios do Vision-Language Model (VLM)
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
# 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:
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
| 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 |
▶ Exemplo 2: Interação Multimodal via CLI
# 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:
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
# 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:
{"status":"ok","data":{}}
▶ Exemplo 4: Chamada Multimodal via SDK 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:
# 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
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:
# Function defined successfully
7. Exemplo Abrangente: Sistema de Assistente de Atendimento Multimodal
# ============================================
# 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
- Modelo Multimodal = Codificador Visual + Camada de Projeção + Modelo de Linguagem, permitindo compreensão imagem-texto
- A série llava é o Modelo de visão principal do Ollama, suportando fotos/capturas de tela/documentos
- CLI usa caminhos de arquivo para entrada de imagem; API usa campo de imagens codificadas em Base64
- Cenários práticos: descrição de produto, análise de Bug, assistência OCR, interpretação de gráficos
- SDK Python passa dados de imagem Base64 via lista images
- Alice automatizou análise de capturas de tela de UI com llava, reduzindo cada uma de 10 minutos para 5 segundos
📝 Exercícios
- Básico (Dificuldade ⭐): Baixe o Modelo llava, use o CLI para analisar uma foto de produto e descrever suas características.
- 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.
- 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.