Transformers documentation

Metin üretimi

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Metin üretimi

Metin üretimi, büyük dil modellerinin (LLM) en popüler uygulamasıdır. Bir LLM, başlangıç metnine (prompt) ve kendisinin ürettiği çıktılara dayanarak, önceden tanımlanmış bir uzunluğa kadar veya bir dizin sonu (EOS) token'ına ulaşıncaya kadar bir sonraki kelimeyi (token) üretmek üzere eğitilir.

Transformers'ta generate() API'si metin üretimini yönetir ve üretken yeteneklere sahip tüm modellerde kullanılabilir. Bu kılavuz, generate() ile metin üretiminin temellerini ve kaçınılması gereken bazı yaygın tuzakları gösterecektir.

Aşağıdaki komutlar için transformers serve'in çalıştığından emin olun.

transformers chat Qwen/Qwen2.5-0.5B-Instruct

Varsayılan generate

Başlamadan önce, çok büyük modelleri bellek kullanımını azaltmak için nicelleştirmek üzere bitsandbytes paketini yüklemeniz faydalı olacaktır.

!pip install -U transformers bitsandbytes

Bitsandbytes, CUDA tabanlı GPU'ların yanı sıra birden çok backend'i destekler. Daha fazla bilgi için çoklu backend kurulum kılavuzuna bakın.

Bir LLM'i from_pretrained() ile yükleyin ve bellek gereksinimlerini azaltmak için aşağıdaki iki parametreyi ekleyin.

  • device_map="auto", en hızlı cihazdan (GPU) başlayarak model iskeletinin otomatik olarak başlatılmasını ve model ağırlıklarının tüm kullanılabilir cihazlara yüklenip dağıtılmasını sağlayan Accelerate'in Big Model Inference özelliğini etkinleştirir.
  • quantization_config, kuantizasyon ayarlarını tanımlayan bir yapılandırma nesnesidir. Bu örnek, kuantizasyon arka ucu olarak bitsandbytes kullanır (daha fazla kullanılabilir arka uç için Kuantizasyon bölümüne bakın) ve modeli 4-bit olarak yükler.
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(load_in_4bit=True)
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", device_map="auto", quantization_config=quantization_config)

Girdinizi tokenleştirin ve bir LLM, dolgu tokenlarından devam ettirmek üzere eğitilmediği için padding_side() parametresini "left" olarak ayarlayın. Tokenizer, girdi kimliklerini ve dikkat maskesini döndürür.

Tokenizöre bir dizi string geçirerek aynı anda birden fazla prompt işleyin. Gecikme ve bellek üzerinde küçük bir maliyetle verimliliği artırmak için girdileri toplu (batch) olarak işleyin.

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1", padding_side="left")
model_inputs = tokenizer(["A list of colors: red, blue"], return_tensors="pt").to(model.device)

Girdileri generate() işlevine iletin ve üretilen tokenları batch_decode() ile metne geri dönüştürün.

generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
"A list of colors: red, blue, green, yellow, orange, purple, pink,"

Üretim yapılandırması

Tüm üretim ayarları GenerationConfig içinde yer alır. Yukarıdaki örnekte, üretim ayarları mistralai/Mistral-7B-v0.1'in generation_config.json dosyasından türetilmiştir. Bir modelle birlikte yapılandırma kaydedilmediğinde varsayılan bir çözümleme stratejisi kullanılır.

Yapılandırmayı generation_config özniteliği üzerinden inceleyin. Bu, varsayılan yapılandırmadan farklı olan değerleri gösterir; bu durumda bos_token_id ve eos_token_id.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", device_map="auto")
model.generation_config
GenerationConfig {
  "bos_token_id": 1,
  "eos_token_id": 2
}

generate() fonksiyonunu, GenerationConfig içindeki parametreleri ve değerleri geçersiz kılacak şekilde özelleştirebilirsiniz. Sıkça ayarlanan parametreler için aşağıdaki bu bölümü inceleyin.

# enable beam search sampling strategy
model.generate(**inputs, num_beams=4, do_sample=True)

generate() harici kütüphaneler veya özel kodlarla da genişletilebilir:

  1. logits_processor parametresi, bir sonraki token olasılık dağılımını değiştirmek için özel LogitsProcessor örneklerini kabul eder;
  2. stopping_criteria parametresi, metin üretimini durdurmak için özel StoppingCriteria destekler;
  3. diğer özel üretim yöntemleri custom_generate bayrağı üzerinden yüklenebilir (belgeler).

