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).
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
- Certifique-se de que o ambiente Python esteja instalado.
- Instale o Outlines usando o pip:
pip install outlines
- 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
- Importar a biblioteca Outlines:
import outlines
- Selecione e carregue o modelo:
model = outlines.models.transformers("openai/gpt-3.5-turbo")
- Criar prompts e gerar texto:
prompt = "生成一个关于AI技术的简短介绍。"
generated_text = model.generate(prompt)
print(generated_text)
Recursos avançados
- Gerar texto estruturado usando expressões regulares:
import outlines
generator = outlines.generate.regex("^[A-Z][a-z]+$")
result = generator("生成一个符合正则表达式的单词")
print(result)
- Gerar texto usando o esquema JSON:
import outlines
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
generator = outlines.generate.json(Person)
result = generator({"name": "Alice", "age": 30})
print(result)
- São usados vários algoritmos de amostragem:
import outlines
generator = outlines.generate.choice(model, ["选项1", "选项2", "选项3"])
result = generator("请选择一个选项:")
print(result)
- 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:
飞往巴黎的航班在下周二,可能是早上10点,飞机是法国航空。
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": "巴黎",
"departure_date": "2024-11-25",
"time": "10:00",
"airline": "法国航空"
}
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
# 加载模型
model = models.mlxlm("mlx-community/Hermes-3-Llama-3.1-8B-8bit")
# 使用 Pydantic 定义事件结构
class Event(BaseModel):
title: str = Field(description="title of the event")
location: str
start: datetime = Field(
default=None, description="date of the event if available in iso format"
)
# 获取当前时间
now = datetime.now().strftime("%A %d %B %Y and it's %H:%M")
# 定义提示
prompt = f"""
Today's date and time are {now}
Given a user message, extract information of the event like date and time in iso format, location and title.
If the given date is relative, think step by step to find the right date.
Here is the message:
"""
# 示例消息
message = """Hello Kitty, my grandmother will be here , I think it's better to postpone our
appointment to review math lessons to next Friday at 2pm at the same place, 3 avenue des tanneurs, I think that one hour will be enough
see you 😘 """
# 创建生成器
generator = generate.json(model, Event)
# 提取事件信息
event = generator(prompt + message)
# 输出结果
print(f"Today: {now}")
print(event.json())
As informações do evento gerado são as seguintes:
{
"title": "Math Review",
"location": "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.