2 pontos por GN⁺ 2024-12-09 | 1 comentários | Compartilhar no WhatsApp

Saída estruturada

6 de dezembro de 2024

O Ollama agora oferece suporte a saídas estruturadas, que permitem restringir a saída do modelo a um formato específico definido por um esquema JSON. As bibliotecas Ollama para Python e JavaScript também foram atualizadas para oferecer suporte a saídas estruturadas.

  • Casos de uso de saídas estruturadas:
    • Análise de dados em documentos
    • Extração de dados de imagens
    • Estruturação de respostas de qualquer modelo de linguagem
    • Maior confiabilidade e consistência do que o modo JSON

Primeiros passos

  • Baixe a versão mais recente do Ollama
  • Atualize a biblioteca Ollama para Python ou JavaScript para a versão mais recente
cURL
  • É possível passar saídas estruturadas ao modelo usando o parâmetro format
Saída
  • A resposta é retornada no formato definido pelo esquema JSON da solicitação
Python
  • Use a biblioteca Ollama para Python para passar o esquema como um objeto JSON no parâmetro format
  • Recomenda-se usar Pydantic para serializar o esquema
Saída
  • name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
  • Use a biblioteca Ollama para JavaScript para passar o esquema como um objeto JSON no parâmetro format
  • Recomenda-se usar Zod para serializar o esquema
Saída
  • { name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }

Exemplos

Extração de dados

  • Defina um esquema que represente as informações para extrair dados estruturados de um texto
  • O modelo extrai as informações e retorna os dados em JSON de acordo com o esquema definido
Exemplo de saída
  • pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]

Descrição de imagem

  • Saídas estruturadas podem ser usadas com modelos de visão
  • Use llama3.2-vision para descrever uma imagem e retornar uma saída estruturada
Exemplo de saída
  • summary='A palm tree on a sandy beach with blue water and sky.'
  • objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]
  • scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
Compatibilidade com OpenAI
  • Compatível com saídas estruturadas usando o cliente da OpenAI

Dicas

  • Para usar saídas estruturadas com confiabilidade:
    • Use Pydantic (Python) ou Zod (JavaScript) para definir o esquema de resposta
    • Adicione "retorne em JSON" ao prompt para que o modelo entenda a solicitação
    • Defina a temperatura como 0 para uma saída mais determinística

Próximos passos

  • Exposição de logits para geração controlada
  • Melhorias de desempenho e precisão das saídas estruturadas
  • Aceleração por GPU para sampling
  • Suporte a formatos adicionais além de esquema JSON

1 comentários

 
GN⁺ 2024-12-09
Opiniões no Hacker News
  • É possível definir restrições de saída mais fortes por meio do recurso gbnf do llama.cpp

  • É útil ao estruturar um prompt comum e convertê-lo em dados csv, pois permite remover texto desnecessário

  • Ao usar gemma2:2b e inserir texto, é possível obter uma saída estruturada no formato JSON

    • Exemplo de entrada: "You have spent 190 at Fresh Mart. Current balance: 5098"
    • Exemplo de saída: {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • Há comentários perguntando como as restrições afetam a qualidade da saída do LLM

    • Dependendo do caso, fazer parsing em Markdown ou texto simples pode oferecer melhor qualidade
  • Há uma pergunta sobre se isso pode ser usado com os modelos compatíveis

    • No hardware pessoal, só é possível executar com estabilidade modelos de 1b a 3b
  • Há curiosidade sobre se llama.cpp e ollama aproveitam o recurso de saída estruturada do llama ou se isso foi implementado de outra forma

    • Na página do Llama da Meta, é mencionado que o modelo oferece suporte nativo a saída estruturada
  • Há uma pergunta sobre qual valor adicional isso oferece em comparação com outlines

  • O motivo para continuar usando o oobabooga é que o suporte a exlv2 oferece inferência mais eficiente em dual 3090s

  • Seria melhor se o exemplo em curl aparecesse primeiro

    • Gosto do Pydantic, mas codificar o schema manualmente facilita levar o protótipo para Go
  • Há uma pergunta sobre a melhor forma de fornecer entrada estruturada ao LLM

    • Ex.: inserir 100 frases e classificar cada uma de uma forma diferente
    • Obter dados estruturados é fácil, mas usar números de linha como prefixo parece estranho