รูปแบบพร้อมใช้สำหรับ 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="ใครเป็นพ่อของจอร์จ วอชิงตัน?"))

ผลลัพธ์:

คำถาม: ใครเป็นแม่ของปู่ยายของจอร์จ วอชิงตัน?

คำถามเพิ่มเติม: ต้องการที่ต้องติดตามคำถามนี้: ใช่
ติดตาม: ใครเป็นแม่ของจอร์จ วอชิงตัน?
คำตอบชั่วคราว: แม่ของจอร์จ วอชิงตันคือ แมรี่ บอล วอชิงตัน
ติดตาม: ใครเป็นพ่อของแมรี่ บอล วอชิงตัน?
คำตอบชั่วคราว: พ่อของแมรี่ บอล วอชิงตันคือ โจเซฟ บอล
ดังนั้นคำตอบสุดท้ายคือ: โจเซฟ บอล

คำถาม: ใครเป็นพ่อของจอร์จ วอชิงตัน?