🀗 Transformersにおいお制玄付きビヌムサヌチを甚いたテキスト生成のガむド

'🀗 Transformersの制玄付きビヌムサヌチガむド'

むントロダクション

このブログ投皿では、トランスフォヌマヌを䜿甚した蚀語生成のための異なるデコヌディング方法に぀いお説明したブログ投皿「テキスト生成方法: トランスフォヌマヌを䜿甚した異なるデコヌディング方法」で説明されおいるように、読者がビヌムサヌチの異なるバリアントを䜿甚したテキスト生成方法に粟通しおいるこずを前提ずしおいたす。

通垞のビヌムサヌチずは異なり、制玄付きビヌムサヌチではテキスト生成の出力に察しお制埡を行うこずができたす。これは、出力内に正確に䜕を含めたいかを知っおいる堎合に圹立ちたす。たずえば、ニュヌラル機械翻蚳のタスクでは、蟞曞怜玢を䜿甚しお最終的な翻蚳に含たれる必芁がある単語を知っおいるかもしれたせん。蚀語モデルにずっおほが同じくらい可胜性がある生成出力でも、特定の文脈においお゚ンドナヌザヌにずっおは同じくらい望たしくない堎合がありたす。これらの状況は、ナヌザヌがモデルに最終出力に含たれる必芁のある単語を指瀺するこずで解決できたす。

なぜ難しいのか

しかし、これは非垞に非自明な問題です。これは、生成されたテキストの最終出力のどこかで、特定の郚分文字列の生成を匷制する必芁があるからです。

䟋えば、トヌクン t 1 , t 2 t_1, t_2 t 1 ​ , t 2 ​ を順番に含む文 S を生成したいずしたす。予枬される文 S は次のように定矩されたす

S e x p e c t e d = { s 1 , s 2 , . . . , s k , t 1 , t 2 , s k + 1 , . . . , s n } S_{expected} = \{ s_1, s_2, …, s_k, t_1, t_2, s_{k+1}, …, s_n \} S e x p e c t e d ​ = { s 1 ​ , s 2 ​ , . . . , s k ​ , t 1 ​ , t 2 ​ , s k + 1 ​ , . . . , s n ​ }

問題は、ビヌムサヌチがトヌクンを1぀ず぀生成するこずです。ビヌムサヌチを関数 B ( s 0 : i ) = s i + 1 B(\mathbf{s}_{0:i}) = s_{i+1} B ( s 0 : i ​ ) = s i + 1 ​ ず考えるこずができたす。この関数は、珟圚生成されおいるトヌクンのシヌケンス s 0 : i s_{0:i} s 0 : i ​ 0 0 0 から i i i たでを芋お、次のトヌクンを i + 1 i+1 i + 1 で予枬したす。しかし、任意のステップ i < k i < k i < k で、この関数がトヌクンが将来のステップ k k k で生成される必芁があるこずをどのように知るこずができたすかたた、ステップ i = k i=k i = k の堎合、これがトヌクンを匷制するのに最適な堎所であり、将来のステップ i > k i>k i > k ではないこずを確実に知るこずができたすか

さらに、異なる芁件を持぀耇数の制玄がある堎合はどうなりたすかフレヌズ p 1 = { t 1 , t 2 } p_1=\{ t_1, t_2 \} p 1 ​ = { t 1 ​ , t 2 ​ } ずフレヌズ p 2 = { t 3 , t 4 , t 5 , t 6 } p_2=\{ t_3, t_4, t_5, t_6\} p 2 ​ = { t 3 ​ , t 4 ​ , t 5 ​ , t 6 ​ } を匷制したい堎合はどうなりたすか2぀のフレヌズの間で遞択させたい堎合はどうなりたすかフレヌズ p 1 p_1 p 1 ​ を匷制し、フレヌズのリスト { p 21 , p 22 , p 23 } \{p_{21}, p_{22}, p_{23}\} { p 2 1 ​ , p 2 2 ​ , p 2 3 ​ } の䞭から1぀のフレヌズを匷制したい堎合はどうなりたすか

䞊蚘の䟋は実際に非垞に合理的なナヌスケヌスです。以䞋で瀺されるように、新しい制玄付きビヌムサヌチ機胜では、これらすべおが可胜になりたす

この投皿では、新しい制玄付きビヌムサヌチ機胜があなたに䜕ができるかを簡単に説明し、その仕組みに぀いおより詳现に説明したす。

䟋1単語を匷制する

「How old are you?」をドむツ語に翻蚳しようずしおいるずしたす。

非公匏な堎面では「Wie alt bist du?」ず蚀いたすが、公匏な堎面では「Wie alt sind Sie?」ず蚀いたす。

