今天要介紹的Few-shot Prompting,簡單來說,就是在提問前,先給AI幾個範例,讓它有個參考模式可以模仿。這樣它就比較能按照我們預期的格式來生成。
實際操作
這次我在 Prompt 裡先放入一首詩和一段新聞作為範例,然後再請模型分別生成新的詩和新聞。
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
model_id = "Qwen/Qwen2-1.5B-Instruct"
tok = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype="auto", trust_remote_code=True)
pipe = pipeline("text-generation", model=model, tokenizer=tok)
# Few-shot Prompting:詩歌
prompt_poem = """請模仿以下格式生成詩。
範例詩歌:
人工智慧如晨曦,
照亮人類新旅程。
科技織出未來夢,
機器與心共前行。
現在請寫一首新的現代中文詩,
主題:人工智慧,
格式:四行,每行不超過12字,避免重複詞。
"""
resp_poem = pipe(prompt_poem, max_new_tokens=120, do_sample=True,
temperature=0.7, top_p=0.9,
repetition_penalty=1.1, no_repeat_ngram_size=4)[0]["generated_text"]
print("生成詩歌:\n", resp_poem, "\n")
# Few-shot Prompting:新聞
prompt_news = """請模仿以下格式生成新聞。
範例新聞:
根據最新研究,人工智慧正在改變醫療產業。
專家指出,AI已能協助醫師分析病患影像。
政府宣布投入更多資源,加速AI臨床應用。
現在請寫一段新的新聞報導,
主題:人工智慧在醫療的應用,
格式:三句話,避免詩句與贅詞。
"""
resp_news = pipe(prompt_news, max_new_tokens=120, do_sample=True,
temperature=0.7, top_p=0.9)[0]["generated_text"]
print("生成新聞:\n", resp_news)
詩歌得出的結果:
新聞得出的結果:
可以看到,和昨天的結果相比,這次的輸出明顯收斂很多。詩歌的格式乾淨、新聞的語氣也符合報導風格。這就是Few-shot Prompting的威力:只要先給AI參考範例,它就比較知道該模仿的模式。
不過要注意,這個結果也是建立在使用合適的模型(Qwen Instruct)之上。單靠Few-shot雖然能拉一把一些相當舊的模型(GPT-2),但模型本身的理解力仍然很重要。