Microsoft revela Flint, linguagem de visualização para agentes de IA
(microsoft.github.io)- Flint é uma linguagem intermediária de visualização que ajuda agentes de IA a criar gráficos expressivos a partir de especificações curtas e editáveis por humanos
- O compilador interpreta os dados, os tipos semânticos, o tipo de gráfico e as codificações, preenchendo automaticamente configurações de baixo nível como escala, eixos, espaçamento e layout
- Oferece 46 tipos de gráfico e 83 exemplos na galeria, com suporte a renderização em Vega-Lite, ECharts e Chart.js
- Em ambientes TypeScript / JavaScript, pode ser instalado via npm, e em fluxos de trabalho com agentes é possível usar um servidor MCP
- Oculta as diferenças de API entre os backends atrás de uma interface unificada, facilitando trocar o renderizador ou alterar o design do gráfico a partir da mesma especificação
O problema que o Flint tenta resolver
- Flint é um projeto da Microsoft Research, uma linguagem intermediária de visualização projetada para que agentes de IA gerem gráficos a partir de especificações simples e editáveis por humanos
- A especificação é composta por dados, tipos semânticos e especificação do gráfico
- Um exemplo de especificação define
periodcomoYearMonth,totalUserscomoQuantityegameTypeeregioncomoCategory - Em um
Line Chart, vincularegionà coluna,periodao eixo x,totalUsersao eixo y egameTypeà cor para criar um gráfico de linhas de usuários ativos mensais por região
- Um exemplo de especificação define
- Pode ser instalado em ambientes TypeScript / JavaScript via npm
- Em fluxos de trabalho com agentes, é possível usar o servidor MCP
- Na galeria, é possível ver 46 tipos de gráfico e 83 exemplos
Como a especificação é transformada em gráfico
- O Flint parte de uma especificação compacta, gera uma especificação nativa do backend, como Vega-Lite, e renderiza o gráfico preenchendo os detalhes de baixo nível necessários
- Tipos semânticos expressam o significado dos campos de dados
- Os exemplos incluem tipos como
Rank,YearMonth,DeltaeTemperature - Com base nisso, o Flint infere configurações do gráfico como parsing, escalas, eixos, formatação e esquema de cores
- Em um mapa de calor que mostra novos usuários líquidos por jogo e por mês, ele determina com base nos tipos semânticos o parser de valores temporais, a formatação dos eixos, o esquema de cores divergente e o ponto médio
- Os exemplos incluem tipos como
- A otimização automática de layout é baseada em um modelo de layout elástico e no princípio de banking
- O compilador gerencia dinamicamente tamanho, espaçamento e posicionamento para ajustar o gráfico à área disponível
- Quando o número de gráficos de barras agrupadas aumenta, ele amplia a área de desenho e reduz a band width para que versões mais densas também caibam no canvas
- Alterações no design do gráfico podem ser tratadas trocando o tipo de gráfico e refazendo o vínculo das codificações visuais
- Ao transformar um faceted bar chart da distribuição populacional por sexo e idade do censo dos EUA de 2000 em um pyramid chart, o usuário precisa mudar apenas o tipo de gráfico, e o compilador cuida do restante
Backends de renderização e disponibilidade
- O Flint oferece suporte a 46 tipos de gráfico em Vega-Lite, ECharts e Chart.js
- Esconde APIs e modelos de programação diferentes atrás de uma interface unificada
- Quando o Vega-Lite não tem suporte nativo a sunburst, é possível trocar para ECharts
- Para visualizar a hierarquia região × gameType × game, um sunburst chart é apresentado como alternativa melhor do que um gráfico de barras agrupadas
- O Flint é open source e já pode ser usado
- Há um GitHub e exemplos da galeria como ponto de partida
- A Microsoft Research desenvolveu o Flint em colaboração com a IDEAS Lab e a Renmin University of China
1 comentários
Comentários do Hacker News
Entendo por que esse marketing de “para agentes de IA” é necessário, mas no fim das contas o fato de ser uma linguagem que facilita a expressão de gráficos já é suficientemente impressionante e útil
A página também explica: “em vez de exigir parâmetros verbosos de baixo nível como escala, eixos, espaçamento e layout, o compilador do Flint deriva configurações de gráfico otimizadas a partir dos dados, do tipo semântico, do tipo de gráfico e da codificação”
Um novo padrão está surgindo em sistemas de agentes, e este projeto é um bom exemplo disso
Trata-se de ter alguma representação intermediária (IR) que o LLM gera e repassa, e então colocar por cima uma camada determinística como um compilador ou gerador de código. Acho que veremos essa estrutura com mais frequência no futuro próximo
Não está na página, mas ao criar visualizações de dados é muito importante incorporar acessibilidade já na fase de design
Este podcast resume bem uma entrevista curta sobre o tema: https://open.spotify.com/episode/18dHTAxCCeIaLOTch6tRld
O entrevistado é Frank Elavsky, que parece ser bem conhecido nessa área, e também criou o projeto Chartability, com heurísticas, princípios e diretrizes para auditoria de acessibilidade: https://chartability.github.io/POUR-CAF/
Adicionei uma issue para acompanhamento: https://github.com/microsoft/flint-chart/issues/48
Fico curioso se existe alguma explicação concreta de como isso é melhor ou diferente do próprio Vega: https://vega.github.io/vega/docs/specification/
O Vega já é uma DSL expressiva para visualização, e imagino que também esteja amplamente presente nos dados de treinamento de LLMs
O Flint é uma abstração de nível mais alto, então a especificação é muito mais curta e simples, e o compilador deriva as decisões de baixo nível para produzir gráficos visualmente bons. Em outras palavras, ele permite que agentes criem, com programas curtos, bons gráficos que antes exigiam programas longos
Não concordo muito com a afirmação de que “especificações simples de gráfico podem ser estáveis, mas dependem dos padrões do sistema e geram gráficos de baixa qualidade, enquanto especificações complexas podem produzir gráficos bonitos, mas são verbosas e difíceis para agentes lidarem de forma estável”
Pela pouca experiência que tive construindo agentes de análise, achei impressionante como LLMs fazem visualizações muito bem em Python e R. O mesmo valia para modelos pequenos de pesos abertos, e em muitos casos bastava iterar um pouco sobre as ambiguidades para que as desvantagens desaparecessem. Fico curioso se existe alguma linha de pesquisa que sustente essa afirmação ou mostre onde surgem os problemas
Pessoalmente, acho que Claude e ChatGPT geram bem modelos de ggplot, mas quando a customização aumenta fica um pouco mais complicado
A descrição de “parâmetros de baixo nível verbosos, como escala, eixo, espaçamento e layout” faz parecer que a Microsoft está misturando duas coisas diferentes
O LLM em si não liga muito se o código é de baixo nível e verboso; ele também consegue ler bem assembly ou SPIR-V. O problema real é a composição visual. Como o LLM “vê” de forma diferente de humanos, entender composição espacial por comparação visual não é algo natural, e, para contornar isso, é preciso oferecer uma representação que o LLM consiga raciocinar e entender com facilidade, como uma visualização em forma de código. Em outras palavras, desde que não seja uma estrutura profundamente aninhada ou que exija inferir estados ocultos, tudo bem
Também é difícil concordar com a decisão do Flint de tratar tipos em JSON com foco em chaves de string. Olhando a especificação real, isso poderia simplesmente ter sido feito como uma biblioteca TypeScript agradável de usar por humanos, e isso provavelmente teria sido muito melhor. Depois, ao ver o código-fonte de fato, ele pareceu muito mais completo e sofisticado do que o mockup que eu tinha imaginado só pela documentação, mas a reclamação central de “JSON com chaves de string versus uma superfície real de escrita com genéricos” continua
chartTypenão me parece muito elegante, porque os templates precisariam ser mais extensíveis. Essa parte precisa de ajusteTirando isso, usar JSON em bibliotecas de visualização ou diagramação é algo bem comum. Porque é fácil de transportar entre diferentes contextos de renderização
Texto relacionado: https://www.openui.com/blog/stop-making-ai-write-json
Tenho interesse em DSLs customizadas para aumentar a previsibilidade dos LLMs, e é bom ver que até um gigante como a Microsoft parece ter entendido isso. O exemplo Contacts em https://slangify.org/examples mostra uma forma de criar facilmente uma DSL própria enquanto converte de ida e volta entre VCARD e JCARD
Ao ler a explicação de que “isso faz você explicitar decisões visuais que um bom compilador deveria resolver”, dá a impressão de que Graphviz já existe exatamente por esse motivo
Ver JSON sendo usado como linguagem declarativa reforça que, mesmo admitindo que LLMs lidam bem com JSON, isso não o torna uma sintaxe agradável para consumo humano
O Flint foi projetado intencionalmente para permitir que agentes ignorem parâmetros de baixo nível como escala, eixo, linha de base zero e tamanho de passo. Esses elementos são muito importantes para um gráfico visualmente bom, e o compilador os otimiza dinamicamente. Por isso, fica mais fácil para agentes de IA lidarem com isso
Usar tipos semânticos como elemento adicional de formatação é muito útil. Porque isso codifica de forma concisa uma grande quantidade de boilerplate de formato
Fico curioso se há planos para compartilhar o registro de tipos do Flint ou torná-lo extensível. Também queria entender por que isso não fica simplesmente como parte dos próprios atributos dos dados. Ao criar gráficos vinculados de nível mais alto sobre o Vega-Lite, cheguei praticamente à mesma especificação
Não entendo muito bem qual é o ponto principal deste projeto. Desde a época do GPT-3.5, os LLMs já pareciam capazes de gerar matplotlib de uma vez só
Já usei bastante LLMs para visualização de dados e não tive grandes problemas. Queria ver exemplos concretos de onde exatamente agentes têm dificuldade ao gerar visualizações e como o Flint resolve isso
Mas, quando você coloca isso em uma ferramenta para usuários finais, uma taxa de sucesso de 80% na geração de gráficos bonitos começa a virar um grande problema. Passei por isso ao construir um sistema de análise de dados. Se você fizer o modelo gerar matplotlib ou Vega-Lite diretamente, é difícil obter ao mesmo tempo confiabilidade, expressividade, custo, tempo e uso de tokens; então essa linguagem foi desenhada como um meio-termo que transfere algumas decisões para o compilador, reduzindo o custo de geração sem perder expressividade
Página do projeto: https://microsoft.github.io/flint-chart/
Configuração do MCP: https://microsoft.github.io/flint-chart/#/mcp