そしお、文脈によっおは、䞀方の圢匏の方が他方よりも奜たしい堎合がありたすが、モデルにそれを䌝えるにはどうすればよいでしょうか

以䞋は、埓来のビヌムサヌチ蚭定でのテキスト翻蚳の方法です。

!pip install -q git+https://github.com/huggingface/transformers.git

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")

encoder_input_str = "translate English to German: How old are you?"

input_ids = tokenizer(encoder_input_str, return_tensors="pt").input_ids

outputs = model.generate(
    input_ids,
    num_beams=10,
    num_return_sequences=1,
    no_repeat_ngram_size=1,
    remove_invalid_values=True,
)

print("Output:\n" + 100 * '-')
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

Output:
----------------------------------------------------------------------------------------------------
Wie alt bist du?

しかし、非公匏なものではなく公匏な出力を望むずわかっおいる堎合はどうでしょうか以前は、いく぀かの可胜な出力を生成し、芁件に合うものをフィルタリングする必芁がありたした。しかし、今では生成ステヌゞでそれを行うこずができたす。

model.generate() の force_words_ids キヌワヌド匕数を䜿甚するず、次のようなこずが可胜です

tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")

encoder_input_str = "translate English to German: How old are you?"

force_words = ["Sie"]

input_ids = tokenizer(encoder_input_str, return_tensors="pt").input_ids
force_words_ids = tokenizer(force_words, add_special_tokens=False).input_ids

outputs = model.generate(
    input_ids,
    force_words_ids=force_words_ids,
    num_beams=5,
    num_return_sequences=1,
    no_repeat_ngram_size=1,
    remove_invalid_values=True,
)


print("Output:\n" + 100 * '-')
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

Output:
----------------------------------------------------------------------------------------------------
Wie alt sind Sie?

ご芧のように、望たしい出力に関する事前知識を䜿甚しお生成を誘導するこずができたした。以前は、可胜な出力を生成し、その埌、芁件に合うものをフィルタリングする必芁がありたした。しかし、今では生成ステヌゞでそれを行うこずができたす。

䟋2遞択制玄

前述のように、最終的な出力に含たれおほしい単語を事前に知っおいるナヌスケヌスを挙げたした。これは、ニュヌラル機械翻蚳䞭に蟞曞怜玢を䜿甚する堎合の䟋です。

しかし、出力に䜿甚する単語圢匏を知らない堎合、䟋えば ["raining", "rained", "rains", ...] のような出力が同じくらい可胜である堎合はどうでしょうか䞀般的には、文字通りの単語だけでなく、関連する他の可胜性も考慮する堎合がありたす。

このような振る舞いを蚱可する制玄は、遞択制玄 です。ナヌザヌは、生成の際に最終的な出力に含たれる必芁がある単語のリストを入力するこずができたす。

以䞋は、䞊蚘の2぀の制玄タむプを組み合わせた䟋です

from transformers import GPT2LMHeadModel, GPT2Tokenizer

model = GPT2LMHeadModel.from_pretrained("gpt2")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")

force_word = "scared"
force_flexible = ["scream", "screams", "screaming", "screamed"]

force_words_ids = [
    tokenizer([force_word], add_prefix_space=True, add_special_tokens=False).input_ids,
    tokenizer(force_flexible, add_prefix_space=True, add_special_tokens=False).input_ids,
]

starting_text = ["The soldiers", "The child"]

input_ids = tokenizer(starting_text, return_tensors="pt").input_ids

outputs = model.generate(
    input_ids,
    force_words_ids=force_words_ids,
    num_beams=10,
    num_return_sequences=1,
    no_repeat_ngram_size=1,
    remove_invalid_values=True,
)


print("Output:\n" + 100 * '-')
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
print(tokenizer.decode(outputs[1], skip_special_tokens=True))

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


Output:
----------------------------------------------------------------------------------------------------
The soldiers, who were all scared and screaming at each other as they tried to get out of the
The child was taken to a local hospital where she screamed and scared for her life, police said.

ご芧の通り、最初の出力では"screaming"が䜿甚され、2番目の出力では"screamed"が䜿甚され、䞡方の出力で"scared"がそのたた䜿甚されおいたす。遞択リスト["screaming", "screamed", ...]は単語圢匏である必芁はありたせん。このリストは、単にリストから1぀だけ必芁な堎合に䜿甚できたす。

埓来のビヌムサヌチ

以䞋は、以前のブログ蚘事から匕甚した埓来のビヌムサヌチの䟋です。

グリヌディサヌチずは異なり、ビヌムサヌチはより長い仮説のリストを保持するこずによっお機胜したす。䞊蚘の画像では、各ステップで生成可胜な次のトヌクンを3぀衚瀺しおいたす。

以䞋の䟋では、num_beams=3の堎合のビヌムサヌチの最初のステップを別の芖点から芋おみたしょう。

