생성 기능
생성 기능 (Generation features)
generate() API는 위에 애플리케이션을 구축하기 위한 몇 가지 기능을 지원해요.
이 가이드에서는 이러한 기능을 사용하는 방법을 보여줄게요.
출처: 문서
본문
스트리밍 (Streaming)
스트리밍은 텍스트가 생성되는 즉시 텍스트를 반환하기 시작해서, 생성된 전체 응답을 한 번에 볼 때까지 기다릴 필요가 없어요. 이는 인지된 지연 시간(latency)을 줄여주고 사용자가 생성 진행 상황을 볼 수 있게 해주기 때문에 사용자 대면 애플리케이션에서 중요해요.
[!TIP] 스트리밍에 대한 더 자세한 내용은 Text Generation Inference 문서를 참고하세요.
tokenizer로 TextStreamer 인스턴스를 만들어요. generate()의 streamer 파라미터에 TextStreamer를 전달하면 출력을 한 단어씩 스트리밍해요.
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()는 생성의 끝을 표시해요. 이 두 메서드를 포함하기만 하면 직접 만든 streamer 클래스를 사용할 수도 있고, Transformers의 기본 streamer 클래스를 사용할 수도 있어요.
워터마킹 (Watermarking)
워터마킹은 텍스트가 생성된 것인지 감지하는 데 유용해요. Transformers의 워터마킹 전략은 토큰의 일부를 무작위로 "초록색(green)"으로 색칠해요. 초록색 토큰이 생성되면 로짓에 작은 바이어스가 더해져서 생성될 확률이 더 높아져요. 초록색 토큰의 비율을 인간이 생성한 텍스트에서 보통 발견되는 초록색 토큰의 양과 비교하면 생성된 텍스트를 감지할 수 있어요.
워터마킹은 Transformers의 모든 생성 모델에서 지원되며, 워터마크된 텍스트를 감지하기 위한 추가 분류 모델이 필요하지 않아요.
로짓에 더할 바이어스 값과 워터마킹 알고리즘으로 WatermarkingConfig를 만들어요. 아래 예시는 초록색 토큰 선택이 현재 토큰에만 의존하는 "selfhash" 알고리즘을 사용해요. WatermarkingConfig를 generate()에 전달해요.
[!TIP] WatermarkDetector 클래스는 생성된 텍스트에서 초록색 토큰의 비율을 감지합니다. 그래서 프롬프트 텍스트가 생성된 텍스트보다 훨씬 길다면 프롬프트 텍스트를 제거하는 것이 권장됩니다. 패딩도 WatermarkDetector에 영향을 줄 수 있습니다.
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])
더 알아보기 (Learn more)
- Text Generation Inference 문서에서 스트리밍에 대해 더 자세히 알아보세요.
- Watermarking 논문에서 워터마킹 방법에 대해 더 자세히 알아보세요.