Aprendizagem pessoal com IA
e orientação prática

Contornos: gerar saída de texto estruturado por meio de expressões regulares, JSON ou modelos Pydantic

Introdução geral

Outlines é uma biblioteca de código aberto desenvolvida pela dottxt-ai para aprimorar a aplicação de modelos de linguagem grande (LLM) por meio da geração de texto estruturado. A biblioteca é compatível com várias integrações de modelos, incluindo OpenAI, transformadores, llama.cpp, etc. Ela fornece primitivas simples, porém poderosas, e é baseada no mecanismo de modelo Jinja. A Outlines permite que o usuário execute uma geração rápida por meio de expressões regulares, padrões JSON ou modelos Pydantic, e é compatível com uma variedade de algoritmos de amostragem, como algoritmos gulosos, amostragem polinomial e pesquisa de pacotes, amostragem polinomial e pesquisa de pacotes. O projeto também oferece recursos como geração de cache, inferência em lote etc., com o objetivo de aumentar a velocidade e o desempenho da inferência de modelos. O Outlines tem sido usado em chamadas de função pelas principais estruturas de inferência (por exemplo, VLLM, TGI).

Esboços: geração de saída de texto estruturado por meio de expressões regulares, JSON ou modelos Pydantic-1


 

Lista de funções

  • Integração de vários modelos: suporta OpenAI, transformadores, llama.cpp e outros modelos.
  • Dicas simples e eficientes: baseadas no mecanismo de modelo Jinja.
  • Geração de estrutura de expressão regular: gere rapidamente texto compatível com expressões regulares
  • Geração de JSON: gere texto com base em um esquema JSON ou em modelos Pydantic
  • Geração de estrutura de sintaxe: suporte para loops, condicionais e geração de funções Python personalizadas
  • Gerar cache: resultados da geração de cache para aumentar a eficiência
  • Raciocínio em lote: suporte ao processamento em lote para aumentar a velocidade do raciocínio
  • Algoritmos de amostragem múltipla: suporta algoritmos de amostragem gulosos, polinomiais e de busca de feixe.
  • Suporte ao Docker: forneça imagens oficiais do Docker para facilitar a implantação.

 

Usando a Ajuda

Processo de instalação

  1. Certifique-se de que o ambiente Python esteja instalado.
  2. Instale o Outlines usando o pip:
   pip install outlines
  1. Se você precisar usar a funcionalidade principal da versão Rust, poderá instalar o outlines-core:
   pip install outlines-core

Diretrizes para uso

Uso básico

  1. Importar a biblioteca Outlines:
   importar contornos
  1. Selecione e carregue o modelo:
   model = outlines.models.transformers("openai/gpt-3.5-turbo")
  1. Criar prompts e gerar texto:
   prompt = "Gere uma breve introdução à tecnologia de IA".
texto_gerado = model.generate(prompt)
print(generated_text)

Recursos avançados

  1. Gerar texto estruturado usando expressões regulares:
   importar contornos
generator = outlines.generate.regex("^[A-Z][a-z]+$")
result = generator("Gerar uma palavra que corresponda à expressão regular")
print(result)
  1. Gerar texto usando o esquema JSON:
   importar contornos
from pydantic import BaseModel
class Person(BaseModel): name: str
nome: str
idade: int
generator = outlines.generate.json(Person)
result = generator({"name": "Alice", "age": 30})
result = generator({"name": "Alice", "age": 30})
  1. São usados vários algoritmos de amostragem:
   Importar contornos
generator = outlines.generate.choice(model, ["option1", "option2", "option3"])
result = generator("Please select an option:")
print(result)
  1. Implante uma imagem do Docker:
   docker pull outlinesdev/outlines
docker run -p 8000:8000 outlinesdev/outlines

problemas comuns

  • Como posso aumentar a velocidade de geração? A velocidade de geração pode ser significativamente aprimorada com o uso de inferência em lote e geração de funções de cache.
  • Como integrar funções personalizadas? Funções Python personalizadas podem ser usadas para lidar com lógicas complexas durante a geração.

 

Problemas apresentados por resultados não estruturados de modelos grandes

problemas

