Skip to main content

聊天模型的少样本示例 Few shot examples for chat models

本笔记本介绍了如何在聊天模型中使用少样本示例。关于如何最好地进行少样本提示,目前似乎没有明确的共识,最佳的提示编译可能因模型而异。因此,我们提供了少样本提示模板,例如FewShotChatMessagePromptTemplate,作为一个灵活的起点,您可以根据需要修改或替换它们。

少样本提示模板的目标是根据输入动态选择示例,然后将示例格式化为最终提示,以供模型使用。

注意:以下代码示例适用于聊天模型。有关完成模型(LLMs)的类似少样本提示示例,请参阅few-shot prompt templates指南。

固定示例

最基本(也是最常见)的几次提示技术是使用固定的提示示例。这样,您可以选择一个链,对其进行评估,并避免担心生产中的其他移动部件。

模板的基本组件包括:

  • examples:包含在最终提示中的字典示例列表。
  • example_prompt:通过其 format_messages 方法将每个示例转换为一个或多个消息。一个常见的示例是将每个示例转换为一个人类消息和一个 AI 消息响应,或者一个人类消息后跟一个函数调用消息。

下面是一个简单的演示。首先,导入此示例的模块:

from langchain.prompts import (  
FewShotChatMessagePromptTemplate,
ChatPromptTemplate,
)

API 参考:

然后,定义您想要包含的示例。

examples = [  
{"input": "2+2", "output": "4"},
{"input": "2+3", "output": "5"},
]

接下来,将它们组装到 few-shot 提示模板中。

# 这是一个用于格式化每个单独示例的提示模板。
example_prompt = ChatPromptTemplate.from_messages(
[
("human", "{input}"),
("ai", "{output}"),
]
)
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples,
)

print(few_shot_prompt.format())
Human: 2+2  
AI: 4
Human: 2+3
AI: 5

最后,组装您的最终提示并将其与模型一起使用。

final_prompt = ChatPromptTemplate.from_messages(  
[
("system", "You are wonderous wizard of math."),
few_shot_prompt,
("human", "{input}"),
]
)

from langchain.chat_models import ChatAnthropic

chain = final_prompt | ChatAnthropic(temperature=0.0)

chain.invoke({"input": "What's the square of a triangle?"})

API 参考:

AIMessage(content=' Triangles do not have a "square". A square refers to a shape with 4 equal sides and 4 right angles. Triangles have 3 sides and 3 angles.\n\nThe area of a triangle can be calculated using the formula:\n\nA = 1/2 * b * h\n\nWhere:\n\nA is the area \nb is the base (the length of one of the sides)\nh is the height (the length from the base to the opposite vertex)\n\nSo the area depends on the specific dimensions of the triangle. There is no single "square of a triangle". The area can vary greatly depending on the base and height measurements.', additional_kwargs={}, example=False)  

动态 Few-shot 提示

有时,您可能希望根据输入条件显示哪些示例。为此,您可以将 examples 替换为 example_selector。其他组件与上述相同!回顾一下,动态 few-shot 提示模板如下:

  • example_selector:负责选择给定输入的 few-shot 示例(以及它们返回的顺序)。这些实现了 BaseExampleSelector 接口。一个常见的示例是基于向量存储的 SemanticSimilarityExampleSelector
  • example_prompt:通过其 format_messages 方法将每个示例转换为一个或多个消息。一个常见的示例是将每个示例转换为一个人类消息和一个 AI 消息响应,或者一个人类消息后跟一个函数调用消息。

这些组件可以再次与其他消息和聊天模板组合起来,以组装您的最终提示。

from langchain.prompts import SemanticSimilarityExampleSelector  
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

API 参考:

由于我们使用向量存储来根据语义相似性选择示例,我们首先需要填充存储。

examples = [  
{"input": "2+2", "output": "4"},
{"input": "2+3", "output": "5"},
{"input": "2+4", "output": "6"},
{"input": "What did the cow say to the moon?", "output": "nothing at all"},
{
"input": "Write me a poem about the moon",
"output": "One for the moon, and one for me, who are we to talk about the moon?",
},
]

to_vectorize = [" ".join(example.values()) for example in examples]
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(to_vectorize, embeddings, metadatas=examples)

创建 example_selector

创建向量存储后,您可以创建 example_selector。在这里,我们将指示它仅获取前两个示例。

example_selector = SemanticSimilarityExampleSelector(  
vectorstore=vectorstore,
k=2,
)

# 提示模板将通过将输入传递给 `select_examples` 方法来加载示例
example_selector.select_examples({"input": "horse"})
[{'input': 'What did the cow say to the moon?', 'output': 'nothing at all'},  
{'input': '2+4', 'output': '6'}]

创建提示模板

使用上面创建的 example_selector 组装提示模板。

from langchain.prompts import (  
FewShotChatMessagePromptTemplate,
ChatPromptTemplate,
)

# 定义 few-shot 提示。
few_shot_prompt = FewShotChatMessagePromptTemplate(
# 输入变量选择要传递给 example_selector 的值
input_variables=["input"],
example_selector=example_selector,
# 定义每个示例的格式。
# 在这种情况下,每个示例将变为 2 条消息:
# 1 条人类消息和 1 条 AI 消息
example_prompt=ChatPromptTemplate.from_messages(
[("human", "{input}"), ("ai", "{output}")]
),
)

API 参考:

下面是一个示例,展示了如何组装它。

print(few_shot_prompt.format(input="What's 3+3?"))  
Human: 2+3  
AI: 5
Human: 2+2
AI: 4

组装最终的提示模板:

final_prompt = ChatPromptTemplate.from_messages(  
[
("system", "You are wonderous wizard of math."),
few_shot_prompt,
("human", "{input}"),
]
)

print(few_shot_prompt.format(input="What's 3+3?"))
Human: 2+3  
AI: 5
Human: 2+2
AI: 4

与 LLM 一起使用

现在,您可以将模型连接到 few-shot 提示。

from langchain.chat_models import ChatAnthropic  

chain = final_prompt | ChatAnthropic(temperature=0.0)

chain.invoke({"input": "What's 3+3?"})

API 参考:

AIMessage(content=' 3 + 3 = 6', additional_kwargs={}, example=False)