2 puntos por GN⁺ 2024-12-09 | 1 comentarios | Compartir por WhatsApp

Salida estructurada

6 de diciembre de 2024

Ollama ahora admite salidas estructuradas que permiten restringir la salida del modelo a un formato específico definido con un esquema JSON. Las bibliotecas de Ollama para Python y JavaScript se actualizaron para admitir salidas estructuradas.

  • Casos de uso de las salidas estructuradas:
    • Parseo de datos desde documentos
    • Extracción de datos desde imágenes
    • Estructuración de todas las respuestas de modelos de lenguaje
    • Mayor confiabilidad y consistencia que el modo JSON

Primeros pasos

  • Descargar la versión más reciente de Ollama
  • Actualizar la biblioteca de Ollama para Python o JavaScript a la versión más reciente
cURL
  • Se puede pasar una salida estructurada al modelo usando el parámetro format
Salida
  • La respuesta se devuelve en el formato definido por el esquema JSON de la solicitud
Python
  • Usar la biblioteca de Ollama para Python para pasar el esquema como un objeto JSON en el parámetro format
  • Se recomienda usar Pydantic para serializar el esquema
Salida
  • name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
  • Usar la biblioteca de Ollama para JavaScript para pasar el esquema como un objeto JSON en el parámetro format
  • Se recomienda usar Zod para serializar el esquema
Salida
  • { name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }

Ejemplos

Extracción de datos

  • Definir un esquema que represente la información para extraer datos estructurados desde texto
  • El modelo extrae la información y devuelve los datos en JSON con el esquema definido
Salida de ejemplo
  • pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]

Descripción de imágenes

  • Las salidas estructuradas pueden usarse con modelos de visión
  • Usar llama3.2-vision para describir una imagen y devolver una salida estructurada
Salida de ejemplo
  • summary='A palm tree on a sandy beach with blue water and sky.'
  • objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]
  • scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
Compatibilidad con OpenAI
  • Compatible con salidas estructuradas usando el cliente de OpenAI

Consejos

  • Para usar salidas estructuradas de forma confiable:
    • Usar Pydantic (Python) o Zod (JavaScript) para definir el esquema de respuesta
    • Agregar "devolver en JSON" al prompt para que el modelo entienda la solicitud
    • Establecer la temperatura en 0 para una salida más determinista

Próximos pasos

  • Exposición de logits para generación controlada
  • Mejora del rendimiento y la precisión de las salidas estructuradas
  • Aceleración por GPU para muestreo
  • Soporte para formatos adicionales más allá del esquema JSON

1 comentarios

 
GN⁺ 2024-12-09
Comentarios de Hacker News
  • Se pueden establecer restricciones de salida más potentes mediante la función gbnf de llama.cpp

  • Es útil al estructurar prompts regulares y convertirlos en datos csv, porque permite eliminar texto innecesario

  • Usando gemma2:2b, al ingresar texto se puede obtener una salida estructurada en formato JSON

    • Ejemplo de entrada: "You have spent 190 at Fresh Mart. Current balance: 5098"
    • Ejemplo de salida: {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • Hay una opinión que se pregunta cómo afectan las restricciones a la calidad de salida del LLM

    • En algunos casos, parsearlo como Markdown o texto plano puede ofrecer mejor calidad
  • Hay una pregunta sobre si se puede usar con los modelos compatibles

    • En hardware personal, solo se pueden ejecutar de forma estable modelos de 1b-3b
  • Hay curiosidad sobre si llama.cpp y ollama aprovechan la función de salida estructurada de llama o si está implementada de otra manera

    • En la página de Llama de Meta se menciona que el modelo admite salidas estructuradas de forma nativa
  • Hay una pregunta sobre qué valor agregado ofrece en comparación con outlines

  • La razón para seguir usando oobabooga es que, con soporte para exlv2, ofrece una inferencia más eficiente en dual 3090s

  • Sería mejor que el ejemplo con curl apareciera primero

    • Le gusta Pydantic, pero programar el esquema directamente facilita más mover el prototipo a Go
  • Hay una pregunta sobre la mejor manera de proporcionar entradas estructuradas a un LLM

    • Ejemplo: ingresar 100 oraciones y clasificar cada una de una forma distinta
    • Obtener datos estructurados es fácil, pero usar números de línea como prefijo se siente incómodo