Inteligência artificial, sem ruído.
Tutoriais3 min

Como construir fluxos multimodais com um LLM local usando Gemma 4 e Ollama

Tutorial prático: transforme fotos em registros estruturados com saída JSON de um LLM local, do pré-processamento à síntese.

Como construir fluxos multimodais com um LLM local usando Gemma 4 e Ollama

Por que rodar um LLM multimodal localmente

Executar um modelo de linguagem na própria máquina é atraente quando se trabalha com dados privados ou quando o fluxo precisa rodar sem depender de nuvem. E esse tipo de workflow já não precisa se limitar a texto. Neste tutorial, construímos um fluxo multimodal usando a família Gemma 4 do Google com o Ollama, colocando a capacidade visual do modelo dentro de um processo maior em que etapas posteriores consomem sua saída estruturada.

O conceito: multimodal + workflow

Há duas ideias por trás do termo “workflow multimodal”. Multimodal significa que, além de texto, o LLM recebe entradas de outros tipos — como imagens. Workflow significa que o modelo opera dentro de uma sequência pré-definida, em que cada estágio recebe uma entrada e produz uma saída para o próximo, funcionando como uma função de transformação semântica — e não como um agente que decide sozinho o próximo passo.

O caso de estudo é transformar uma pasta de fotos de viagem em registros organizados de memória, em três estágios: preparar as imagens e extrair metadados, analisar cada foto com o modelo e, por fim, sintetizar o resumo da viagem inteira.

Configurando o ambiente

Instale o Ollama e baixe o modelo edge-friendly da família:

ollama pull gemma4:e4b
pip install ollama pillow pydantic

O pacote ollama conecta o Python ao LLM local, o pillow processa as imagens e o pydantic estrutura a saída.

Saída estruturada com Pydantic

Em vez de pedir texto livre, definimos um schema que o modelo deve seguir. Isso permite que o código acesse o resultado por atributos tipados ou o converta em dicionário com model_dump():

from pydantic import BaseModel, Field

class PhotoMemoryAnalysis(BaseModel):
    scene_summary: str
    memory_caption: str
    place_type: str
    visible_objects: list[str]
    mood: str
    uncertainty_notes: list[str]
    confidence: float = Field(ge=0, le=1)

Na chamada, passamos a imagem pelo campo images e o schema pelo parâmetro format, com temperatura zero para máxima consistência:

import ollama

response = ollama.chat(
    model="gemma4:e4b",
    messages=[
        {"role": "system", "content": PHOTO_ANALYSIS_INSTRUCTION},
        {"role": "user", "content": prompt, "images": [image]},
    ],
    format=PhotoMemoryAnalysis.model_json_schema(),
    options={"temperature": 0},
)

Pitfall: entrada de imagem no Ollama

Um problema comum: em algumas versões do Ollama (testado na 0.32.5 no Windows), o modelo aceita a requisição multimodal mas não usa de fato o conteúdo visual. A solução adotada foi carregar a Gemma 4 a partir de dois arquivos GGUF do repositório da Unsloth — o projetor multimodal mmproj-BF16.gguf e o modelo quantizado gemma-4-E4B-it-UD-Q4_K_XL.gguf — e importá-los com um Modelfile. Se o gemma4:e4b já responde corretamente a imagens na sua máquina, esse contorno é desnecessário.

Do registro ao resumo da viagem

Depois de analisar cada foto, passamos os registros de volta ao modelo para conectar os momentos individuais em uma memória única da viagem, com outro schema (TripMemorySynthesis) que inclui resumo narrativo, interesses inferidos, temas recorrentes e momentos memoráveis. O resultado é um pipeline completo: do arquivo de imagem bruto a uma memória estruturada — que ainda pode alimentar um pequeno aplicativo com busca e perguntas sobre a viagem, tudo com um LLM local.


Descubra mais sobre noticiAI

Assine para receber nossas notícias mais recentes por e-mail.

R
Sobre o autorRedação Noticiai

Equipe editorial dedicada a explicar inteligência artificial com clareza, independência e contexto.