# 생성 기능

[generate()](/docs/transformers/main/ko/main_classes/text_generation#transformers.GenerationMixin.generate) API는 이를 기반으로 애플리케이션을 구축하기 위한 몇 가지 기능을 지원합니다.

이 가이드에서는 이러한 기능을 사용하는 방법을 보여줍니다.

## 스트리밍

Streaming은 텍스트가 생성되는 즉시 반환되므로, 전체 생성 응답을 한 번에 볼 때까지 기다릴 필요가 없습니다. 이는 사용자 대상 애플리케이션에서 중요한 요소로, 인지 지연을 줄이고 사용자가 생성 진행 상황을 실시간으로 확인할 수 있게 합니다.

    

> [!TIP]
> [Text Generation Inference](https://huggingface.co/docs/text-generation-inference/en/conceptual/streaming) 문서에서 스트리밍에 대해 자세히 알아보세요.

토크나이저로 [TextStreamer](/docs/transformers/main/ko/internal/generation_utils#transformers.TextStreamer) 인스턴스를 생성합니다. [generate()](/docs/transformers/main/ko/main_classes/text_generation#transformers.GenerationMixin.generate)의 `streamer` 매개변수에 [TextStreamer](/docs/transformers/main/ko/internal/generation_utils#transformers.TextStreamer)를 전달하여 출력을 한 단어씩 스트리밍합니다.

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

`streamer` 파라미터는 [put()](/docs/transformers/main/ko/internal/generation_utils#transformers.TextStreamer.put) 및 [end()](/docs/transformers/main/ko/internal/generation_utils#transformers.TextStreamer.end) 메서드를 가진 모든 클래스와 호환됩니다. [put()](/docs/transformers/main/ko/internal/generation_utils#transformers.TextStreamer.put)은 새로운 토큰을 전달하고, [end()](/docs/transformers/main/ko/internal/generation_utils#transformers.TextStreamer.end)은 생성의 종료를 표시합니다. 이 두 메서드를 포함하는 커스텀 streamer 클래스를 만들거나, Transformers의 기본 streamer 클래스를 사용할 수 있습니다.

## 워터마킹

워터마킹은 텍스트가 생성된 것인지 감지하는 데 유용합니다. Transformers의 [워터마킹 전략](https://hf.co/papers/2306.04634)은 토큰의 하위 집합을 무작위로 "녹색"으로 표시합니다. 녹색 토큰이 생성될 때 해당 토큰의 로짓에 작은 바이어스가 추가되어 생성될 확률이 높아집니다. 녹색 토큰의 비율을 인간이 작성한 텍스트에서 일반적으로 발견되는 녹색 토큰의 양과 비교함으로써 생성된 텍스트를 감지할 수 있습니다.

Watermarking은 Transformers의 모든 생성 모델에서 지원되며, 워터마크가 적용된 텍스트를 감지하기 위해 별도의 분류 모델이 필요하지 않습니다.

logits에 추가할 bias 값과 워터마킹 알고리즘을 사용하여 [WatermarkingConfig](/docs/transformers/main/ko/internal/generation_utils#transformers.WatermarkingConfig)를 생성합니다. 아래 예시는 `"selfhash"` 알고리즘을 사용하며, 이 알고리즘에서는 green token 선택이 현재 token에만 의존합니다. [WatermarkingConfig](/docs/transformers/main/ko/internal/generation_utils#transformers.WatermarkingConfig)를 [generate()](/docs/transformers/main/ko/main_classes/text_generation#transformers.GenerationMixin.generate)에 전달합니다.

> [!TIP]
> [WatermarkDetector](/docs/transformers/main/ko/internal/generation_utils#transformers.WatermarkDetector) 클래스는 생성된 텍스트에서 녹색 토큰의 비율을 감지하므로, 프롬프트 텍스트가 생성된 텍스트보다 훨씬 길다면 프롬프트 텍스트를 제거하는 것이 권장됩니다. 패딩도 [WatermarkDetector](/docs/transformers/main/ko/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)
```

[WatermarkDetector](/docs/transformers/main/ko/internal/generation_utils#transformers.WatermarkDetector)의 인스턴스를 생성하고 모델 출력을 전달하여 텍스트가 기계 생성된 것인지 감지합니다. [WatermarkDetector](/docs/transformers/main/ko/internal/generation_utils#transformers.WatermarkDetector)에는 생성 시에 사용된 동일한 [WatermarkingConfig](/docs/transformers/main/ko/internal/generation_utils#transformers.WatermarkingConfig)가 필요합니다.

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

