Transformers documentation

Возможности генерации

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

Возможности генерации

API generate() поддерживает несколько функций для создания приложений на его основе.

В этом руководстве показано, как использовать эти функции.

Потоковая передача

Потоковая передача начинает возвращать текст сразу по мере его генерации, поэтому вам не нужно ждать, чтобы увидеть весь сгенерированный ответ целиком. Это важно для приложений, ориентированных на пользователя, поскольку снижает воспринимаемую задержку и позволяет видеть процесс генерации в реальном времени.

Подробнее о потоковой передаче см. в документации Text Generation Inference.

Создайте экземпляр TextStreamer с токенизатором. Передайте TextStreamer в параметр streamer в generate(), чтобы выводить результат по одному слову.

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() и end(). Метод put() передаёт новые токены, а end() сигнализирует об окончании генерации. Вы можете создать собственный класс стримера, если он включает эти два метода, либо использовать базовые классы стримеров из Transformers.

Водяные знаки

Водяные знаки полезны для определения, сгенерирован ли текст. Стратегия водяных знаков в Transformers случайно «окрашивает» подмножество токенов в зелёный цвет. Когда генерируются зелёные токены, к их логитам добавляется небольшое смещение, что повышает вероятность их генерации. Сгенерированный текст можно обнаружить, сравнив долю зелёных токенов с типичным количеством зелёных токенов в тексте, созданном человеком.

Водяные знаки поддерживаются для любой генеративной модели в Transformers и не требуют дополнительной модели классификации для обнаружения текста с водяным знаком.

Создайте WatermarkingConfig со значением смещения, которое нужно добавить к логитам, и алгоритмом водяного знака. В примере ниже используется алгоритм "selfhash", при котором выбор «зелёных» токенов зависит только от текущего токена. Передайте WatermarkingConfig в generate().

Класс WatermarkDetector определяет долю зелёных токенов в сгенерированном тексте, поэтому рекомендуется удалять текст промпта, если он значительно длиннее сгенерированного текста. На работу WatermarkDetector также может влиять заполнение (padding).

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 и передайте в него вывод модели, чтобы определить, сгенерирован ли текст машиной. Экземпляр WatermarkDetector должен использовать тот же WatermarkingConfig, что и при генерации.

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])
Update on GitHub