Transformers documentation
Prompt mühendisliği
Prompt mühendisliği
Prompt mühendisliği veya prompting, doğal dil kullanarak büyük dil modellerinin (LLM) çeşitli görevlerdeki performansını iyileştirmek için kullanılır. Bir prompt, modelin istenen bir çıktı üretmesi yönünde yönlendirilebilir. Birçok durumda, bir görev için ince ayarlanmış bir modele bile ihtiyacınız yoktur. Sadece iyi bir prompta ihtiyacınız vardır.
Bir LLM'ye bazı metinleri sınıflandırmak için istem (prompt) vererek deneyin. Bir istem oluştururken, görevle ilgili ve sonucun nasıl görünmesi gerektiğine dair çok spesifik talimatlar vermek önemlidir.
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:
PositiveZorluk, dilin son derece nüanslı ve ifade gücü yüksek olması nedeniyle, beklediğiniz sonuçları üreten istemleri (prompt) tasarlama sürecinde yatar.
Bu kılavuz, dil ve akıl yürütme görevlerini çözmek için prompt mühendisliğinde en iyi uygulamaları, teknikleri ve örnekleri kapsar.
En iyi uygulamalar
En iyi performansı elde etmek için en güncel modelleri seçmeye çalışın. LLM'lerin base ve instruction-tuned (veya chat) olmak üzere iki varyantı olabileceğini unutmayın.
Base modeller, başlangıç bir istem verildiğinde metni tamamlamada mükemmeldir, ancak talimatları takip etmede o kadar iyi değildir. Instruction-tuned modeller, talimat veya konuşma verileri üzerinde özel olarak eğitilmiş base model sürümleridir. Bu da instruction-tuned modelleri istem oluşturma (prompting) için daha uygun hale getirir.
Modern LLM'ler genellikle yalnızca çözücü (decoder-only) modellerdir, ancak Flan-T5 veya BART gibi istem (prompting) için kullanılabilecek bazı kodlayıcı-çözücü (encoder-decoder) LLM'ler de mevcuttur. Bu modelleri Pipeline kullanmak yerine doğrudan AutoModelForSeq2SeqLM sınıfıyla yükleyin ve çıktıları modelin kendisinden üretin.
Kısa ve basit bir istemle başlayın ve daha iyi sonuçlar almak için üzerinde iyileştirmeler yapın.
Talimatları bir istemin başına veya sonuna yerleştirin. Daha uzun istemlerde, modellerin dikkatin karesel olarak ölçeklenmesini önlemek için optimizasyonlar uygulaması, istemin başına ve sonuna daha fazla ağırlık verilmesine neden olabilir.
Talimatları, ilginizi çeken metinden açıkça ayırın.
Görev ve istenen çıktı hakkında, örneğin format, uzunluk, stil ve dil gibi detayları içerecek şekilde spesifik ve açıklayıcı olun. Belirsiz açıklamalardan ve talimatlardan kaçının.
Talimatlar, “ne yapılmayacağı” yerine “ne yapılacağı” üzerine odaklanmalıdır.
Modelin doğru çıktıyı üretmesini sağlamak için ilk kelimeyi veya hatta ilk cümleyi yazarak modelin yolunu gösterin.
Sonuçları iyileştirmek için few-shot ve chain-of-thought gibi diğer teknikleri deneyin.
Farklı modellerle istemlerinizi test ederek sağlamlıklarını değerlendirin.
Prompt performansınızı sürümleyin ve izleyin.
Teknikler
Yalnızca iyi bir prompt oluşturmak, yani zero-shot prompting olarak da bilinen yöntem, istediğiniz sonuçları elde etmek için yeterli olmayabilir. En iyi performansı almak için birkaç promptlama tekniğini denemeniz gerekebilir.
Bu bölüm, birkaç istem oluşturma tekniğini ele alır.
Az örnekli istem
Az örnekli istemleme (few-shot prompting), bir girdi verildiğinde modelin üretmesi gereken çıktıya dair belirli örnekler sunarak doğruluğu ve performansı artırır. Açıkça verilen bu örnekler, modelin görevi ve aradığınız çıktı biçimini daha iyi anlamasını sağlar. Performans üzerindeki etkisini görmek için farklı sayıda örnek (2, 4, 8 vb.) ile deneyler yapmayı deneyin. Aşağıdaki örnek, modelin döndürmesi gereken çıktı biçiminin (GG/AA/YYYY biçiminde bir tarih) 1 örneğini (1-shot) modelin önüne koyar.
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/1960Az örnekli istemlemenin dezavantajı, daha uzun istemler oluşturmanız gerektiğidir; bu da hesaplama yükünü ve gecikmeyi artırır. Ayrıca istem uzunlukları için bir sınır vardır. Son olarak, bir model örneklerinizden istenmeyen örüntüler öğrenebilir ve karmaşık akıl yürütme görevlerinde iyi çalışmayabilir.
Modern talimatla eğitilmiş LLM'lerde az örnekli (few-shot) istemcilemeyi (prompting) iyileştirmek için, modelin kendine özgü söyleşme şablonunu (chat template) kullanın. Bu modeller, bir “kullanıcı” ile “asistan” arasındaki turlu (turn-based) konuşmalardan oluşan veri setlerinde eğitilir. İsteminizi bu yapıyla uyumlu hale getirmek performansı artırabilir.
Prompt'unuzu sıralı bir sohbet olarak yapılandırın ve apply_chat_template yöntemini belirlemek ve biçimlendirmek için kullanın.
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']}")Temel az örnekli (few-shot) istemleme yaklaşımı örnekleri tek bir metin dizgisi içinde barındırırken, sohbet şablonu biçimi aşağıdaki avantajları sunar.
- Model, kullanıcı girdisi ve asistan çıktısının beklenen rollerini ve kalıbı daha iyi tanıyabildiği için potansiyel olarak daha iyi bir anlama yeteneğine sahip olabilir.
- Model, eğitim sırasında girdisiyle benzer bir yapıya sahip olduğu için, istenen çıktı biçimini daha tutarlı bir şekilde üretebilir.
Az sayıda örnek içeren istemlerinizi buna göre yapılandırabilmeniz için, sohbet şablonlarının biçimi hakkında daha fazla bilgi edinmek üzere her zaman ilgili talimatla ayarlanmış modelin dokümantasyonuna başvurun.
Düşünce zinciri
Zincirleme düşünme (Chain-of-thought, CoT), bir modelin bir konu hakkında daha kapsamlı “düşünmesine” yardımcı olan bir dizi istem sağlayarak daha tutarlı ve iyi gerekçelendirilmiş çıktılar üretmede etkilidir.
Aşağıdaki örnek, modele ara akıl yürütme adımlarını işlemesi için birkaç istem sağlar.
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: 6few-shot istemcilemede olduğu gibi, CoT'nin dezavantajı, modelin karmaşık bir görevi akıl yürütmesine yardımcı olacak bir istem serisi tasarlamak için daha fazla çaba gerektirmesi ve istem uzunluğunun gecikmeyi artırmasıdır.
İnce ayar
Komut oluşturma (prompting), LLM'lerle çalışmak için güçlü bir yöntem olsa da, bazı senaryolarda ince ayarlanmış bir modelin veya hatta bir modelin ince ayarının daha iyi sonuç verdiği durumlar vardır.
İnce ayarlanmış bir modelin mantıklı olduğu bazı örnek senaryolar şunlardır.
- Alanınız, bir LLM'in ön eğitimi sırasında gördüğü verilerden son derece farklıdır ve kapsamlı istemler (prompting) istediğiniz sonuçları üretmemiştir.
- Modeliniz düşük kaynaklı bir dilde iyi çalışmalıdır.
- Modeliniz, sıkı düzenleyici gereksinimleri olan hassas veriler üzerinde eğitilmelidir.
- Maliyet, gizlilik, altyapı veya diğer kısıtlamalar nedeniyle küçük bir model kullanıyorsunuz.
Tüm bu senaryolarda, modelinizi eğitmek için yeterli büyüklükte bir alan özel veri setine sahip olduğunuzdan, yeterli zaman ve kaynağa sahip olduğunuzdan ve ince ayar maliyetinin buna değdiğinden emin olun. Aksi takdirde, prompt'unuzu optimize etmeye çalışmak sizin için daha iyi bir seçenek olabilir.
Örnekler
Aşağıdaki örnekler, bir LLM'in farklı görevler için nasıl istem (prompt) ile yönlendirildiğini göstermektedir.
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