Produzindo saídas estruturadas de LLMs com amostragem restrita
Grandes modelos de linguagem (LLMs) transformaram a forma como interagimos com dados não estruturados, permitindo sistemas que geram texto criativo, extraem insights e automatizam tarefas. No entanto, embora esses modelos produzam conteúdo em formato livre, eles frequentemente ficam aquém quando a saída deve seguir formatos específicos—como JSON, XML ou esquemas predefinidos. Essa limitação é crítica para casos de uso do mundo real em que a precisão importa, como assistentes de programação, agentes de tomada de decisão e sistemas de extração de informações estruturadas.
Em um recente Unstructured Data Meetup em South Bay, Stefan Webb da Zilliz apresentou uma solução prática para esse desafio: amostragem restrita. Neste artigo, exploraremos os principais insights de sua palestra, incluindo o papel da busca semântica no processamento de dados não estruturados, como máquinas de estados finitos permitem uma geração confiável e implementações práticas usando ferramentas modernas. Também examinaremos como essas técnicas se integram a bancos de dados vetoriais para criar aplicações de IA robustas que lidam tanto com o processamento de dados não estruturados quanto com a geração de saída estruturada.
O que é Busca Semântica e Por Que Ela Importa
A busca semântica difere da busca tradicional baseada em palavras-chave ao focar no significado e no contexto por trás das consultas. Em vez de corresponder palavras exatas, a busca semântica processa as relações entre termos para entregar resultados mais relevantes. Essa capacidade é essencial em um mundo onde a maioria dos dados é não estruturada, incluindo texto, imagens, áudio e vídeos. Veja como dados não estruturados são transformados em insights acionáveis.
Figura: Pipeline de transformação de dados não estruturados em insights acionáveis
Esse pipeline começa pela ingestão de dados brutos, incluindo documentos, imagens, gravações de áudio e vídeos. Os dados passam por modelos de deep learning que geram embeddings vetoriais, que são representações numéricas de alta dimensionalidade das propriedades semânticas dos dados. Esses embeddings são armazenados em bancos de dados vetoriais como Milvus para recuperação eficiente. Por fim, algoritmos de busca semântica operam sobre esses embeddings para identificar e classificar resultados com base na relevância. Agora, vamos ver como é o espaço vetorial.
Figura: Visualização do espaço de embeddings agrupando conceitos semelhantes
Na visualização de espaços de embeddings, conceitos semelhantes são agrupados. Por exemplo, frases como cachorro feliz abanando o rabo e um cachorro com um sorriso são agrupadas próximas porque transmitem significados semelhantes. Por outro lado, tópicos não relacionados, como um prédio grande, são posicionados distantes no espaço. Esse agrupamento permite que os sistemas recuperem resultados semanticamente relevantes mesmo quando as consultas usam formulações diferentes.
A busca semântica é cada vez mais vital à medida que o volume de dados não estruturados cresce. Até 2025, estima-se que mais de 90% dos dados gerados serão não estruturados, ressaltando a necessidade de sistemas capazes de compreensão semântica.
Figura: Mais de 90% dos dados recém-gerados em 2025 serão não estruturados.
Amostragem Multinomial: A Base da Geração de Texto
A geração de texto em LLMs é impulsionada pela amostragem multinomial, um processo que gera sequências token por token com base em probabilidades aprendidas a partir dos dados de treinamento. Cada token pode representar uma palavra, um caractere ou uma parte de uma palavra, e o modelo seleciona o próximo token por meio de amostragem a partir de uma distribuição de probabilidade.
Figura: Amostragem Multinomial Básica de LLMs
O algoritmo começa com uma sequência vazia e adiciona tokens iterativamente até que a sequência esteja completa ou uma condição de parada seja atendida. Em cada etapa, o modelo calcula probabilidades para todos os possíveis próximos tokens e realiza a amostragem de um deles com base nessas probabilidades. Embora esse método seja excelente para produzir texto em formato livre, ele carece de mecanismos para impor regras estruturais. Por exemplo, gerar JSON válido ou código bem-formado muitas vezes requer pós-processamento para corrigir erros estruturais.
Essa limitação destaca a necessidade de amostragem guiada, que incorpora restrições ao processo de geração para garantir que as saídas sigam estruturas predefinidas.
Amostragem Guiada: Aplicando Regras Estruturais Durante a Geração
A amostragem guiada aprimora o processo básico de amostragem multinomial ao aplicar restrições que orientam a geração. Essas restrições são aplicadas por meio de máscaras binárias, que filtram tokens inválidos em cada etapa. As máscaras se adaptam dinamicamente com base no contexto atual da saída, garantindo que a sequência gerada permaneça válida.
Figura: Saída Estruturada por Amostragem Guiada
Por exemplo, ao gerar JSON, o sistema pode restringir o próximo token a um nome de campo após uma chave de abertura {. Da mesma forma, na geração de código, as restrições poderiam impor a sintaxe adequada bloqueando caracteres inválidos ou instruções incompletas. Essa abordagem elimina a necessidade de validação ou correções extensivas após a geração, tornando-a particularmente útil para aplicações como extração de informações e agentes de tomada de decisão.
Ao introduzir estrutura diretamente no processo de geração, a amostragem guiada preenche a lacuna entre as capacidades criativas dos LLMs e a precisão necessária para saídas estruturadas. Esse método é a base para implementar máquinas de estados finitos (FSMs) na geração de texto.
Máquinas de Estados Finitos: Aplicando Consistência Estrutural
Máquinas de Estados Finitos (FSMs) levam o conceito de amostragem guiada adiante ao fornecer uma estrutura formal para impor restrições. Uma FSM é um modelo computacional com um número finito de estados e transições entre eles. Cada estado representa um ponto no processo de geração da saída, e as transições definem caminhos válidos com base no contexto atual. Ao integrar FSMs ao pipeline de geração, torna-se possível aplicar regras estruturais rígidas dinamicamente.
Em uma FSM, os estados são predefinidos, e cada um representa uma condição ou etapa específica no processo de geração. As transições entre estados ocorrem com base na entrada ou no token que está sendo gerado. Ao definir transições permissíveis, as FSMs guiam dinamicamente o modelo para produzir saídas que estejam em conformidade com uma determinada estrutura.
Por exemplo, uma FSM que gera JSON pode incluir estados para abrir um colchete, escrever uma chave, escrever um valor e fechar o colchete. A FSM garante que as transições ocorram em uma sequência lógica, como não fechar um colchete antes de escrever um valor. Isso garante a integridade estrutural da saída sem exigir pós-processamento.
FSMs são particularmente valiosas em aplicações como extração de dados estruturados, geração de código e formatação de respostas. Ao pré-computar as transições válidas para cada estado, FSMs podem ser implementadas de forma eficiente, minimizando a sobrecarga em tempo de execução. Essa eficiência, juntamente com a aplicação de restrições em tempo real, permite que FSMs gerem saídas que são tanto válidas quanto contextualmente precisas.
Exemplo: Gerando Números Válidos
Para ilustrar a geração guiada por FSM, vejamos um exemplo prático em que a tarefa é gerar um número válido. As regras especificam que o número deve conter apenas dígitos e, opcionalmente, um único ponto decimal.
Figura: FSM de Geração de Números Válidos
A FSM começa em State 0, onde os tokens válidos incluem qualquer dígito ou um ponto decimal. Se o sistema gerar um dígito, como 1, ele transita para State 1. A partir desse estado, dígitos adicionais são permitidos, ou a FSM pode transitar para State 2 se um ponto decimal for gerado. Em State 2, apenas dígitos são válidos, pois múltiplos pontos decimais violariam as regras. A FSM ajusta dinamicamente seu estado e os tokens válidos com base na sequência gerada, garantindo que a saída esteja em conformidade com o formato especificado.
Este exemplo destaca como FSMs aplicam restrições em tempo real. Ao definir os estados e transições para uma determinada tarefa, podemos criar sistemas robustos capazes de gerar saídas estruturadas sem exigir pós-processamento ou validação manual.
Combinando Amostragem Guiada com Bancos de Dados Vetoriais
A amostragem guiada atinge seu pleno potencial quando combinada com bancos de dados vetoriais. Esses bancos de dados especializados, como Milvus, são projetados para armazenar, gerenciar e recuperar embeddings vetoriais de alta dimensionalidade com eficiência. Juntas, a amostragem guiada e os bancos de dados vetoriais criam uma estrutura poderosa para lidar com dados não estruturados enquanto produzem saídas semanticamente relevantes e estruturalmente precisas. Vamos explorar como esses dois componentes trabalham juntos para aprimorar aplicações de IA.
Bancos de Dados Vetoriais como a Espinha Dorsal Semântica
Bancos de dados vetoriais servem como a camada fundamental em aplicações que envolvem buscas semânticas. Embeddings gerados por modelos de deep learning são armazenados em um espaço de alta dimensionalidade dentro do banco de dados vetorial, onde as distâncias entre pontos significam suas relações semânticas, como vimos anteriormente.
Quando um usuário faz uma consulta, ela é transformada em um embedding usando o mesmo modelo que criou os embeddings do banco de dados. O banco de dados então realiza uma busca por similaridade para encontrar os embeddings mais relevantes para a consulta. Esse processo de recuperação permite que os sistemas forneçam resultados contextualmente significativos, mesmo quando a consulta não usa palavras-chave exatas.
Adicionando Estrutura com Amostragem Guiada
Enquanto bancos de dados vetoriais recuperam informações semanticamente relevantes, a amostragem guiada garante que a saída esteja em conformidade com formatos ou restrições específicos. Após recuperar os embeddings relevantes, eles são passados como entrada para um grande modelo de linguagem (LLM). Sem amostragem guiada, o LLM poderia gerar respostas que se desviam da estrutura exigida, como JSON mal formatado ou XML inválido. A amostragem guiada aborda esse problema aplicando regras dinamicamente durante o processo de seleção de tokens.
Aplicações Reais Desta Integração
A combinação de bancos de dados vetoriais e amostragem guiada tem amplas aplicações em vários setores:
Assistentes de Programação: Quando um desenvolvedor consulta um assistente de programação alimentado por IA, o sistema recupera trechos de código relevantes ou embeddings de documentação. A amostragem guiada garante que o código gerado esteja em conformidade com a sintaxe e o formato corretos, reduzindo a necessidade de correção manual.
Sistemas de Extração de Informações: Esses sistemas analisam grandes conjuntos de dados, extraindo informações estruturadas como nomes, datas ou locais. Bancos de dados vetoriais recuperam segmentos relevantes de dados, enquanto a amostragem guiada formata a saída em esquemas predefinidos como JSON.
Chatbots para Domínios Especializados: Em domínios de saúde ou jurídicos, por exemplo, chatbots recuperam estudos de caso ou documentos semanticamente semelhantes. A amostragem guiada garante que as respostas geradas estejam em conformidade com padrões rigorosos de formatação jurídica ou médica.
Ferramentas para Implementar Amostragem Restrita: Outlines e BAML
Várias ferramentas simplificam a implementação de técnicas de amostragem restrita. A biblioteca Outlines, por exemplo, fornece um framework baseado em Python para definir restrições e gerar saídas estruturadas. Ela permite que desenvolvedores apliquem regras como esquemas JSON ou padrões regex diretamente durante a geração de texto. Da mesma forma, BAML oferece uma linguagem específica de domínio para escrever e testar aplicações baseadas em LLM, agilizando o processo de definição de restrições e validação de saídas.
Vamos dar uma olhada em como podemos usar a biblioteca Outlines para aplicar a amostragem restrita:
Comece instalando as bibliotecas necessárias:
pip install outlines transformers datasets
A biblioteca outlines nos permitirá gerar saídas estruturadas. A biblioteca transformers nos permitirá carregar modelos pré-treinados . A biblioteca datasets é uma dependência da biblioteca outlines.
Com o ambiente pronto, vamos começar a codificar.
import outlines
import transformers
# Load the model
model = outlines.models.transformers("gpt2-medium")
# For text generation
generator = outlines.generate.text(model)
# Example 1: Basic Continuation
prompt = "Is 1+1=2? "
result = generator(prompt, max_tokens=30)
print("Unguided output:", result)
# Example 2: Structured Generation with Regex
guided_output = outlines.generate.regex(model, r"([Yy]es|[Nn]o|[Nn]ever|[Aa]lways)")(
prompt, max_tokens=30
)
print("Guided output:", guided_output)
# Example 3: Numerical Regex Constraint
prompt = "In what year was Noam Chomsky born?n"
guided_output_year = outlines.generate.regex(model, r"19[0-9]{2}")(
prompt, max_tokens=30
)
print("Guided output (year):", guided_output_year)
No código acima, começamos importando as bibliotecas que instalamos e, em seguida, carregamos o modelo GPT-2 medium para gerar texto. Inicialmente, geramos uma resposta não guiada para o prompt Is 1+1=2?, demonstrando a geração básica de texto. Em seguida, usamos uma regex para orientar o modelo a produzir apenas respostas como Yes, No, Never ou Always, garantindo que as saídas sigam formatos de resposta específicos. Por fim, implementamos uma restrição regex r"19[0-9]{2}" para extrair um ano de quatro dígitos, visando o ano de nascimento de Noam Chomsky. Aqui está um exemplo de saída:
Figura: Saída da amostragem restrita usando a biblioteca Outlines
Isso demonstra a capacidade do modelo tanto para geração de texto livre quanto estruturada, adaptada a tarefas específicas de extração de informações.
Conclusão
Stefan fez um ótimo trabalho ao nos mostrar como a amostragem restrita e os FSMs representam avanços significativos para tornar grandes modelos de linguagem mais confiáveis em aplicações do mundo real. Ao impor consistência estrutural e aproveitar ferramentas como Outlines e bancos de dados vetoriais, agora podemos construir sistemas que combinam flexibilidade com precisão. À medida que o campo evolui, essas técnicas desempenharão um papel fundamental na redução da lacuna entre o processamento de dados não estruturados e a geração de saídas estruturadas, desbloqueando novas possibilidades para aplicações impulsionadas por IA.
Para mais informações, assista à palestra de Stefan no YouTube.
Continue lendo

We spent 8 years making vector databases faster. Then we stopped.
Rarely queried embeddings still need to stay searchable. See how Vector Lakebase enables on-demand vector search without always-on compute costs.

The Real Bottlenecks in Autonomous Driving — And How AI Infrastructure Can Solve Them
Autonomous driving faces a data bottleneck. Learn how AI-native vector databases like Zilliz solve scale, cost, and insight challenges across AV pipelines.

Demystifying the Milvus Sizing Tool
Explore how to use the Sizing Tool to select the optimal configuration for your Milvus deployment.


