# Recursos de geração

A API [generate()](/docs/transformers/main/pt/main_classes/text_generation#transformers.GenerationMixin.generate) suporta alguns recursos para a construção de aplicações com base nela.

Este guia mostrará como usar esses recursos.

## Streaming

O streaming começa a retornar o texto assim que ele é gerado, de modo que você não precisa esperar para ver a resposta gerada inteira de uma só vez. Isso é importante em aplicações voltadas ao usuário, pois reduz a latência percebida e permite que os usuários acompanhem o progresso da geração.

    

> [!TIP]
> Saiba mais sobre streaming na documentação do [Text Generation Inference](https://huggingface.co/docs/text-generation-inference/en/conceptual/streaming).

Crie uma instância de [TextStreamer](/docs/transformers/main/pt/internal/generation_utils#transformers.TextStreamer) com o tokenizer. Passe [TextStreamer](/docs/transformers/main/pt/internal/generation_utils#transformers.TextStreamer) para o parâmetro `streamer` em [generate()](/docs/transformers/main/pt/main_classes/text_generation#transformers.GenerationMixin.generate) para transmitir a saída uma palavra de cada vez.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer

tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
inputs = tokenizer(["The secret to baking a good cake is "], return_tensors="pt")
streamer = TextStreamer(tokenizer)

_ = model.generate(**inputs, streamer=streamer, max_new_tokens=20)
```

O parâmetro `streamer` é compatível com qualquer classe que possua os métodos [put()](/docs/transformers/main/pt/internal/generation_utils#transformers.TextStreamer.put) e [end()](/docs/transformers/main/pt/internal/generation_utils#transformers.TextStreamer.end). [put()](/docs/transformers/main/pt/internal/generation_utils#transformers.TextStreamer.put) insere novos tokens e [end()](/docs/transformers/main/pt/internal/generation_utils#transformers.TextStreamer.end) sinaliza o fim da geração. Você pode criar sua própria classe de streamer, desde que inclua esses dois métodos, ou utilizar as classes de streamer básicas do Transformers.

## Marca d'água

O watermarking é útil para detectar se um texto foi gerado por IA. A [estratégia de watermarking](https://hf.co/papers/2306.04634) no Transformers "colora" aleatoriamente um subconjunto dos tokens de verde. Quando tokens verdes são gerados, um pequeno viés é adicionado aos seus logits, aumentando a probabilidade de serem gerados. É possível detectar texto gerado comparando a proporção de tokens verdes com a quantidade de tokens verdes normalmente encontrada em texto gerado por humanos.

O watermarking é suportado para qualquer modelo generativo em Transformers e não requer um modelo de classificação extra para detectar o texto com marca d'água.

Crie um [WatermarkingConfig](/docs/transformers/main/pt/internal/generation_utils#transformers.WatermarkingConfig) com o valor de viés a ser adicionado aos logits e o algoritmo de marca d'água. O exemplo abaixo usa o algoritmo `"selfhash"`, em que a seleção de tokens verdes depende apenas do token atual. Passe o [WatermarkingConfig](/docs/transformers/main/pt/internal/generation_utils#transformers.WatermarkingConfig) para [generate()](/docs/transformers/main/pt/main_classes/text_generation#transformers.GenerationMixin.generate).

> [!TIP]
> A classe [WatermarkDetector](/docs/transformers/main/pt/internal/generation_utils#transformers.WatermarkDetector) detecta a proporção de tokens verdes no texto gerado, motivo pelo qual é recomendável remover o texto do prompt, caso ele seja muito mais longo que o texto gerado. O padding também pode afetar o [WatermarkDetector](/docs/transformers/main/pt/internal/generation_utils#transformers.WatermarkDetector).

```py
from transformers import AutoTokenizer, AutoModelForCausalLM, WatermarkDetector, WatermarkingConfig

model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
tokenizer.pad_token_id = tokenizer.eos_token_id
tokenizer.padding_side = "left"

inputs = tokenizer(["This is the beginning of a long story", "Alice and Bob are"], padding=True, return_tensors="pt")
input_len = inputs["input_ids"].shape[-1]

watermarking_config = WatermarkingConfig(bias=2.5, seeding_scheme="selfhash")
out = model.generate(**inputs, watermarking_config=watermarking_config, do_sample=False, max_length=20)
```

Crie uma instância de [WatermarkDetector](/docs/transformers/main/pt/internal/generation_utils#transformers.WatermarkDetector) e passe a saída do modelo para ela para detectar se o texto foi gerado por máquina. O [WatermarkDetector](/docs/transformers/main/pt/internal/generation_utils#transformers.WatermarkDetector) deve ter a mesma [WatermarkingConfig](/docs/transformers/main/pt/internal/generation_utils#transformers.WatermarkingConfig) usada durante a geração.

```py
detector = WatermarkDetector(model_config=model.config, device="cpu", watermarking_config=watermarking_config)
detection_out = detector(out, return_dict=True)
detection_out.prediction
array([True, True])
```

