Esquemas: genera salidas de texto estructurado mediante expresiones regulares, JSON o modelos Pydantic.

Introducción general

Outlines es una biblioteca de código abierto desarrollada por dottxt-ai para mejorar la aplicación de los modelos de lenguaje extensos (LLM) mediante la generación de texto estructurado. La librería soporta múltiples integraciones de modelos incluyendo OpenAI, transformadores, llama.cpp, etc. Proporciona primitivas de prompt simples pero potentes y está basada en el motor de plantillas Jinja.Outlines permite al usuario realizar una generación rápida a través de expresiones regulares, patrones JSON, o modelos Pydantic, y soporta una variedad de algoritmos de muestreo tales como algoritmos greedy muestreo polinómico y búsqueda por paquetes. El proyecto también ofrece funciones como la generación de caché, la inferencia por lotes, etc., con el objetivo de mejorar la velocidad y el rendimiento de la inferencia de modelos.

Outlines:通过正则表达式、JSON或Pydantic模型生成结构化文本输出

 

Lista de funciones

  • Integración multimodelo: compatible con OpenAI, transformadores, llama.cpp y otros modelos.
  • Sugerencias sencillas y potentes: basadas en el motor de plantillas Jinja.
  • Generación de estructuras de expresiones regulares: genere rápidamente texto compatible con expresiones regulares
  • Generación JSON: Genera texto basado en esquemas JSON o modelos Pydantic.
  • Generación de estructuras sintácticas: soporte para bucles, condicionales y generación de funciones Python personalizadas.
  • Generar caché: resultados de la generación de caché para mejorar la eficacia
  • Razonamiento por lotes: admite el procesamiento por lotes para mejorar la velocidad de razonamiento.
  • Algoritmos de muestreo múltiple: admite algoritmos de muestreo codiciosos, polinómicos y de búsqueda de haces.
  • Compatibilidad con Docker: proporcione imágenes Docker oficiales para facilitar la implantación.

 

Utilizar la ayuda

Proceso de instalación

  1. Asegúrese de que el entorno Python está instalado.
  2. Instale Outlines utilizando pip:
   pip install outlines
  1. Si necesitas utilizar la funcionalidad básica de la versión Rust, puedes instalar outlines-core:
   pip install outlines-core

Normas de uso

Uso básico

  1. Importe la biblioteca Esquemas:
   import outlines
  1. Selecciona y carga el modelo:
   model = outlines.models.transformers("openai/gpt-3.5-turbo")
  1. Cree avisos y genere texto:
   prompt = "生成一个关于AI技术的简短介绍。"
generated_text = model.generate(prompt)
print(generated_text)

Funciones avanzadas

  1. Generar texto estructurado utilizando expresiones regulares:
   import outlines
generator = outlines.generate.regex("^[A-Z][a-z]+$")
result = generator("生成一个符合正则表达式的单词")
print(result)
  1. Generar texto utilizando el 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)
  1. Se utilizan múltiples algoritmos de muestreo:
   import outlines
generator = outlines.generate.choice(model, ["选项1", "选项2", "选项3"])
result = generator("请选择一个选项:")
print(result)
  1. Despliegue una imagen Docker:
   docker pull outlinesdev/outlines
docker run -p 8000:8000 outlinesdev/outlines

problemas comunes

  • ¿Cómo puedo aumentar la velocidad de generación? La velocidad de generación puede mejorarse considerablemente utilizando la inferencia por lotes y generando funciones de caché.
  • ¿Cómo integrar funciones personalizadas? Se pueden utilizar funciones personalizadas de Python para manejar la lógica compleja durante la generación.

 

Problemas planteados por los resultados no estructurados de grandes modelos

cuestiones

Los grandes modelos lingüísticos (LLM) tienen grandes capacidades de generación de texto, pero su rendimiento no es lo suficientemente fiable a la hora de generar datos estructurados. Esto plantea un grave problema para las aplicaciones de IA centradas en agentes.

Cuestiones fundamentales

  • incoherencia en la salidaEl LLM: Cuando se extrae información de vuelo de correos electrónicos, lo ideal sería obtener objetos JSON consistentes, pero el LLM a menudo falla, dando lugar a problemas como "errores de decodificación JSON".
  • Falta de fiabilidadEsta imprevisibilidad dificulta la construcción de sistemas modulares complejos basados en LLM.

afectar (normalmente de forma negativa)

Sin una salida estructurada fiable, los desarrolladores tienen que extraer la información mediante tediosos procesos posteriores (por ejemplo, expresiones regulares), lo que da lugar a un desarrollo ineficaz y propenso a errores.

Ventajas de la salida estructurada

Estructura general de los datos

Incluso los datos aparentemente no estructurados (por ejemplo, los conjuntos de datos GSM) tienen a menudo una estructura inherente que explotar.

Formato de salida garantizado

