O problema
Se está a tentar evoluir na fotografia, conseguir feedback útil é mais difícil do que parece. Amigos dizem "ficou bom". Fóruns trazem opiniões contraditórias. Críticas profissionais custam caro e demoram. Eu batia sempre no mesmo ponto: sabia que as minhas fotos podiam melhorar, mas não sabia exatamente porquê nem como.
A frustração real não era falta de feedback, e sim falta de feedback específico e acionável. Ferramentas genéricas de IA diziam "boa composição" sem explicar o motivo, ou davam conselhos que contradiziam princípios básicos de fotografia.
Como construí a solução
O AI Photo Critique começou com uma pergunta: e se eu desse à IA a mesma base de conhecimento de um instrutor profissional de fotografia? Em vez de torcer para um modelo genérico "saber" regra dos terços ou linhas-guia, eu poderia garantir isso ao injetar princípios curados no momento da crítica.
Foi aí que usei RAG (Retrieval-Augmented Generation). Em vez de fine-tuning (caro e pouco flexível), RAG permite trazer contexto relevante dinamicamente para o prompt.
O que eu construí:
- Pipeline multimodal de análise: ao enviar uma foto, o GPT-4o Vision gera uma descrição detalhada (composição, luz, clima, técnica). Essa descrição vira consulta para recuperação.
- Base de conhecimento curada: criei um banco vetorial no Pinecone com princípios de composição, iluminação e recomendações por gênero fotográfico.
- Geração de crítica com contexto: descrição da imagem + trechos recuperados são combinados em um prompt aumentado para gerar feedback ancorado em princípios reais.
- Orquestração com LangChain.js: coordenação de chunking, embeddings, retrieval e montagem de prompt. Frontend em Next.js + Tailwind CSS.
Desenhando a experiência
Antes de codificar, foquei no que fotógrafos precisam: clareza e estrutura. Um bloco de texto longo não ajuda a evoluir.
Escolhi formato em duas partes: "O que funciona bem" e "Pontos de melhoria". É o mesmo padrão de review profissional de portfólio. Reconhece acertos e depois aponta crescimento.
A crítica é renderizada em Markdown para facilitar leitura. Títulos, listas e ênfases tornam tudo escaneável. No prompt de sistema, eu forço essa estrutura para evitar respostas vagas.
Também cuidei do fluxo de upload: manter a foto visível enquanto análise roda, com indicador claro de progresso.
Por dentro do pipeline RAG
Exemplo de fluxo para uma foto da Golden Gate Bridge:
Etapa 1: modelo de visão gera descrição
{
"image_description": "A vertical photograph of the Golden Gate Bridge, partially obscured by a thick layer of fog. The iconic red-orange tower on the right is prominent, rising above the low-hanging clouds. The foreground is the dark, choppy water of the bay. The composition follows the rule of thirds, with the main tower positioned off-center. The mood is somber and atmospheric due to the fog."
}
Etapa 2: RAG recupera contexto relevante
{
"retrieved_chunks": [
{
"source": "composition_guide.pdf",
"text": "The Rule of Thirds is a fundamental principle. By placing key elements along the lines or at their intersections, you create a more balanced and engaging photograph than simply centering the subject."
},
{
"source": "landscape_photography.pdf",
"text": "Atmospheric conditions like fog or mist can be powerful tools for creating mood and a sense of depth. Use them to obscure parts of the scene, adding mystery and drawing focus to your primary subject."
}
]
}
Etapa 3: prompt aumentado enviado ao LLM
{
"system_prompt": "You are an expert, objective photography critic. Your goal is to provide honest, professional feedback to help a photographer improve their craft.",
"context": [
"The Rule of Thirds is a fundamental principle. By placing key elements along the lines or at their intersections, you create a more balanced and engaging photograph than simply centering the subject.",
"Atmospheric conditions like fog or mist can be powerful tools for creating mood and a sense of depth. Use them to obscure parts of the scene, adding mystery and drawing focus to your primary subject."
],
"image_description": "A vertical photograph of the Golden Gate Bridge, partially obscured by a thick layer of fog. The iconic red-orange tower on the right is prominent, rising above the low-hanging clouds. The composition follows the rule of thirds, with the main tower positioned off-center.",
"instructions": "Generate a critique formatted in Markdown. Structure your response with two main headings: '## What Works Well' and '## Areas for Improvement'."
}
Lidando com o mundo real
Um produto público de IA precisa lidar com abuso, falhas e casos extremos.
Mantendo custos sustentáveis
Como OpenAI e Pinecone cobram por uso, rate limiting não é opcional. Implementei limitação por IP com Upstash Redis. Cada IP tem cota por janela de tempo; ao atingir o limite, o utilizador recebe uma mensagem clara.
Validação de imagens
Nem todo upload é uma foto válida. A aplicação valida tipo e tamanho antes de processar. Imagens muito grandes são bloqueadas com mensagem útil, evitando timeout e custo desnecessário.
Quando dá problema
- Se o modelo de visão falha/timeout, mostramos erro amigável com opção de tentar novamente.
- Se o Pinecone estiver indisponível, ainda geramos crítica sem contexto recuperado (degradação elegante).
- Estados de loading deixam claro que o sistema está processando.
O que aprendi
RAG venceu fine-tuning para esse caso. Ficou mais barato, flexível e fácil de atualizar.
Prompt engineering é invisível e essencial. A diferença entre um prompt genérico e um bem projetado é enorme.
Pipelines multimodais são mais complexos. Se a descrição inicial da imagem erra, o retrieval também se desvia.
APIs públicas precisam de proteção desde o dia zero. Rate limiting evita surpresas de custo.
Estrutura transforma saída de IA em utilidade real. Formato explícito em Markdown deixou a resposta objetiva e aplicável.
Curadoria da base de conhecimento é contínua. Conforme novos tipos de foto aparecem, surgem lacunas para cobrir.
