# 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()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.generate) API'si metin üretimini yönetir ve üretken yeteneklere sahip tüm modellerde kullanılabilir. Bu kılavuz, [generate()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.generate) ile metin üretiminin temellerini ve kaçınılması gereken bazı yaygın tuzakları gösterecektir.

> [!TIP]
> Aşağıdaki komutlar için [`transformers serve`'in çalıştığından emin olun](./serve-cli/serving).
>
> ```shell
> 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](https://hf.co/docs/bitsandbytes/index) paketini yüklemeniz faydalı olacaktır.

```bash
!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](https://huggingface.co/docs/bitsandbytes/main/en/installation#multi-backend) bakın.

Bir LLM'i [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.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](./models#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](./quantization/overview) bölümüne bakın) ve modeli [4-bit](./quantization/bitsandbytes) olarak yükler.

```py
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.

> [!TIP]
> 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.

```py
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()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.generate) işlevine iletin ve üretilen tokenları [batch_decode()](/docs/transformers/main/tr/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.batch_decode) ile metne geri dönüştürün.

```py
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](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationConfig) içinde yer alır. Yukarıdaki örnekte, üretim ayarları [mistralai/Mistral-7B-v0.1](https://huggingface.co/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`.

```py
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()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.generate) fonksiyonunu, [GenerationConfig](/docs/transformers/main/tr/main_classes/text_generation#transformers.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ü](#common-options) inceleyin.

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

[generate()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.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](/docs/transformers/main/tr/internal/generation_utils#transformers.LogitsProcessor) örneklerini kabul eder;
2. `stopping_criteria` parametresi, metin üretimini durdurmak için özel [StoppingCriteria](/docs/transformers/main/tr/internal/generation_utils#transformers.StoppingCriteria) destekler;
3. diğer özel üretim yöntemleri `custom_generate` bayrağı üzerinden yüklenebilir ([belgeler](./generation_strategies#custom-generation-methods)).

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

### Kaydetme

[GenerationConfig](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationConfig) örneği oluşturun ve istediğiniz çözümleme parametrelerini belirtin.

```py
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()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationConfig.save_pretrained) kullanın ve Hub'a yüklemek için `push_to_hub` parametresini `True` olarak ayarlayın.

```py
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.

```py
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()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.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ümde, Transformers'taki çoğu metin üretim aracında tanımlayabileceğiniz popüler üretim seçeneklerinin bir listesi yer alır: [generate()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.generate), [GenerationConfig](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationConfig), `pipelines`, `chat` CLI, ...

| Seçenek adı | Tür | Basitleştirilmiş açıklama |
|---|---|---|
| `max_new_tokens` | `int` | Maksimum üretim uzunluğunu kontrol eder. Genellikle küçük bir değere varsayılan olarak ayarlandığından, bunu tanımlamayı unutmayın. |
| `do_sample` | `bool` | Bir 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](./generation_strategies) göz atın. |
| `temperature` | `float` | Bir sonraki seçilen token'ün ne kadar öngörülemez olacağını belirler. Yaratıcı görevler için yüksek değerler (`>0.8`) uygunken, "düşünme" gerektiren görevler için düşük değerler (ör. `<0.4`) uygundur. `do_sample=True` gerektirir. |
| `num_beams` | `int` | `>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](./generation_strategies) bakın. |
| `repetition_penalty` | `float` | Modelin 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_id` | `list[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()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.generate), bir modelin [GenerationConfig](/docs/transformers/main/tr/main_classes/text_generation#transformers.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](https://hf.co/learn/nlp-course/chapter1/6?fw=pt) modeller, başlangıç istemini üretilen tokenlerle birlikte döndürür.

```py
model_inputs = tokenizer(["A sequence of numbers: 1, 2"], return_tensors="pt").to(model.device)
```

```py
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'
```

```py
generated_ids = model.generate(**model_inputs, max_new_tokens=50)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
'A sequence of numbers: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,'
```

### Çözme stratejisi

[generate()](/docs/transformers/main/tr/main_classes/text_generation#transformers.GenerationMixin.generate) içindeki varsayılan çözümleme stratejisi, bir modelin [GenerationConfig](/docs/transformers/main/tr/main_classes/text_generation#transformers.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](./generation_strategies#sampling) stratejisini etkinleştirin. Daha fazla çözümleme stratejisi için [Generation strategy](./generation_strategies) kılavuzuna başvurun.

```py
model_inputs = tokenizer(["I am a cat."], return_tensors="pt").to(model.device)
```

```py
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
```

```py
generated_ids = model.generate(**model_inputs, do_sample=True)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
```

### Dolgu tarafı

Girdiler aynı uzunlukta değilse dolgu (padding) yapılmalıdır. Ancak LLM'ler dolgu token'larından devam ederek üretim yapacak şekilde eğitilmediğinden, `padding_side()` parametresinin girdinin soluna ayarlanması gerekir. Sağ dolgu, yinek durumları sürekli olarak sondaki dolgu token'ları üzerinde güncellenmeye devam ettiğ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.

```py
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'
```

```py
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1", padding_side="left")
tokenizer.pad_token = tokenizer.eos_token
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, 3, 4, 5, 6,'
```

### İ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](./tasks/prompting) kılavuzunda bulabilirsiniz.

Örneğin, bir sohbet modeli girdiyi bir [sohbet şablonu](./chat_templating) olarak bekler. Sohbetin kimler tarafından yürütüldüğünü belirtmek için isteminizde bir `role` ve `content` bulunmalıdır. İsteminizi tek bir dize olarak iletirseniz, model her zaman beklenen çıktıyı döndürmeyebilir.

```py
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)
)
```

```py
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"
```

```py
messages = [
    {
        "role": "system",
        "content": "You are a friendly chatbot who always responds in the style of a pirate",
    },
    {"role": "user", "content": "How many cats does it take to change a light bulb?"},
]
model_inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
input_length = model_inputs["input_ids"].shape[1]
generated_ids = model.generate(**model_inputs, do_sample=True, max_new_tokens=50)
print(tokenizer.batch_decode(generated_ids[:, input_length:], skip_special_tokens=True)[0])
"Arr, matey! According to me beliefs, 'twas always one cat to hold the ladder and another to climb up it an’ change the light bulb, but if yer looking to save some catnip, maybe yer can
```

## Kaynaklar

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

- [Optimum](https://github.com/huggingface/optimum): belirli donanım cihazlarında eğitim ve çıkarımın optimizasyonuna odaklanan bir Transformers uzantısı
- [Outlines](https://github.com/dottxt-ai/outlines): kısıtlı metin üretimi için bir kütüphane (örneğin JSON dosyaları üretmek için).
- [SynCode](https://github.com/uiuc-focal-lab/syncode): bağlamdan bağımsız dilbilgisi yönlendirmeli üretim için bir kütüphane (JSON, SQL, Python).
- [Text Generation Inference](https://github.com/huggingface/text-generation-inference): LLM'ler için üretim ortamına hazır bir sunucu.
- [Metin oluşturma web arayüzü](https://github.com/oobabooga/text-generation-webui): Metin oluşturma için bir Gradio web arayüzü.
- [logits-processor-zoo](https://github.com/NVIDIA/logits-processor-zoo): metin üretimini kontrol etmek için ek logits işleyicileri.