Arama, örneklem ve çözümleme stratejileri hakkında daha fazla bilgi edinmek için Generation strategies kılavuzuna başvurun.

Kaydetme

GenerationConfig örneği oluşturun ve istediğiniz çözümleme parametrelerini belirtin.

from transformers import AutoModelForCausalLM, GenerationConfig

model = AutoModelForCausalLM.from_pretrained("my_account/my_model")
generation_config = GenerationConfig(
    max_new_tokens=50, do_sample=True, top_k=50, eos_token_id=model.config.eos_token_id
)

Belirli bir üretim yapılandırmasını kaydetmek için save_pretrained() kullanın ve Hub'a yüklemek için push_to_hub parametresini True olarak ayarlayın.

generation_config.save_pretrained("my_account/my_model", push_to_hub=True)

config_file_name parametresini boş bırakın. Bu parametre, tek bir dizinde birden çok üretim yapılandırması saklanırken kullanılmalıdır. Yüklemek istediğiniz üretim yapılandırmasını belirtmenin bir yolunu sunar. Tek bir modelle kullanılmak üzere, farklı üretici görevler (örnekleme ile yaratıcı metin üretimi, ışın araması ile özetleme) için farklı yapılandırmalar oluşturabilirsiniz.

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, GenerationConfig

tokenizer = AutoTokenizer.from_pretrained("google-t5/t5-small")
model = AutoModelForSeq2SeqLM.from_pretrained("google-t5/t5-small")

translation_generation_config = GenerationConfig(
    num_beams=4,
    early_stopping=True,
    decoder_start_token_id=0,
    eos_token_id=model.config.eos_token_id,
    pad_token=model.config.pad_token_id,
)

translation_generation_config.save_pretrained("/tmp", config_file_name="translation_generation_config.json", push_to_hub=True)

generation_config = GenerationConfig.from_pretrained("/tmp", config_file_name="translation_generation_config.json")
inputs = tokenizer("translate English to French: Configuration files are easy to use!", return_tensors="pt")
outputs = model.generate(**inputs, generation_config=generation_config)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True))

Ortak Seçenekler

generate(), yoğun şekilde özelleştirilebilen güçlü bir araçtır. Bu durum, yeni kullanıcılar için göz korkutucu olabilir. Bu bölüm, Transformers'taki çoğu metin üretim aracında tanımlayabileceğiniz popüler üretim seçeneklerinin bir listesini içerir: generate(), GenerationConfig, pipelines, chat CLI, …

Seçenek adıTürBasitleştirilmiş açıklama
max_new_tokensintMaksimum üretim uzunluğunu kontrol eder. Genellikle küçük bir değere varsayılan olarak ayarlandığından, bunu tanımlamayı unutmayın.
do_sampleboolBir sonraki token'ın örneklenip örneklenmeyeceğini (True) yoksa bunun yerine açgözlü (greedy) üretim yapılıp yapılmayacağını (False) tanımlar. Çoğu kullanım senaryosunda bu bayrağın True olarak ayarlanması gerekir. Daha fazla bilgi için bu kılavuza göz atın.
temperaturefloatBir sonraki seçilen token'ün ne kadar öngörülemez olacağı. Yüksek değerler (>0.8) yaratıcı görevler için, düşük değerler (ör. <0.4) ise “düşünme” gerektiren görevler için uygundur. do_sample=True gerektirir.
num_beamsint>1 olarak ayarlandığında, beam search algoritmasını etkinleştirir. Beam search, girdiye dayalı görevlerde iyi sonuç verir. Daha fazla bilgi için bu kılavuza bakın.
repetition_penaltyfloatModelin kendini sık sık tekrarladığını görüyorsanız bunu >1.0 olarak ayarlayın. Daha büyük değerler daha büyük bir ceza uygular.
eos_token_idlist[int]Üretim sürecini durduracak token(lar). Varsayılan değer genellikle yeterlidir, ancak farklı bir token belirtebilirsiniz.

Tuzaklar

Aşağıdaki bölüm, metin üretimi sırasında karşılaşabileceğiniz bazı yaygın sorunları ve bunların nasıl çözüleceğini ele alır.

Çıktı uzunluğu