貪欲な怜玢が行うように"The dog"のみを遞択するのではなく、ビヌムサヌチでは"The nice"ず"The car"の考慮も蚱容されたす。

次のステップでは、前のステップで䜜成した3぀の枝それぞれに察しお次の可胜なトヌクンを考慮したす。

num_beams以䞊の出力を考慮するこずになりたすが、ステップの最埌にそれらをnum_beamsに枛らしたす。無制限に枝分かれし続けるこずはできたせん。枝分かれするたびに远跡する必芁のあるbeamsの数は、非垞に早く非垞に倧きくなりたす10ステップ埌には10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000の10,000,000,000

銀行は、制玄を満たすこずず合理的な出力を䜜成するこずのバランスを䜜り出すこずで、この問題を解決したす。

銀行 n n n は、制玄を満たすために n n n ステップ進んだビヌムのリストを指したす。すべおの可胜なビヌムを各銀行に分類した埌、ラりンドロビン遞択を行いたす。䞊蚘の䟋では、Bank 2 から最も確率の高い出力、次に Bank 1 から最も確率の高い出力、Bank 0 から 1 ぀、Bank 2 から 2 番目に確率の高い出力、Bank 1 から 2 番目に確率の高い出力、ずいうように遞択したす。 num_beams=3 を䜿甚しおいるため、䞊蚘のプロセスを 3 回繰り返すこずで、["The is fast", "The dog is", "The dog and"] になりたす。

このように、手動で望たしいトヌクンを远加した枝を考慮するようにモデルに匷制する䞀方で、より意味のあるシヌケンスを远跡するこずができたす。 "The is fast" は制玄を完党に満たしおいたすが、非垞に意味のあるフレヌズではありたせん。幞いにも、未来のステップで䜜業するために "The dog is" ず "The dog and" を䜿甚できたす。これにより、埌の段階でより意味のある出力に぀ながるこずを期埅しおいたす。

この動䜜は、䞊蚘の䟋の第 3 ステップで瀺されおいたす:

"The is fast" は手動で制玄トヌクンを远加する必芁がないため、既に満たされおいるこずに泚意しおください぀たり、フレヌズ "is fast" を含んでいたす。たた、"The dog is slow" や "The dog is mad" のようなビヌムは、実際には Bank 0 にありたす。なぜなら、トヌクン "is" を含んでいるにもかかわらず、"is fast" を生成するために最初からやり盎す必芁があるからです。 "is" の埌に "slow" のようなものを远加するこずで、効果的に進捗がリセットされたす。

そしお最埌に、制玄フレヌズを含む意味のある出力にたどり着いたこずに泚意しおください: "The dog is fast" です。

最初は "The is fast" のような意味のないフレヌズが埗られる可胜性があるため、心配しおいたした。しかし、銀行からのラりンドロビン遞択を䜿甚するこずで、より意味のある出力を優先するために意味のない出力を暗黙的に取り陀くこずができたした。

Constraint クラスずカスタム制玄に぀いおの詳现

説明から埗られる䞻なポむントは次のように芁玄するこずができたす。各ステップで、制玄を満たすトヌクンを考慮するようにモデルに芁求し続けながら、芁求を満たさないビヌムを远跡し、最終的に望たしいフレヌズを含む比范的高い確率のシヌケンスに到達したす。

したがっお、この実装を蚭蚈するための原則的な方法は、各制玄を Constraint オブゞェクトずしお衚珟し、その進捗を远跡し、ビヌムサヌチに次に生成するトヌクンを䌝えるこずでした。 model.generate() のキヌワヌド匕数 force_words_ids を提䟛しおいたすが、バック゚ンドで実際に行われるこずは次のずおりです:

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, PhrasalConstraint

tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")

encoder_input_str = "translate English to German: How old are you?"

constraints = [
    PhrasalConstraint(
        tokenizer("Sie", add_special_tokens=False).input_ids
    )
]

input_ids = tokenizer(encoder_input_str, return_tensors="pt").input_ids


outputs = model.generate(
    input_ids,
    constraints=constraints,
    num_beams=10,
    num_return_sequences=1,
    no_repeat_ngram_size=1,
    remove_invalid_values=True,
)


print("Output:\n" + 100 * '-')
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

Output:
----------------------------------------------------------------------------------------------------
Wie alt sind Sie?

自分で定矩しおナニヌクな制玄を蚭蚈するために、constraints キヌワヌド匕数にそれを入力するこずができたす。 Constraint の抜象むンタヌフェヌスクラスのサブクラスを䜜成し、その芁件に埓っおください。 Constraint の定矩に関する詳现な情報は、こちらで芋぀けるこずができたす。

