2023-02-06
HuggingfaceのpipelineでTextGenerationPipelineとText2TextGenerationPipelineがあるが、 何が違うのかよくわからなかったので軽く調査。
https://huggingface.co/docs/transformers/main_classes/pipelines#transformers.TextGenerationPipeline
exampleを見ると、text-generationは与えた文章に続く文章を生成、 text2text-generationは質問や文脈を与えて、それに対する回答を生成することを期待している。
## text-generation
>> generator("I can't believe you did such a ", do_sample=False)
## text2text-generation
>> generator(
"answer: Manuel context: Manuel has created RuPERTa-base with the support of HF-Transformers and >> Google"
)
比較
genereate時、preprocess -> _forward -> postprocess
の順で動く
それぞれ__call__
の引数の被ってないものをみると以下のような感じ
text_generation
- prefix
- handle_long_generation
- return_full_text
text2text_generation
- truncation
preprocessを見ると、入力文章が長すぎる場合
- text2text_generation: 引数によってtokenize時にtruncate
- text_generation: errorをthrow
postprocessを見ると、返す文章は
- text2text_generation: 質疑応答のようなタスクに対する回答のみを返す。
- text_generation: return_full_textで指定できるように、与えた文章を除き生成した文章のみを返すようなことができる。
まとめ
exampleの通り、text_generationは不完全な文章からそれに続くある程度長い文章を文章を生成することを期待している。 text2text_generationは、truncateできることから長い文章の生成というより、タスクに対する回答を重視しているように見える。
kwargsでgenerateに対して引数を渡せるので、ここからも調整できる。