Transformers documentation
Инженерия промптов
Инженерия промптов
Prompt engineering (или prompting) использует естественный язык для повышения качества работы больших языковых моделей (LLM) на различных задачах. Промпт может направить модель на генерацию нужного результата. Во многих случаях для решения задачи не требуется дообученная модель. Достаточно хорошо составленного промпта.
Попробуйте запросить LLM, чтобы она классифицировала какой-либо текст. При создании промпта важно дать очень конкретные инструкции о задаче и о том, каким должен быть результат.
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:
PositiveСложность заключается в том, чтобы составить промпты, которые дадут ожидаемый результат, поскольку язык невероятно нюансирован и выразителен.
В этом руководстве описаны лучшие практики, приёмы и примеры промпт-инжиниринга для решения задач, связанных с языком и рассуждениями.
Лучшие практики
Старайтесь выбирать самые новые модели для достижения наилучших результатов. Помните, что LLM могут выпускаться в двух вариантах: base и instruction-tuned (или chat).
Базовые модели отлично справляются с завершением текста по начальному промпту, но хуже следуют инструкциям. Модели, настроенные на инструкции, — это специально обученные версии базовых моделей на инструктивных или диалоговых данных. Это делает модели, настроенные на инструкции, более подходящими для работы с промптами.
Современные LLM, как правило, являются моделями только с декодером, однако существуют LLM с архитектурой «энкодер-декодер», такие как Flan-T5 или BART, которые также можно использовать для промптинга. Загружайте такие модели напрямую с помощью класса AutoModelForSeq2SeqLM (вместо использования Pipeline) и генерируйте выходные данные непосредственно из модели.
Начните с короткого и простого промпта, а затем дорабатывайте его, чтобы получить лучшие результаты.
Размещайте инструкции в начале или в конце промпта. Для длинных промптов модели могут применять оптимизации, предотвращающие квадратичный рост вычислений внимания, что придаёт больший вес началу и концу промпта.
Чётко отделяйте инструкции от интересующего вас текста.
Будьте конкретны и описательны в отношении задачи и желаемого результата, указывая, например, его формат, длину, стиль и язык. Избегайте неоднозначных описаний и инструкций.
Инструкции должны фокусироваться на том, «что делать», а не на том, «чего не делать».
Направляйте модель на генерацию правильного вывода, записывая первое слово или даже первое предложение.
Попробуйте другие техники, такие как few-shot и chain-of-thought, чтобы улучшить результаты.
Тестируйте свои промпты с различными моделями, чтобы оценить их устойчивость.
Версионируйте и отслеживайте эффективность своих промптов.
Методы
Одного лишь хорошо составленного промпта, также известного как zero-shot prompting, может быть недостаточно, чтобы получить желаемый результат. Возможно, вам потребуется попробовать несколько техник промптинга, чтобы добиться наилучшей производительности.
В этом разделе описаны несколько техник промптинга.
Few-shot prompting
Few-shot prompting повышает точность и производительность за счёт включения конкретных примеров того, что модель должна сгенерировать по заданному входу. Явные примеры помогают модели лучше понять задачу и формат вывода, который от неё ожидается. Поэкспериментируйте с разным количеством примеров (2, 4, 8 и т. д.), чтобы оценить их влияние на производительность. В примере ниже модели предоставляется 1 пример (1-shot) формата вывода (дата в формате MM/DD/YYYY), который она должна вернуть.
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/1960Недостаток few-shot prompting заключается в том, что необходимо создавать более длинные промпты, что увеличивает вычислительные затраты и задержку. Кроме того, существует ограничение на длину промпта. Наконец, модель может выучить нежелательные закономерности из ваших примеров, и она может плохо справляться с задачами сложного рассуждения.
Чтобы улучшить few-shot prompting для современных LLM, прошедших instruction-tuning, используйте специфический для модели chat template. Эти модели обучаются на наборах данных, содержащих диалоги, построенные по принципу чередования реплик между «user» и «assistant». Структурирование промпта в соответствии с этим форматом может повысить качество работы модели.
Структурируйте промпт в виде диалога по ходам и используйте метод apply_chat_template для токенизации и форматирования.
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']}")Если базовый подход few-shot prompting встраивал примеры в одну текстовую строку, то формат chat template обеспечивает следующие преимущества.
- Модель может демонстрировать улучшенное понимание, поскольку она лучше распознает паттерн и ожидаемые роли пользовательского ввода и ответа ассистента.
- Модель может более последовательно выдавать требуемый формат вывода, поскольку в процессе обучения он структурирован аналогично входным данным.
Всегда обращайтесь к документации конкретной модели, настроенной на выполнение инструкций, чтобы узнать о формате её шаблона чата и правильно структурировать свои few-shot промпты.
Цепочка рассуждений
Метод цепочки рассуждений (Chain-of-thought, CoT) позволяет получать более связные и логически выверенные результаты, предоставляя модели серию подсказок, которые помогают ей более тщательно «рассуждать» о теме.
Приведённый ниже пример предоставляет модели несколько промптов для выполнения промежуточных шагов рассуждения.
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: 6Как и в случае с few-shot промптингом, недостаток CoT заключается в том, что требуется больше усилий для разработки набора промптов, помогающих модели рассуждать при решении сложной задачи, а увеличение длины промпта приводит к росту латентности.
Доработка
Хотя промптинг — это мощный способ работы с LLM, существуют сценарии, в которых лучше использовать дообученную модель или даже дообучить модель.
Ниже приведены примеры сценариев, в которых имеет смысл использовать дообученную модель.
- Ваша предметная область сильно отличается от данных, на которых LLM была предварительно обучена, и обширное промптирование не дало ожидаемых результатов.
- Ваша модель должна хорошо работать на языке с ограниченными ресурсами.
- Ваша модель должна обучаться на конфиденциальных данных, к которым предъявляются строгие нормативные требования.
- Вы используете небольшую модель из-за ограничений по стоимости, конфиденциальности, инфраструктуре или по другим причинам.
Во всех этих сценариях убедитесь, что у вас есть достаточно большой доменно-специфичный датасет для обучения модели, достаточно времени и ресурсов, а затраты на дообучение оправданы. В противном случае, возможно, лучше сосредоточиться на оптимизации промпта.
Примеры
Приведённые ниже примеры демонстрируют, как формулировать запросы к LLM для выполнения различных задач.
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