Skip to main content
Open In ColabOpen on GitHub

如何使用少样本示例

前置条件

本指南假设您熟悉以下概念:

在本指南中,我们将学习如何创建一个简单的提示模板,该模板在生成时向模型提供示例输入和输出。向大型语言模型(LLM)提供少量此类示例被称为少样本提示(few-shotting),这是一种简单而强大的方法,可用于引导生成过程,并在某些情况下显著提升模型性能。

少样本提示模板可以从一组示例构建,也可以从负责从定义的集中选择子集的 示例选择器 类构建。

本指南将介绍如何使用字符串提示模板进行少样本学习。关于聊天模型使用聊天消息进行少样本学习的指南,请参见 此处

为少样本示例创建一个格式化器

配置一个格式化器,将少样本示例格式化为字符串。该格式化器应为一个 PromptTemplate 对象。

from langchain_core.prompts import PromptTemplate

example_prompt = PromptTemplate.from_template("Question: {question}\n{answer}")
API 参考:提示模板

创建示例集

接下来,我们将创建一个少样本示例列表。每个示例应是一个字典,代表我们上面定义的格式化器提示的示例输入。

examples = [
{
"question": "Who lived longer, Muhammad Ali or Alan Turing?",
"answer": """
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali
""",
},
{
"question": "When was the founder of craigslist born?",
"answer": """
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952
""",
},
{
"question": "Who was the maternal grandfather of George Washington?",
"answer": """
Are follow up questions needed here: Yes.
Follow up: Who was the mother of George Washington?
Intermediate answer: The mother of George Washington was Mary Ball Washington.
Follow up: Who was the father of Mary Ball Washington?
Intermediate answer: The father of Mary Ball Washington was Joseph Ball.
So the final answer is: Joseph Ball
""",
},
{
"question": "Are both the directors of Jaws and Casino Royale from the same country?",
"answer": """
Are follow up questions needed here: Yes.
Follow up: Who is the director of Jaws?
Intermediate Answer: The director of Jaws is Steven Spielberg.
Follow up: Where is Steven Spielberg from?
Intermediate Answer: The United States.
Follow up: Who is the director of Casino Royale?
Intermediate Answer: The director of Casino Royale is Martin Campbell.
Follow up: Where is Martin Campbell from?
Intermediate Answer: New Zealand.
So the final answer is: No
""",
},
]

让我们用我们的一个示例来测试格式化提示:

print(example_prompt.invoke(examples[0]).to_string())
Question: Who lived longer, Muhammad Ali or Alan Turing?

Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali

将示例和格式化器传递给 FewShotPromptTemplate

最后,创建一个 FewShotPromptTemplate 对象。该对象接收少样本示例及其对应的格式化器。当此 FewShotPromptTemplate 被格式化时,它会使用 example_prompt 对传入的示例进行格式化,然后在 suffix 之前将它们添加到最终提示中:

from langchain_core.prompts import FewShotPromptTemplate

prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Question: {input}",
input_variables=["input"],
)

print(
prompt.invoke({"input": "Who was the father of Mary Ball Washington?"}).to_string()
)
Question: Who lived longer, Muhammad Ali or Alan Turing?

Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali


Question: When was the founder of craigslist born?

Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952


Question: Who was the maternal grandfather of George Washington?

Are follow up questions needed here: Yes.
Follow up: Who was the mother of George Washington?
Intermediate answer: The mother of George Washington was Mary Ball Washington.
Follow up: Who was the father of Mary Ball Washington?
Intermediate answer: The father of Mary Ball Washington was Joseph Ball.
So the final answer is: Joseph Ball


Question: Are both the directors of Jaws and Casino Royale from the same country?

Are follow up questions needed here: Yes.
Follow up: Who is the director of Jaws?
Intermediate Answer: The director of Jaws is Steven Spielberg.
Follow up: Where is Steven Spielberg from?
Intermediate Answer: The United States.
Follow up: Who is the director of Casino Royale?
Intermediate Answer: The director of Casino Royale is Martin Campbell.
Follow up: Where is Martin Campbell from?
Intermediate Answer: New Zealand.
So the final answer is: No


Question: Who was the father of Mary Ball Washington?

通过向模型提供此类示例,我们可以引导模型给出更好的响应。

使用示例选择器

我们将复用上一节中的示例集和格式化器。然而,与直接将示例输入到 FewShotPromptTemplate 对象不同,我们将它们输入到一个名为 SemanticSimilarityExampleSelectorExampleSelector 实现实例中。该类根据示例与输入的相似度,从初始集中选择少样本(few-shot)示例。它使用嵌入模型计算输入与少样本示例之间的相似度,并利用向量存储执行最近邻搜索。

为了展示它的外观,让我们初始化一个实例并单独调用它:

from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings

example_selector = SemanticSimilarityExampleSelector.from_examples(
# This is the list of examples available to select from.
examples,
# This is the embedding class used to produce embeddings which are used to measure semantic similarity.
OpenAIEmbeddings(),
# This is the VectorStore class that is used to store the embeddings and do a similarity search over.
Chroma,
# This is the number of examples to produce.
k=1,
)

# Select the most similar example to the input.
question = "Who was the father of Mary Ball Washington?"
selected_examples = example_selector.select_examples({"question": question})
print(f"Examples most similar to the input: {question}")
for example in selected_examples:
print("\n")
for k, v in example.items():
print(f"{k}: {v}")
Examples most similar to the input: Who was the father of Mary Ball Washington?


answer:
Are follow up questions needed here: Yes.
Follow up: Who was the mother of George Washington?
Intermediate answer: The mother of George Washington was Mary Ball Washington.
Follow up: Who was the father of Mary Ball Washington?
Intermediate answer: The father of Mary Ball Washington was Joseph Ball.
So the final answer is: Joseph Ball

question: Who was the maternal grandfather of George Washington?

现在,让我们创建一个FewShotPromptTemplate对象。该对象接收示例选择器和few-shot示例的格式化提示。

prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
suffix="Question: {input}",
input_variables=["input"],
)

print(
prompt.invoke({"input": "Who was the father of Mary Ball Washington?"}).to_string()
)
Question: Who was the maternal grandfather of George Washington?

Are follow up questions needed here: Yes.
Follow up: Who was the mother of George Washington?
Intermediate answer: The mother of George Washington was Mary Ball Washington.
Follow up: Who was the father of Mary Ball Washington?
Intermediate answer: The father of Mary Ball Washington was Joseph Ball.
So the final answer is: Joseph Ball


Question: Who was the father of Mary Ball Washington?

下一步

您现在已学会如何将少样本示例添加到您的提示中。

接下来,请查看本节中有关提示模板的其他操操作指南、关于使用聊天模型进行少样本学习的相关操操作指南,以及其他示例选择器操操作指南