Transformers documentation
Ingeniería de prompts
Ingeniería de prompts
El *prompt engineering* o *prompting* utiliza el lenguaje natural para mejorar el rendimiento de los modelos de lenguaje de gran escala (LLM) en una variedad de tareas. Un *prompt* puede guiar al modelo hacia la generación de una salida deseada. En muchos casos, ni siquiera se necesita un modelo ajustado fino para una tarea. Solo se necesita un buen *prompt*.
Prueba a pedirle a un LLM que clasifique algún texto. Al crear un prompt, es importante proporcionar instrucciones muy específicas sobre la tarea y cómo debe ser el resultado.
from transformers import pipeline
import torch
pipeline = pipeline(task="text-generation", model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Classify the text into neutral, negative or positive.
Text: This movie is definitely one of my favorite movies of its kind. The interaction between respectable and morally strong characters is an ode to chivalry and the honor code amongst thieves and policemen.
Sentiment:
"""
outputs = pipeline(prompt, max_new_tokens=10)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: Classify the text into neutral, negative or positive.
Text: This movie is definitely one of my favorite movies of its kind. The interaction between respectable and morally strong characters is an ode to chivalry and the honor code amongst thieves and policemen.
Sentiment:
PositiveEl desafío radica en diseñar prompts que produzcan los resultados que esperas, ya que el lenguaje es increíblemente matizado y expresivo.
Esta guía cubre las mejores prácticas, técnicas y ejemplos de ingeniería de prompts para resolver tareas de lenguaje y razonamiento.
Buenas prácticas
Intente elegir los modelos más recientes para obtener el mejor rendimiento. Tenga en cuenta que los LLM pueden tener dos variantes, base y instruction-tuned (o chat).
Los modelos base son excelentes para completar texto a partir de un prompt inicial, pero no son tan buenos para seguir instrucciones. Los modelos ajustados con instrucciones son versiones específicas de los modelos base entrenadas con datos de instrucciones o conversacionales. Esto hace que los modelos ajustados con instrucciones sean más adecuados para el uso de prompts.
Los LLM modernos suelen ser modelos solo de decodificador, pero existen algunos LLM de codificador-decodificador, como Flan-T5 o BART, que pueden utilizarse para prompting. Cargue estos modelos directamente con la clase AutoModelForSeq2SeqLM (en lugar de usar Pipeline) y genere las salidas desde el propio modelo.
Comienza con un prompt corto y simple, y itera sobre él para obtener mejores resultados.
Coloque las instrucciones al principio o al final de un prompt. En el caso de prompts más largos, los modelos pueden aplicar optimizaciones para evitar que la atención escale de forma cuadrática, lo que otorga mayor énfasis al principio y al final del prompt.
Separa claramente las instrucciones del texto de interés.
Sé específico y descriptivo sobre la tarea y la salida deseada, incluyendo, por ejemplo, su formato, longitud, estilo e idioma. Evita descripciones e instrucciones ambiguas.
Las instrucciones deben centrarse en «qué hacer» en lugar de «qué no hacer».
Guía al modelo para que genere la salida correcta escribiendo la primera palabra o incluso la primera oración.
Prueba otras técnicas como few-shot y chain-of-thought para mejorar los resultados.
Pruebe sus prompts con diferentes modelos para evaluar su robustez.
Versiona y realiza un seguimiento del rendimiento de tus prompts.
Técnicas
Crear un buen prompt por sí solo, también conocido como zero-shot prompting, puede no ser suficiente para obtener los resultados que deseas. Es posible que necesites probar varias técnicas de prompting para lograr el mejor rendimiento.
Esta sección cubre algunas técnicas de prompting.
Prompting de pocos ejemplos
El few-shot prompting mejora la precisión y el rendimiento al incluir ejemplos específicos de lo que un modelo debe generar a partir de una entrada. Los ejemplos explícitos le dan al modelo una mejor comprensión de la tarea y del formato de salida que se busca. Pruebe experimentar con diferentes cantidades de ejemplos (2, 4, 8, etc.) para ver cómo afecta al rendimiento. El siguiente ejemplo proporciona al modelo 1 ejemplo (1-shot) del formato de salida (una fecha en formato MM/DD/YYYY) que debe devolver.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Text: The first human went into space and orbited the Earth on April 12, 1961.
Date: 04/12/1961
Text: The first-ever televised presidential debate in the United States took place on September 28, 1960, between presidential candidates John F. Kennedy and Richard Nixon.
Date:"""
outputs = pipeline(prompt, max_new_tokens=12, do_sample=True, top_k=10)
for output in outputs:
print(f"Result: {output['generated_text']}")
# Result: Text: The first human went into space and orbited the Earth on April 12, 1961.
# Date: 04/12/1961
# Text: The first-ever televised presidential debate in the United States took place on September 28, 1960, between presidential candidates John F. Kennedy and Richard Nixon.
# Date: 09/28/1960La desventaja del few-shot prompting es que se deben crear prompts más largos, lo que aumenta la computación y la latencia. Además, existe un límite en la longitud de los prompts. Por último, un modelo puede aprender patrones no deseados a partir de tus ejemplos, y es posible que no funcione bien en tareas de razonamiento complejo.
Para mejorar el few-shot prompting en LLMs modernos ajustados por instrucciones, utiliza la plantilla de chat específica del modelo. Estos modelos se entrenan con conjuntos de datos que contienen conversaciones por turnos entre un “usuario” y un “asistente”. Estructurar el prompt de forma coherente con este formato puede mejorar el rendimiento.
Estructure su prompt como una conversación por turnos y use el método apply_chat_template para tokenizar y formatearlo.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
messages = [
{"role": "user", "content": "Text: The first human went into space and orbited the Earth on April 12, 1961."},
{"role": "assistant", "content": "Date: 04/12/1961"},
{"role": "user", "content": "Text: The first-ever televised presidential debate in the United States took place on September 28, 1960, between presidential candidates John F. Kennedy and Richard Nixon."}
]
prompt = pipeline.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipeline(prompt, max_new_tokens=12, do_sample=True, top_k=10)
for output in outputs:
print(f"Result: {output['generated_text']}")Mientras que el enfoque básico de few-shot prompting incrustaba los ejemplos en una única cadena de texto, el formato de plantilla de chat ofrece los siguientes beneficios.
- El modelo puede tener una comprensión potencialmente mejorada, ya que puede reconocer mejor el patrón y los roles esperados de la entrada del usuario y la salida del asistente.
- El modelo puede generar el formato de salida deseado de manera más consistente, ya que durante el entrenamiento está estructurado de forma similar a su entrada.
Consulta siempre la documentación de un modelo específico ajustado con instrucciones para conocer el formato de su plantilla de chat y poder estructurar tus prompts de pocos ejemplos en consecuencia.
Cadena de pensamiento
Chain-of-thought (CoT) es eficaz para generar salidas más coherentes y bien razonadas al proporcionar una serie de prompts que ayudan a un modelo a “pensar” de manera más exhaustiva sobre un tema.
El siguiente ejemplo proporciona al modelo varios prompts para trabajar a través de pasos intermedios de razonamiento.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Let's go through this step-by-step:
1. You start with 15 muffins.
2. You eat 2 muffins, leaving you with 13 muffins.
3. You give 5 muffins to your neighbor, leaving you with 8 muffins.
4. Your partner buys 6 more muffins, bringing the total number of muffins to 14.
5. Your partner eats 2 muffins, leaving you with 12 muffins.
If you eat 6 muffins, how many are left?"""
outputs = pipeline(prompt, max_new_tokens=20, do_sample=True, top_k=10)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: Let's go through this step-by-step:
1. You start with 15 muffins.
2. You eat 2 muffins, leaving you with 13 muffins.
3. You give 5 muffins to your neighbor, leaving you with 8 muffins.
4. Your partner buys 6 more muffins, bringing the total number of muffins to 14.
5. Your partner eats 2 muffins, leaving you with 12 muffins.
If you eat 6 muffins, how many are left?
Answer: 6Al igual que el few-shot prompting, la desventaja de CoT es que requiere más esfuerzo para diseñar una serie de prompts que ayuden al modelo a razonar a través de una tarea compleja, y el aumento de la longitud del prompt incrementa la latencia.
Ajuste fino
Aunque el prompting es una forma poderosa de trabajar con LLM, hay escenarios en los que un modelo afinado o incluso el proceso de afinación de un modelo funciona mejor.
Aquí hay algunos escenarios en los que tiene sentido utilizar un modelo afinado.
- Su dominio es extremadamente diferente al contenido con el que se preentrenó el LLM, y el uso extensivo de indicaciones no ha producido los resultados que desea.
- Su modelo debe funcionar bien en un idioma con pocos recursos.
- Su modelo debe entrenarse con datos sensibles que tienen requisitos regulatorios estrictos.
- Estás usando un modelo pequeño debido a costos, privacidad, infraestructura u otras restricciones.
En todos estos escenarios, asegúrate de contar con un conjunto de datos específico del dominio lo suficientemente grande para entrenar tu modelo, de tener el tiempo y los recursos necesarios, y de que el coste del ajuste fino sea rentable. De lo contrario, puede que te convenga más intentar optimizar tu prompt.
Ejemplos
Los ejemplos a continuación demuestran cómo solicitar a un LLM que realice diferentes tareas.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Return a list of named entities in the text.
Text: The company was founded in 2016 by French entrepreneurs Clément Delangue, Julien Chaumond, and Thomas Wolf in New York City, originally as a company that developed a chatbot app targeted at teenagers.
Named entities:
"""
outputs = pipeline(prompt, max_new_tokens=50, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: [Clément Delangue, Julien Chaumond, Thomas Wolf, company, New York City, chatbot app, teenagers]from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Translate the English text to French.
Text: Sometimes, I've believed as many as six impossible things before breakfast.
Translation:
"""
outputs = pipeline(prompt, max_new_tokens=20, do_sample=True, top_k=10, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: À l'occasion, j'ai croyu plus de six choses impossiblesfrom transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Permaculture is a design process mimicking the diversity, functionality and resilience of natural ecosystems. The principles and practices are drawn from traditional ecological knowledge of indigenous cultures combined with modern scientific understanding and technological innovations. Permaculture design provides a framework helping individuals and communities develop innovative, creative and effective strategies for meeting basic needs while preparing for and mitigating the projected impacts of climate change.
Write a summary of the above text.
Summary:
"""
outputs = pipeline(prompt, max_new_tokens=30, do_sample=True, top_k=10, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: Permaculture is the design process that involves mimicking natural ecosystems to provide sustainable solutions to basic needs. It is a holistic approach that combfrom transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Answer the question using the context below.
Context: Gazpacho is a cold soup and drink made of raw, blended vegetables. Most gazpacho includes stale bread, tomato, cucumbers, onion, bell peppers, garlic, olive oil, wine vinegar, water, and salt. Northern recipes often include cumin and/or pimentón (smoked sweet paprika). Traditionally, gazpacho was made by pounding the vegetables in a mortar with a pestle; this more laborious method is still sometimes used as it helps keep the gazpacho cool and avoids the foam and silky consistency of smoothie versions made in blenders or food processors.
Question: What modern tool is used to make gazpacho?
Answer:
"""
outputs = pipeline(prompt, max_new_tokens=10, do_sample=True, top_k=10, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: A blender or food processor is the modern tool