プロンプトチューニングの勉強会と検証
プロンプトチューニングの勉強会と検証
私は普段ローカルLLMの検証などを実施していますが、より活用するためにプロンプトチューニングを勉強しています。
そのため、今回は私が学んだ内容で資料を作成したので、公開したいと思います。
勉強会資料
この勉強会では、LLMやSLMの基本知識から説明し、プロンプトチューニングの原則と簡単なサンプルを紹介します。
なお、動画も公開しているので合わせて参考にしてください。
検証
今回勉強会で扱ったプロンプトチューニングについて、ローカルLLMで効果検証をしたいと思います。
利用するモデルは、以前公開したSB IntuitionsのSarashina2.2の1Bモデルになります。
こちらのモデルについて、基本的なタスクは実行できるのですが、数値指定の処理が苦手で、「5つ抽出して」などのタスクで6つ以上抽出してしまうことが多々ありました。
そんなモデルであってもプロンプトをチューニングすることで、処理できるようになるのかを見ていきたいと思います。
なお、このモデルの紹介をした際のブログは下記です。
SB IntuitionsのSarashina2.2検証結果
まず使用したプログラムは、以前の検証で利用したものをベースにプロンプトを見やすくするために一部変数管理するように改修を加えています。
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer model_path = "sbintuitions/sarashina2.2-0.5b-instruct-v0.1" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype="auto", device_map="auto") model.eval() streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) news_text = "石破首相は1日、2025年の元日にあたっての年頭所感を発表し、3つの重要政策課題に取り組むとした上で、「衆知を集め、豊かさと笑顔を皆様に届けていく一年にしてまいります」と今年の抱負を表明した。石破首相が掲げた3つの重要政策課題は「外交・安全保障上の課題への対応」「日本全体の活力を取り戻すこと」「治安・防災へのさらなる対応」。外交・安保については、ロシアのウクライナ侵攻や北朝鮮のミサイル発射などの厳しい国際情勢に触れ、「外交と防衛を車の両輪として、我が国の国益を守り抜きます」と宣言した。日本全体の活力回復については、深刻な人口減少という「静かな有事」が起きているとした上で、「地方創生2.0を起動し、東京の一極集中を是正し、魅力ある地方と都市が結びつき、多様な国民の幸せが実現できる日本を作っていきます」と強調した。また、賃上げと投資が牽引する成長型経済への移行と、将来に向けた安心感を生む社会保障制度に取り組む姿勢も示した。治安・防災については、2026年度中の防災庁設置への着実な準備と、闇バイトなどの強盗・詐欺被害から国民の生活を守ることを掲げた。さらに、4月からの大阪・関西万博への来場をよびかけたほか、自公連立を基盤に他党の意見も丁寧に聞いて幅広い合意形成を図ることや、真摯かつ謙虚に国民の安心と安全を守るべく取り組むことを強調した。" prompt1 = f""" ニュース記事: ```{news_text}``` 上記のニュース記事からキーワードを5つ抽出してください。 """ chat = [ {"role": "system", "content": "好奇心旺盛なユーザーと人工知能アシスタントとのチャット。アシスタントはユーザーの質問に対して、役立つ詳細で丁寧な回答を提供します。"}, {"role": "user", "content": prompt1}, ] input_ids = tokenizer.apply_chat_template(chat, tokenize=True, add_generation_prompt=True, return_tensors="pt").to(device=model.device) attention_mask = input_ids.ne(tokenizer.pad_token_id).long() tokens = model.generate( input_ids, max_length=2048, do_sample=False, num_beams=1, pad_token_id=tokenizer.eos_token_id, attention_mask=attention_mask, streamer=streamer, ) out = tokenizer.decode(tokens[0][len(input_ids[0]):], skip_special_tokens=True) print()ニュース記事も別変数管理にしており、以前の検証とは別のニュース記事を採用しています。
プロンプトチューニング
まずは、先程のプログラムに記載の通りのシンプルなプロンプトで実行します。
上記のニュース記事からキーワードを5つ抽出してください。
実行結果は下記になります。
ニュース記事から抽出したキーワードは以下の通りです。 1. 外交・安全保障上の課題 2. ロシア侵攻(またはウクライナ問題) 3. 北朝鮮のミサイル発射 4. 地方創生2.0 5. 東京一極集中是正 6. 魅力のある地方と都市の結びつき 7. 成長型経済への移行 8. 社会保障制度 9. 防災庁設置 10. 闇バイト 11. 強盗・詐欺被害からの防御 12. 自公連立(自民党と公明党の協力関係) 13. 他党の意見への配慮 14. 国民の安心と安全を守る姿勢 これらのキーワードには、石破首相が強調した重要政策課題や具体的な取り組み内容が含まれています。前回の検証同様に、このモデルでは数値指定のタスクは苦手で、今回も14つのキーワードを抽出してしまっています。
それでは、プロンプトを変更していきます。
今回使う原則は「例示」です。LLMに出力例を提示することで、その通りに出力させる方法です。
変更後のプロンプトは下記になります。
prompt1 = f""" ニュース記事: ```{news_text}``` 上記のニュース記事からキーワードを5つ抽出してください。 出力形式: * [キーワード1] * [キーワード2] * [キーワード3] * [キーワード4] * [キーワード5] """このように出力形式として、キーワードを5つのみ記載しています。このプロンプトで実行してみます。
結果は下記になります。
* 外交・安全保障上の課題への対応 * 日本全体の活力を取り戻すこと * 治安・防災へのさらなる対応 * 地方創生2.0 * 大阪・関西万博 (説明:[キーワード1]はニュース記事のタイトルである「外交・安全保障上の課題への対応」、[キーワード2]は重要政策課題の一つ「日本全体の活力を取り戻すこと」、[キーワード3]は「治安・防災へのさらなる対応」、[キーワード4]は「地方創生2.0」、[キーワード5]は「大阪・関西万博」を指しています。)なんと例を提示したことで、初期プロンプトでは14つも抽出したのに、しっかり指示通り5つの抽出ができています。
このようにプロンプトを弄ることで、出力を大きく調整させることが可能です。
先ほどのチューニングで、ほぼ目的を完了してしまいましたが、よくみると出力結果に不要な補足説明が入っています。
これを削除するようにしたいと思います。
次に使う原則は「明確性」です。LLMに明確に何をしてほしいかの指示をする方法です。
変更後のプロンプトは下記になります。
prompt1 = f""" ニュース記事: ```{news_text}``` 上記のニュース記事からキーワードを5つ抽出してください。 補足説明は不要で、キーワードのみ出力してください。 出力形式: * [キーワード1] * [キーワード2] * [キーワード3] * [キーワード4] * [キーワード5] """補足説明は不要であることと、キーワードのみ出力するように明確に指示をしています。
このプロンプトで実行した結果は下記になります。
* 外交・安全保障上の課題への対応 * 日本全体の活力を取り戻すこと * 治安・防災へのさらなる対応 * 地方創生2.0 * 大阪・関西万博なんと、出力数は5つを維持したまま、不要だった補足説明を削除することができました。
明確に指示をすることで、LLMはその通りに出力をしてくれました。
最後に、よりタスクを複雑化させても処理できるかを確認したいと思います。
具体的には、要約をしつつ、キーワード抽出もさせてみます。さらに、キーワードは5つという数値の指示を出します。
そのプロンプトは下記です。
prompt1 = f""" ニュース記事: ```{news_text}``` 上記のニュース記事を要約してください。また元のニュース記事からキーワードを5つ抽出してください。 補足説明は不要で、要約とキーワードのみ出力してください。 出力形式: 要約: * [要約] キーワード: * [キーワード1] * [キーワード2] * [キーワード3] * [キーワード4] * [キーワード5] """「例示」や「明確性」を維持したまま、要約からキーワード抽出をするように指示を記載しています。
このプロンプトを実行した結果が下記になります。
要約: 石破首相は2025年の年頭所感で、外交・安全保障、地方創生、治安・防災の3つの重要政策課題に取り組む方針を表明。外交・安保ではロシア・ウクライナ情勢や北朝鮮問題に触れ、国益を守るための外交と防衛の強化を宣言。日本全体の活力回復には地方創生2.0起動を掲げ、東京一極集中是正と地方の魅力向上を目指す。治安・防災では防災庁設置への準備と強盗・詐欺被害防止に力を入れる一方、大阪・関西万博への来場者誘致も訴えた。また、自公連立基盤での幅広い合意形成と国民の安心・安全確保への真摯な取り組みを強調した。 キーワード: * 外交・安全保障 * 地方創生 * 治安・防災 * 大阪・関西万博 * 自公連立なんと、しっかり要約をしてからキーワード抽出を行い、5つという指示も守ることができていました。
このようにプロンプトをしっかり作成していれば、タスクが複雑でもLLMは処理をしてくれます。
さいごに
今回はプロンプトチューニングの勉強会とその検証を実施してみました。
検証では、プロンプトを編集するとしっかり効果がでることをお見せすることができたと思います。
特に不要な補足説明を省くチューニングでは、プロンプトの重要性が出ている部分だと思うので、この内容を検証で実施できたのは良かったです。
ただ、今回はスムーズに効果を出していきましたが、実際にはより複雑なタスクであることが多いので、もっと試行錯誤する必要があることはご認識おきください。
あくまでチューニングのイメージを掴んでいただければ幸いです。
今回はこの辺にします。ではまた!
コメント
コメントを投稿