䞀郚未実装のナニヌクなアむデアお詊しいただけるかもしれたせんには、OrderedConstraints、TemplateConstraintsなどの制玄が远加される可胜性がありたす。珟圚、生成は出力のどこにでもシヌケンスを含めるこずで実珟されおいたす。䟋えば、以前の䟋では、scared -> screamingの1぀のシヌケンスず、screamed -> scaredのもう1぀のシヌケンスがありたした。 OrderedConstraintsでは、これらの制玄が実珟される順序をナヌザヌが指定するこずができたす。

TemplateConstraintsでは、よりニッチな䜿い方が可胜で、目的は次のようなものになりたす:

starting_text = "The woman"
template = ["the", "", "School of", "", "in"]

possible_outputs == [
   "The woman attended the Ross School of Business in Michigan.",
   "The woman was the administrator for the Harvard School of Business in MA."
]

たたは:

starting_text = "The woman"
template = ["the", "", "", "University", "", "in"]

possible_outputs == [
   "The woman attended the Carnegie Mellon University in Pittsburgh.",
]
impossible_outputs == [
  "The woman attended the Harvard University in MA."
]

もしくは、ナヌザヌが2぀の単語の間に挿入できるトヌクンの数に関心を持たない堎合、OrderedConstraintを䜿甚するこずができたす。

結論

制玄付きビヌムサヌチは、テキスト生成に倖郚の知識や芁件を柔軟に泚入する手段を提䟛したす。以前は、モデルに察しお以䞋の指瀺を簡単に䌝える方法がありたせんでした1. シヌケンスのリストを含めるこず、2. そのうちのいく぀かはオプションであり、いく぀かは必須であり、3. それらがシヌケンス内の適切な䜍眮に生成されるようにするこず。今では、Constraintオブゞェクトのさたざたなサブクラスの組み合わせで、生成に完党な制埡が可胜です

この新機胜は、䞻に以䞋の論文に基づいおいたす

  • Guided Open Vocabulary Image Captioning with Constrained Beam Search
  • Fast Lexically Constrained Decoding with Dynamic Beam Allocation for Neural Machine Translation
  • Improved Lexically Constrained Decoding for Translation and Monolingual Rewriting
  • Guided Generation of Cause and Effect

䞊蚘のように、倚くの新しい研究論文では、倖郚の知識䟋KG、KBを䜿甚しお倧芏暡な深局孊習モデルの出力を誘導する方法を探玢しおいたす。この制玄付きビヌムサヌチ機胜がこの目的を達成するためのもう䞀぀の効果的な手段ずなるこずを願っおいたす。

この機胜の貢献にガむダンスを提䟛しおくれたすべおの方々に感謝したす初期の問題から最終PRたで関䞎しおくれたPatrick von Platen氏、およびコヌドに察する詳现なフィヌドバックを提䟛しおくれたNarsil Patry氏。

この投皿のサムネむルは、以䞋の属性を持぀アむコンを䜿甚しおいたすShorthand icons created by Freepik – Flaticon

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知胜

「リオヌル・ハキム、Hour Oneの共同創蚭者兌CTO - むンタビュヌシリヌズ」

「Hour Oneの共同創蚭者兌最高技術責任者であるリオヌル・ハキムは、専門的なビデオコミュニケヌションのためのバヌチャルヒ...

人工知胜

゚ンテラ゜リュヌションズの創蚭者兌CEO、スティヌブン・デアンゞェリス- むンタビュヌシリヌズ

スティヌブン・デアンゞェリスは、゚ンタラ゜リュヌションズの創蚭者兌CEOであり、自埋的な意思決定科孊ADS®技術を甚いお...

人工知胜

「ゞャスティン・マクギル、Content at Scaleの創蚭者兌CEO - むンタビュヌシリヌズ」

ゞャスティンは2008幎以来、起業家、むノベヌタヌ、マヌケタヌずしお掻動しおいたす圌は15幎以䞊にわたりSEOマヌケティングを...

デヌタサむ゚ンス

「Adam Ross Nelsonによる自信のあるデヌタサむ゚ンスに぀いお」

デヌタサむ゚ンスの䞭で新たな分野が珟れ、研究内容が理解しにくい堎合は、専門家や先駆者ず話すのが最善です最近、私たちは...

人工知胜

「クリス・サレンス氏、CentralReachのCEO - むンタビュヌシリヌズ」

クリス・サレンズはCentralReachの最高経営責任者であり、同瀟を率いお、自閉症や関連する障害を持぀人々のために優れたクラ...

人工知胜

ギル・ゞェロン、Orca SecurityのCEO共同創蚭者-むンタビュヌシリヌズ

ギル・ゲロンは、オルカ・セキュリティのCEO兌共同蚭立者ですギルは20幎以䞊にわたりサむバヌセキュリティ補品をリヌドし、提...