Os modelos de linguagem grande (LLMs) têm recursos avançados de geração de texto, mas não têm desempenho suficientemente confiável na geração de dados estruturados. Isso representa um problema sério para aplicativos de IA centrados em agentes.

Questões centrais

  • inconsistência de saídaQuando se extrai informações de voo de e-mails, o ideal seria produzir objetos JSON consistentes, mas o LLM geralmente falha, levando a problemas como "erros de decodificação de JSON".
  • Falta de confiabilidadeEssa imprevisibilidade dificulta a criação de sistemas modulares complexos com base no LLM.

afetar (geralmente de forma adversa)

Sem uma saída estruturada confiável, os desenvolvedores precisam extrair informações por meio de um pós-processamento tedioso (por exemplo, expressões regulares), o que leva a um desenvolvimento ineficiente e sujeito a erros.

Benefícios da saída estruturada

Estrutura geral dos dados

Mesmo os dados aparentemente não estruturados (por exemplo, conjuntos de dados GSM) geralmente têm uma estrutura inerente a ser explorada.

Formato de saída garantido

Ao definir estruturas específicas (como JSON ou expressões regulares), você pode garantir a validade da saída e evitar o incômodo pós-processamento.

Melhorar o desempenho e a eficiência

  • Melhorando a eficiência do JSONEficiência do JSON: a eficiência do JSON aumentou de 17,7% para 99,9% usando a geração estruturada.
  • Redução da necessidade de exemplosNo benchmarking GSM8K, o desempenho da geração estruturada de uma só vez é quase comparável ao da geração não estruturada de oito vezes.
  • Melhorando o desempenho do modelo abertoNo benchmark de chamada de função, o desempenho melhora de 86% para 96,5%, superando até mesmo o GPT-4.

Saídas estruturadas e não estruturadas

Para entender melhor as vantagens da saída estruturada, podemos comparar as diferenças entre a saída estruturada e a não estruturada usando o exemplo a seguir.

Suponha que precisemos extrair informações de voo de um e-mail:

saída não estruturada

Quando a saída gerada por um modelo grande não é estritamente formatada, o texto a seguir pode ser obtido:

O voo para Paris é na próxima terça-feira, provavelmente às 10h, e o avião é da Air France.

Essa saída, embora contenha as informações de que precisamos (destino, data, hora, companhia aérea etc.), não tem uma estrutura clara. Para extrair essas informações, o desenvolvedor precisa analisar cada campo usando expressões regulares ou outros métodos de processamento de texto, o que é tedioso e propenso a erros. Por exemplo, é possível que o modelo forneça uma saída formatada de forma diferente para entradas diferentes, levando a erros de processamento do sistema ou "erros de decodificação de JSON".

Saída estruturada

Se a geração estruturada for usada, o modelo retornará dados que estejam em conformidade com um formato predefinido, por exemplo:

{
  "destination" (destino): "Paris".
  "departure_date": "2024-11-25",
  "time": "10:00",
  "airline": "Air France"
}

Nesse caso, a saída é uniforme e padronizada. O desenvolvedor não precisa mais processar ou analisar as informações adicionalmente porque todos os campos-chave já são retornados no formato esperado. Isso não apenas economiza tempo de desenvolvimento, mas também reduz bastante a probabilidade de erros.

Por meio dessa comparação, podemos ver claramente que a saída estruturada não apenas garante a consistência e a confiabilidade dos dados, mas também melhora significativamente a eficiência do processamento, especialmente quando uma grande quantidade de informações precisa ser extraída e processada de um modelo grande.

 

O uso de Outlines causa problemas de desempenho em modelos grandes?

Como funciona o Outlines?

racionalidade

  • Processamento de logitDepois que o modelo gera logits, o Outlines verifica cada próximo token possível e bloqueia aqueles que violam a estrutura definida.
  • Otimização da eficiênciaCusto adicional extremamente baixo por meio de mascaramento eficiente.

exemplo típico

"Se a geração de token destruiria a estrutura, ele é imediatamente bloqueado para garantir que o processo de geração siga estritamente a estrutura predefinida."

A saída estruturada torna a saída mais lenta?

