# Các tính năng sinh

API [generate()](/docs/transformers/main/vi/main_classes/text_generation#transformers.GenerationMixin.generate) hỗ trợ một số tính năng để xây dựng các ứng dụng dựa trên nó.

Hướng dẫn này sẽ cho bạn thấy cách sử dụng các tính năng này.

## Streaming

Streaming bắt đầu trả về văn bản ngay khi nó được tạo ra, vì vậy bạn không cần phải chờ để xem toàn bộ phản hồi được tạo ra cùng một lúc. Điều này rất quan trọng trong các ứng dụng hướng đến người dùng vì nó làm giảm độ trễ cảm nhận và cho phép người dùng xem được tiến trình tạo ra.

    

> [!TIP]
> Tìm hiểu thêm về streaming trong tài liệu [Text Generation Inference](https://huggingface.co/docs/text-generation-inference/en/conceptual/streaming).

Tạo một instance của [TextStreamer](/docs/transformers/main/vi/internal/generation_utils#transformers.TextStreamer) với tokenizer. Truyền [TextStreamer](/docs/transformers/main/vi/internal/generation_utils#transformers.TextStreamer) vào tham số `streamer` trong [generate()](/docs/transformers/main/vi/main_classes/text_generation#transformers.GenerationMixin.generate) để stream đầu ra từng từ một.

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

Tham số `streamer` tương thích với bất kỳ lớp nào có phương thức [put()](/docs/transformers/main/vi/internal/generation_utils#transformers.TextStreamer.put) và [end()](/docs/transformers/main/vi/internal/generation_utils#transformers.TextStreamer.end). [put()](/docs/transformers/main/vi/internal/generation_utils#transformers.TextStreamer.put) đẩy các token mới và [end()](/docs/transformers/main/vi/internal/generation_utils#transformers.TextStreamer.end) đánh dấu kết thúc quá trình sinh. Bạn có thể tự tạo lớp streamer của riêng mình miễn là bao gồm hai phương thức này, hoặc sử dụng các lớp streamer cơ bản của Transformers.

## Đóng dấu

Watermarking hữu ích để phát hiện liệu văn bản có được tạo ra hay không. [chiến lược watermarking](https://hf.co/papers/2306.04634) trong Transformers ngẫu nhiên "đánh dấu" một tập con các token bằng màu xanh lá. Khi các token màu xanh lá được tạo ra, một độ lệch nhỏ được thêm vào logits của chúng, làm tăng xác suất để chúng được tạo ra. Bạn có thể phát hiện văn bản được tạo ra bằng cách so sánh tỷ lệ token màu xanh lá với lượng token màu xanh lá thường thấy trong văn bản do con người tạo ra.

Watermarking được hỗ trợ cho bất kỳ mô hình sinh nào trong Transformers và không yêu cầu một mô hình phân loại bổ sung để phát hiện văn bản có watermark.

Tạo một [WatermarkingConfig](/docs/transformers/main/vi/internal/generation_utils#transformers.WatermarkingConfig) với giá trị bias cần thêm vào logits và thuật toán watermarking. Ví dụ bên dưới sử dụng thuật toán `"selfhash"`, trong đó việc chọn token xanh chỉ phụ thuộc vào token hiện tại. Truyền [WatermarkingConfig](/docs/transformers/main/vi/internal/generation_utils#transformers.WatermarkingConfig) vào [generate()](/docs/transformers/main/vi/main_classes/text_generation#transformers.GenerationMixin.generate).

> [!TIP]
> Lớp [WatermarkDetector](/docs/transformers/main/vi/internal/generation_utils#transformers.WatermarkDetector) phát hiện tỷ lệ các token màu xanh lá cây trong văn bản được tạo ra, vì vậy nên loại bỏ văn bản prompt nếu nó dài hơn nhiều so với văn bản được tạo ra. Việc đệm (padding) cũng có thể ảnh hưởng đến [WatermarkDetector](/docs/transformers/main/vi/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)
```

Tạo một instance của [WatermarkDetector](/docs/transformers/main/vi/internal/generation_utils#transformers.WatermarkDetector) và truyền model output vào để phát hiện xem văn bản có được tạo bởi máy hay không. [WatermarkDetector](/docs/transformers/main/vi/internal/generation_utils#transformers.WatermarkDetector) phải có cùng [WatermarkingConfig](/docs/transformers/main/vi/internal/generation_utils#transformers.WatermarkingConfig) đã được sử dụng trong quá trình sinh.

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