generate(), bir modelin GenerationConfig'inde aksi belirtilmedikçe varsayılan olarak en fazla 20 token döndürür. Çıktı uzunluğunu kontrol etmek için, üretilen token sayısını max_new_tokens parametresiyle manuel olarak ayarlaması şiddetle önerilir. Decoder-only modeller, başlangıç istemini üretilen tokenlerle birlikte döndürür.

model_inputs = tokenizer(["A sequence of numbers: 1, 2"], return_tensors="pt").to(model.device)
varsayılan uzunluk
max_new_tokens
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
'A sequence of numbers: 1, 2, 3, 4, 5'

Çözme stratejisi

generate() içindeki varsayılan çözümleme stratejisi, bir modelin GenerationConfig'inde aksi belirtilmedikçe bir sonraki en olası token'ı seçen greedy search'tır. Bu çözümleme stratejisi, girdiye dayalı görevlerde (transkripsiyon, çeviri) iyi çalışsa da daha yaratıcı kullanım senaryoları (hikaye yazma, sohbet uygulamaları) için optimal değildir.

Örneğin, daha çeşitli çıktılar üretmek için multinomial sampling stratejisini etkinleştirin. Daha fazla çözümleme stratejisi için Generation strategy kılavuzuna başvurun.

model_inputs = tokenizer(["I am a cat."], return_tensors="pt").to(model.device)
açgözlü arama
çok terimli örneklem
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

Dolgu tarafı

Girdiler aynı uzunlukta değilse dolguya (padding) ihtiyaç duyar. Ancak LLM'ler dolgu token'larından devam ederek üretim yapacak şekilde eğitilmediğinden, padding_side() parametresinin girdinin soluna ayarlanması gerekir. Sağ dolgu, tekrarlayan durumları (recurrent state) sona eren dolgu token'ları üzerinde sürekli güncellediği için durum uzayı (state-space) ve hibrit modeller için daha kötüdür; bu da önbelleğin (cache) istemin (prompt) sonuyla eşleşmemesine neden olur.

sağ doldurma
sol boşluk
model_inputs = tokenizer(
    ["1, 2, 3", "A, B, C, D, E"], padding=True, return_tensors="pt"
).to(model.device)
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
'1, 2, 33333333333'

İstem formatı

Bazı modeller ve görevler belirli bir girdi istemci biçimi bekler ve biçim hatalıysa model, optimal olmayan bir çıktı döndürür. İstemciler hakkında daha fazla bilgiyi prompt engineering kılavuzunda bulabilirsiniz.

Örneğin, bir sohbet modeli girdiyi bir sohbet şablonu olarak bekler. Sohbetin kimin tarafından yürütüldüğünü belirtmek için prompt'unuzda bir role ve content bulunmalıdır. Prompt'unuzu tek bir dize olarak iletirseniz, model her zaman beklenen çıktıyı döndürmeyebilir.

from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceH4/zephyr-7b-alpha")
model = AutoModelForCausalLM.from_pretrained(
    "HuggingFaceH4/zephyr-7b-alpha", device_map="auto", quantization_config=BitsAndBytesConfig(load_in_4bit=True)
)
biçim yok
sohbet şablonu
prompt = """How many cats does it take to change a light bulb? Reply as a pirate."""
model_inputs = tokenizer([prompt], return_tensors="pt").to(model.device)
input_length = model_inputs.input_ids.shape[1]
generated_ids = model.generate(**model_inputs, max_new_tokens=50)
print(tokenizer.batch_decode(generated_ids[:, input_length:], skip_special_tokens=True)[0])
"Aye, matey! 'Tis a simple task for a cat with a keen eye and nimble paws. First, the cat will climb up the ladder, carefully avoiding the rickety rungs. Then, with"

Kaynaklar

Daha spesifik ve uzmanlaşmış metin üretme kütüphaneleri için aşağıya göz atın.

  • Optimum: belirli donanım cihazlarında eğitim ve çıkarımın optimizasyonuna odaklanan bir Transformers uzantısı
  • Outlines: kısıtlı metin üretimi için bir kütüphane (örneğin JSON dosyaları üretmek için).
  • SynCode: bağlamdan bağımsız dilbilgisi yönlendirmeli üretim için bir kütüphane (JSON, SQL, Python).
  • Text Generation Inference: LLM'ler için üretim ortamına hazır bir sunucu.
  • Metin oluşturma web arayüzü: Metin oluşturma için bir Gradio web arayüzü.
  • logits-processor-zoo: metin üretimini kontrol etmek için ek logits işleyicileri.
Update on GitHub