Isso não acontece. Pelo contrário, a geração estruturada geralmente acelera o processo de geração:

  • Redução de tokens inúteisEvite gerar nomes de campos ou colchetes redundantes definindo a estrutura com antecedência.
  • Duração reduzida da geraçãoSaída estruturada: as saídas estruturadas normalmente têm menos tokens, são mais rápidas e mais claras.

Comparação de outlines com outras bibliotecas de geração estruturada

  • Comparar com OrientaçãoO Outlines tem uma sobrecarga quase nula na fase de inferência, enquanto o Guidance pode ficar significativamente mais lento ao gerar um grande número de tokens.
  • Comparação com LMQLOs principais pontos fortes do Outlines são seu design leve e sua eficiência.

exemplo de código

A seguir, um exemplo de uso de Outlines para gerar dados de eventos estruturados:

from datetime import datetime
from pydantic import BaseModel, Field
from outlines import generate, models

# Carregar modelo
model = models.mlxlm("mlx-community/Hermes-3-Llama-3.1-8B-8bit")

O # define a estrutura do evento usando Pydantic
class Event(BaseModel).
    título: str = Field(description="título do evento")
    local: str
    start: datetime = Field(
        default=None, description="data do evento, se disponível no formato iso")
    )

# Obter a hora atual
now = datetime.now().strftime("%A %d %B %Y e é %H:%M")

# Definir prompt
prompt = f"""
A data e a hora de hoje são {now}
Dada uma mensagem de usuário, extraia informações do evento, como data e hora em formato iso, local e título.
Se a data fornecida for relativa, pense passo a passo para encontrar a data correta.
Aqui está a mensagem.
"""

Exemplo de mensagem do #
message = """Hello Kitty, minha avó estará aqui, acho melhor adiar nosso encontro para revisar as aulas de matemática para a próxima sexta-feira, às 14h, no mesmo local, 3 avenue.
Acho melhor adiar nosso compromisso de revisão das aulas de matemática para a próxima sexta-feira, às 14h, no mesmo local, 3 avenue des tanneurs, acho que uma hora será suficiente
até mais 😘😘😘😘😘 """

# Criar o gerador
generator = generate.json(model, Event)

# Extraia a mensagem do evento
event = generator(prompt + message)

# Emitir o resultado
print(f "Today: {now}")
print(event.json())

As informações do evento gerado são as seguintes:

{
  "título": "Revisão de Matemática".
  "localização": "3 avenue des tanneurs".
  "start": "2024-11-22T14:00:00Z"
}

Conclusões e perspectivas

A geração estruturada não é mais apenas um recurso de nicho, mas o futuro dos aplicativos de modelos grandes:

  • Maior confiabilidade e eficiênciaO desempenho do LLM é significativamente aprimorado pela geração estruturada.
  • O potencial do código-fonte abertoO sucesso do Outlines demonstra o potencial dos modelos de código aberto para competir com os modelos proprietários.

No futuro, espera-se que o Outlines se torne um componente essencial na caixa de ferramentas do desenvolvedor, à medida que a geração estruturada se tornar mais comum.

Aprendizagem fácil com IA

O guia do leigo para começar a usar a IA

Ajuda você a aprender a utilizar as ferramentas de IA com baixo custo e a partir de uma base zero.A IA, assim como o software de escritório, é uma habilidade essencial para todos. Dominar a IA lhe dará uma vantagem em sua busca de emprego e metade do esforço em seu trabalho e estudos futuros.

Ver detalhes>
Não pode ser reproduzido sem permissão:Chefe do Círculo de Compartilhamento de IA " Contornos: gerar saída de texto estruturado por meio de expressões regulares, JSON ou modelos Pydantic

Chefe do Círculo de Compartilhamento de IA

O Chief AI Sharing Circle se concentra no aprendizado de IA, fornecendo conteúdo abrangente de aprendizado de IA, ferramentas de IA e orientação prática. Nosso objetivo é ajudar os usuários a dominar a tecnologia de IA e explorar juntos o potencial ilimitado da IA por meio de conteúdo de alta qualidade e compartilhamento de experiências práticas. Seja você um iniciante em IA ou um especialista sênior, este é o lugar ideal para adquirir conhecimento, aprimorar suas habilidades e realizar inovações.

Entre em contato conosco
pt_BRPortuguês do Brasil