รูปแบบพร้อมใช้สำหรับ Few-shot prompt
การรวมตัวอย่างอินเทอร์แอคทีฟในโปรมป์ช่วยให้โมเดลเข้าใจจุดประสงค์ของผู้ใช้ได้ดียิ่งขึ้น และให้คำตอบหรือทำงานได้ดีขึ้น รูปแบบพร้อมใช้สำหรับ Few-shot prompt หมายถึงการใช้ชุดเล็ก ๆ ของตัวอย่างเพื่อนำทางโมเดลในการจัดการอินพุทเข้าใหม่ ตัวอย่างเหล่านี้สามารถใช้ในการฝึกโมเดลเพื่อให้มันเข้าใจและตอบคำถามที่คล้ายคลึงกันได้ดียิ่งขึ้น
ตัวอย่าง:
Q: แบทแมนคืออะไร?
A: แบทแมนคือตัวละครการ์ตูนจำลอง
Q: ทอร์ซอลเพ็กซิตี้คืออะไร?
A: ไม่รู้
Q: โมเดลภาษาคืออะไร?
A:
แจ้งโมเดลว่า Q คือคำถามและ A คือคำตอบ และทำการแอคทีฟตามรูปแบบนี้
ข้างล่างนี้คือการอธิบายความสามารถของคลาสเครื่องมือที่ Lanchain ให้เกี่ยวกับการแทรกตัวอย่างแอคทีฟจำนวนเล็กในโปรมป์
การใช้เซตตัวอย่าง
สร้างเซ็ตตัวอย่าง
กำหนดอาร์เรย์ examples
ด้านล่างนี้ซึ่งประกอบไปด้วยชุดของตัวอย่าง Q&A
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
examples = [
{
"question": "ความยาวการใช้ชีวิตของมุฮัมมัด อลี หรือ อลัน ทูริงมากกว่ากัน?",
"answer":
"""
ต้องการติดตามคำถาม: ใช่
การติดตาม: มุฮัมมัด อลีตอย่างไรเมื่อเขาเสียชีวิต?
คำตอบระหว่างระหว่าง: มุฮัมมัด อลีมีอายุ 74 เมื่อเขาเสียชีวิต
การติดตาม: อลัน ทูริงมีอายุเท่าไหร่เมื่อเขาเสียชีวิต?
คำตอบระหว่างระหว่าง: อลัน ทูริงมีอายุ 41 เมื่อเขาเสียชีวิต
ดังนั้นคำตอบสุดท้ายคือ: มุฮัมมัด อลี
"""
},
{
"question": "ผู้ก่อต้อง craigslist เกิดเมื่อไหร่?",
"answer":
"""
ต้องการติดตามคำถาม: ใช่
การติดตาม: ผู้ก่อตงคราืว์คือใคร?
คำตอบระหว่างระหว่าง: craigslist ถูกก่อตั้งโดย Craig Newmark
การติดตาม: Craig Newmark เกิดเมื่อไหร่?
คำตอบระหว่างระหว่าง: Craig Newmark เกิดเมื่อ 6 ธันวาคม 1952
ดังนั้นคำตอบสุดท้ายคือ: 6 ธันวาคม 1952
"""
},
{
"question": "มารดาของตาและย่าของจอร์จ วอชิงตันเป็นใคร?",
"answer":
"""
ต้องการติดตามคำถาม: ใช่
การติดตาม: มารดาของจอร์จ วอชิงตันเป็นใคร?
คำตอบระหว่างระหว่าง: มารดาของจอร์จ วอชิงตันคือ Mary Ball Washington.
การติดตาม: พ่อของ Mary Ball Washington เป็นใคร?
คำตอบระหว่างระหว่าง: พ่อของ Mary Ball Washington คือ Joseph Ball.
ดังนั้นคำตอบสุดท้ายคือ: Joseph Ball
"""
},
{
"question": "ผู้กำกับหนัง 'Jaws' และ 'Casino Royale' เรามาจากประเทศเดียวกันหรือไม่?",
"answer":
"""
ต้องการติดตามคำถาม: ใช่
การติดตาม: ผู้กำกับหนัง 'Jaws' คือใคร?
คำตอบระหว่างระหว่าง: ผู้กำกับหนัง 'Jaws' คือ Steven Spielberg.
การติดตาม: Steven Spielberg เรามาจากทำประเทศไหน?
คำตอบระหว่างระหว่าง: สหรัฐอเมริกา.
การติดตาม: ผู้กำกับหนัง 'Casino Royale' คือใคร?
คำตอบระหว่างระหว่าง: ผู้กำกับหนัง 'Casino Royale' คือ Martin Campbell.
การติดตาม: Martin Campbell เรามาจากประเทศไหน?
คำตอบระหว่างระหว่าง: นิวซีแลนด์
ดังนั้นคำตอบสุดท้ายคือ: ไม่
"""
}
]
สร้างฟอร์แมตเตอร์สำหรับตัวอย่างเล็ก ๆ
แค่แทรกตัวอย่างเข้าไปในโปรมป์อย่างง่ายด้วยออบเจ็กต์ PromptTemplate
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="คำถาม: {question}\\n{answer}")
print(example_prompt.format(**examples[0]))
ผลลัพธ์:
คำถาม: ความยาวการใช้ชีวิตของมุฮัมมัด อลี หรือ อลัน ทูริงมากกว่ากัน?
ต้องการติดตามคำถาม: ใช่
การติดตาม: มุฮัมมัด อลีตอย่างไรเมื่อเขาเสียชีวิต?
คำตอบระหว่างระหว่าง: มุฮัมมัด อลีมีอายุ 74 เมื่อเขาเสียชีวิต
การติดตาม: อลัน ทูริงมีอายุเท่าไหร่เมื่อเขาเสียชีวิต?
คำตอบระหว่างระหว่าง: อลัน ทูริงมีอายุ 41 เมื่อเขาเสียชีวิต
ดังนั้นคำตอบสุดท้ายคือ: มุฮัมมัด อลี
การให้ตัวอย่างและการจัดรูปแบบสำหรับ FewShotPromptTemplate
ด้วยอ็อบเจ็กต์ FewShotPromptTemplate
คุณสามารถนำเนื้อหาตัวอย่างเข้าระบบเป็นก้อนทีหนึ่ง
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="คำถาม: {input}",
input_variables=["input"]
)
print(prompt.format(input="ใครเป็นพ่อของจอร์จ วอชิงตัน?"))
ผลลัพธ์:
คำถาม: มีอายุที่ยาวนานกว่ากันร่วมกัน โดยการและอันงาน อลี่ทำเท่าไหร่
ต้องมีการติดตามคำถามนี้หรือไม่: ใช่
การติดตาม: อายุตอนที่อลี่เสียชีวิตคือเท่าไหร่
คำตอบช่วงกลาง: อลี่เสียชีวิตตอนอายุ 74 ปี
การติดตาม: อายุตอนที่อันงานเสียชีวิตคือเท่าไหร่
คำตอบช่วงกลาง: อันงานเสียชีวิตตอนอายุ 41 ปี
ดังนั้นคำตอบสุดท้ายคือ: อลี่
คำถาม: ผู้ก่อตั้งเว็ปไซต์ craigslist เกิดเมื่อไหร่
ต้องมีการติดตามคำถามนี้หรือไม่: ใช่
การติดตาม: ผู้ก่อตั้งเว็ปไซต์ craigslist คือใคร
คำตอบช่วงกลาง: craigslist ถูกก่อตั้งโดย Craig Newmark
การติดตาม: Craig Newmark เกิดเมื่อไหร่
คำตอบช่วงกลาง: Craig Newmark เกิดเมื่อวันที่ 6 ธันวาคม พ.ศ. 2495
ดังนั้นคำตอบสุดท้ายคือ: 6 ธันวาคม พ.ศ. 2495
คำถาม: ใครคือแม่ของปู่ยายของ จอร์จ วอชิงตัน
ต้องมีการติดตามคำถามนี้หรือไม่: ใช่
การติดตาม: ใครคือแม่ของจอร์จ วอชิงตัน
คำตอบช่วงกลาง: แม่ของจอร์จ วอชิงตันคือ Mary Ball Washington
การติดตาม: ใครคือพ่อของ Mary Ball Washington
คำตอบช่วงกลาง: พ่อของ Mary Ball Washington คือ Joseph Ball
ดังนั้นคำตอบสุดท้ายคือ: Joseph Ball
คำถาม: ผู้กำกับภาพยนตร์ "Jaws" และ "Casino Royale" มาจากประเทศเดียวกันหรือไม่
ต้องมีการติดตามคำถามนี้หรือไม่: ใช่
การติดตาม: ผู้กำกับภาพยนตร์ "Jaws" คือใคร
คำตอบช่วงกลาง: ผู้กำกับภาพยนตร์ "Jaws" คือ Steven Spielberg
การติดตาม: Steven Spielberg มาจากประเทศไหน
คำตอบช่วงกลาง: สหรัฐอเมริกา
การติดตาม: ผู้กำกับภาพยนตร์ "Casino Royale" คือใคร
คำตอบช่วงกลาง: ผู้กำกับภาพยนตร์ "Casino Royale" คือ Martin Campbell
การติดตาม: Martin Campbell มาจากประเทศไหน
คำตอบช่วงกลาง: นิวซีแลนด์
ดังนั้นคำตอบสุดท้ายคือ: ไม่
คำถาม: ใครเป็นพ่อของจอร์จ วอชิงตัน?
การใช้ตัวเลือกตัวอย่าง
ระบุตัวอย่างให้กับ ExampleSelector
ที่นี่ เราจะใช้อันดังนี้ตัวอย่างชุดและตัวอย่างโพรมสำหรับส่วนก่อนหน้านี้ อย่างไรก็ตาม แทนที่ระบุตัวอย่างโดยตรงพร้อมกับ FewShotPromptTemplate
อ็อบเจ็กต์และใส่ทุกตัวอย่างลงไปในโพรม จะระบุให้มีอ็อบเจ็กต์ ExampleSelector
เพื่อใส่ส่วนของตัวอย่างลงไป
เราจะใช้คลาส SemanticSimilarityExampleSelector
ที่นี่ คลาสชนิดนี้เลือกตัวอย่างขนาดเล็กขึ้นมาตามความคล้ายคลึงกับอินพุด มันใช้โมเดลการฝังเพื่อคำนวณความคล้ายคลึงระหว่างอินพุดกับตัวอย่างขนาดเล็ก และจากนั้นใช้ฐานข้อมูลเวกเตอร์เพื่อทำการค้นหาความคล้ายคลึงและเรียกคืนตัวอย่างที่คล้ายกับอินพุด
- หมายเหตุ: นี้เกี่ยวข้องกับการคำนวณเวกเตอร์และฐานข้อมูลเวกเตอร์ ซึ่งใช้สำหรับการค้นหาความคล้ายกันของข้อมูลในฟิลด์ศาสตร์มาก ชุดข้อมูลต่างๆ เช่น การค้นหาเนื้อหาบทความที่คล้ายกัน ภาพที่คล้ายกัน วิดีโอ เป็นต้น นี้เพียงเพียงเข้าใจง่าย สำหรับขณะนี้
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
Chroma,
k=1
)
question = "ใครเป็นพ่อของจอร์จ วอชิงตัน?"
selected_examples = example_selector.select_examples({"question": question})
print(f"ตัวอย่างที่คล้ายที่สุด: {question}")
for example in selected_examples:
print("\\n")
for k, v in example.items():
print(f"{k}: {v}")
ที่นี่ ตัวอย่างที่คล้ายกับคำถามจะถูกจับคู่ และนี้คือผลลัพธ์:
Chroma รันโดยตรงโดยใช้ API โลคัล
ตัวอย่างที่คล้ายที่สุด: ใครคือแม่ของปู่ยายของ จอร์จ วอชิงตัน?
คำถาม: ใครคือแม่ของจอร์จ วอชิงตัน
คำตอบ:
ต้องมีการติดตามคำถามนี้หรือไม่: ใช่
การติดตาม: ใครคือแม่ของจอร์จ วอชิงตัน
คำตอบช่วงกลาง: แม่ของจอร์จ วอชิงตันคือ Mary Ball Washington
การติดตาม: ใครคือพ่อของ Mary Ball Washington
คำตอบช่วงกลาง: พ่อของ Mary Ball Washington คือ Joseph Ball
ดังนั้นคำตอบสุดท้ายคือ: Joseph Ball
ระบุตัวเลือกตัวอย่างสำหรับ FewShotPromptTemplate
จากนั้นสร้างวัตถุ FewShotPromptTemplate
โดยใช้ตัวเลือกตัวอย่างจากตัวอย่างก่อนหน้า เลือกตัวอย่างที่คล้ายกับคำถาม
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
suffix="คำถาม: {input}",
input_variables=["input"]
)
print(prompt.format(input="ใครเป็นพ่อของจอร์จ วอชิงตัน?"))
ผลลัพธ์:
คำถาม: ใครเป็นแม่ของปู่ยายของจอร์จ วอชิงตัน?
คำถามเพิ่มเติม: ต้องการที่ต้องติดตามคำถามนี้: ใช่
ติดตาม: ใครเป็นแม่ของจอร์จ วอชิงตัน?
คำตอบชั่วคราว: แม่ของจอร์จ วอชิงตันคือ แมรี่ บอล วอชิงตัน
ติดตาม: ใครเป็นพ่อของแมรี่ บอล วอชิงตัน?
คำตอบชั่วคราว: พ่อของแมรี่ บอล วอชิงตันคือ โจเซฟ บอล
ดังนั้นคำตอบสุดท้ายคือ: โจเซฟ บอล
คำถาม: ใครเป็นพ่อของจอร์จ วอชิงตัน?