Al definir estructuras específicas (como JSON o expresiones regulares), puede garantizar la validez de la salida y evitar el engorroso postprocesamiento.

Mejorar el rendimiento y la eficacia

  • Mejorar la eficiencia de JSON: La eficiencia de JSON aumentó de 17,7% a 99,9% utilizando la generación estructurada.
  • Menor necesidad de ejemplosEn la prueba comparativa GSM8K, el rendimiento de la generación estructurada de una sola vez es casi comparable al de la generación no estructurada de ocho veces.
  • Mejorar el rendimiento de los modelos abiertos: En la prueba comparativa de llamadas a funciones, el rendimiento mejora de 86% a 96,5%, superando incluso a GPT-4.

Resultados estructurados y no estructurados

Para comprender mejor las ventajas de la salida estructurada, podemos comparar las diferencias entre la salida estructurada y la no estructurada mediante el siguiente ejemplo.

Supongamos que necesitamos extraer información de vuelo de un correo electrónico:

salida no estructurada

Cuando la salida generada por un modelo grande no tiene un formato estricto, puede obtenerse el siguiente texto:

飞往巴黎的航班在下周二,可能是早上10点,飞机是法国航空。

Esta salida, aunque contiene la información que necesitamos (destino, fecha, hora, aerolínea, etc.), no tiene una estructura clara. Para extraer esta información, el desarrollador debe analizar cada campo mediante expresiones regulares u otros métodos de tratamiento de texto, lo que resulta tedioso y propenso a errores. Por ejemplo, es posible que el modelo ofrezca una salida con un formato diferente para distintas entradas, lo que provoca errores de procesamiento del sistema o "errores de descodificación JSON".

Salida estructurada

Si se utiliza la generación estructurada, el modelo devolverá datos que se ajusten a un formato predefinido, por ejemplo:

{
  "destination": "巴黎",
  "departure_date": "2024-11-25",
  "time": "10:00",
  "airline": "法国航空"
}

En este caso, la salida es uniforme y normalizada. El desarrollador ya no tiene que procesar o analizar la información porque todos los campos clave se devuelven en el formato esperado. Esto no solo ahorra tiempo de desarrollo, sino que también reduce enormemente la probabilidad de errores.

A través de esta comparación, podemos ver claramente que la salida estructurada no sólo garantiza la coherencia y fiabilidad de los datos, sino que también mejora significativamente la eficiencia del procesamiento, especialmente cuando es necesario extraer y procesar una gran cantidad de información de un modelo de gran tamaño.

 

¿El uso de esquemas causa problemas de rendimiento en modelos de gran tamaño?

¿Cómo funcionan los esquemas?

razonamiento

  • Procesamiento Logit: Después de que el modelo genere logits, Outlines comprueba cada posible token siguiente y bloquea los que violan la estructura definida.
  • Optimización de la eficiencia: Gastos generales adicionales extremadamente bajos gracias a un enmascaramiento eficaz.

ejemplo típico

"Si el generado ficha destruiría la estructura, se bloquea inmediatamente para garantizar que el proceso de generación sigue estrictamente la estructura predefinida".

¿La salida estructurada ralentiza la salida?

No lo hará. Al contrario, la generación estructurada suele acelerar el proceso de generación:

  • Reducir las fichas inútiles: Evite generar nombres de campo redundantes o corchetes definiendo la estructura de antemano.
  • Reducción de la duración de la generaciónLos resultados estructurados suelen tener menos tokens, son más rápidos y más claros.

Comparación de los esquemas con otras bibliotecas de generación estructurada

  • Comparar con OrientaciónEl sistema Outlines tiene una sobrecarga casi nula en la fase de inferencia, mientras que Guidance puede ralentizarse significativamente cuando se genera un gran número de tokens.
  • Comparación con LMQL: Los principales puntos fuertes de Outlines son su diseño ligero y su eficiencia.

ejemplo de código

A continuación se muestra un ejemplo de uso de Esquemas para generar datos de eventos estructurados:

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())

La información de eventos generada es la siguiente:

{
  "title": "Math Review",
  "location": "3 avenue des tanneurs",
  "start": "2024-11-22T14:00:00Z"
}

Conclusiones y perspectivas

La generación estructurada ya no es sólo una función de nicho, sino el futuro de las aplicaciones de grandes modelos:

  • Mayor fiabilidad y eficaciaEl rendimiento de LLM mejora significativamente con la generación estructurada.
  • El potencial del código abierto: El éxito de Outlines demuestra el potencial de los modelos de código abierto para competir con los modelos propietarios.

En el futuro, se espera que Outlines se convierta en un componente clave de la caja de herramientas del desarrollador a medida que la generación estructurada se haga más común.

© declaración de copyright

Artículos relacionados

Sin comentarios

Debe iniciar sesión para participar en los comentarios.
Acceder ahora
ninguno
Sin comentarios...