文章目录
提示词中包含交互样本的作用是为了帮助模型更好地理解用户的意图,从而更好地回答问题或执行任务。
小样本提示模板是指使用一组少量的示例来指导模型处理新的输入。 这些示例可以用来训练模型,以便模型可以更好地理解和回答类似问题。
本章所有的大语言模型采用 deepseek-r1:7b
from langchain_ollama import ChatOllama
llm = ChatOllama(
model="deepseek-r1:7b",
)
一、提示词追加示例 FewShotPromptTemplate
下面定义一个examples示例数组,里面包含一组问答样例。
将examples都丢给大模型,大模型会参考examples内容,进行分析。有点像RAG。
相当于提前准备好一个知识库,llm根据知识库来做一些归纳总结。
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
examples = [
{
"question": "穆罕默德·阿里和艾伦·图灵谁的寿命更长?",
"answer": """
这里需要跟进问题吗?是的
跟进: 穆罕默德·阿里去世时多大?
中间答案: 穆罕默德·阿里去世时74岁
跟进: 艾伦·图灵去世时多大?
中间答案: 艾伦·图灵去世时41岁
最终答案: 穆罕默德·阿里
"""
},
{
"question": "《大白鲨》和《007:皇家赌场》的导演都来自同一个国家吗?",
"answer": """
这里需要跟进问题吗?是的
跟进: 《大白鲨》的导演是谁?
中间答案: 《大白鲨》的导演是Steven Spielberg
跟进: Steven Spielberg来自哪里?
中间答案: 美国
跟进: 《007:皇家赌场》的导演是谁?
中间答案: 007:皇家赌场》的导演是Martin Campbell
跟进: Martin Campbell来自哪里?
中间答案: 新西兰
最终答案: 不是
"""
}
]
example_template = """
问题:{question}
{answer} \\n
"""
# 实例化 PromptTemplate 模板
example_template = PromptTemplate(input_variables=["question","answer"], # 包含模板中的所有变量
template=example_template) # 表示提示模板的字符串,待填充的变量位置
# example_template.format(**examples[0])
prompt = FewShotPromptTemplate(
examples=examples, # 多个示例,一般是一个字典
prefix="问答题", ## 示例之前要添加的文本
example_prompt=example_template, # 对象,为示例的格式
suffix="问题:{input}", # 示例之后要添加的文本
input_variables=["input"],
example_separator="\\n" # 用于分割多个示例
)
message = prompt.format(input="《大白鲨》的导演是谁")
print(prompt.format(input="《大白鲨》的导演是谁")) #将输入格式对象格式化为字符串提示
print(llm.invoke(message).content)
二、使用示例选择器 example_selector
将示例提供给ExampleSelector
这里将前一部分的示例集和提示词模板,但是不会将示例直接提供给FewShotPromptTemplate对象,
把全部示例插入到提示词中,而是将他们提供给一个ExampleSelector对象,插入部分示例
这里我们使用SemanticSimilarityExampleSelector类,该类根据与输入的相似性选择小样本示例。
它使用嵌入模型计算输入与小样本示例之间的相似性,然后使用向量数据库执行相似度搜索。
- 提示:这里涉及向量计算、向量数据库,在AI领域这两个主要用于数据相似度搜索,列入查询相似文章内容、相似图片、视频等。
from langchain_ollama import OllamaEmbeddings
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector #使用语义相似性实力选择器
from langchain_community.vectorstores import Chroma
deepseek_embedding = OllamaEmbeddings(
model="deepseek-r1:7b",
)
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples, # 提供可选择的示例列表
deepseek_embedding, # 用于生成嵌入的嵌入类
Chroma, # 用于存储嵌入和执行相似性搜索的VectorStore类
k=1, # 这是生成的示例数
)
dynamic_prompt = FewShotPromptTemplate(
example_selector=example_selector,
prefix="问答题", ## 示例之前要添加的文本
example_prompt=example_template, # 对象,为示例的格式
suffix="问题:{input}", # 示例之后要添加的文本
input_variables=["input"],
example_separator="\\n" # 用于分割多个示例
)
message = prompt.format(input="《大白鲨》的导演是谁") # 最后生成的模板就包含跟问题相关的示例
print(prompt.format(input="《大白鲨》的导演是谁")) #将输入格式对象格式化为字符串提示
print(llm.invoke(message).content)
三、关键类介绍
3.1 PromptTemplate
是 LangChain 中用于创建动态提示的核心类,它允许用户定义一个包含变量的模板字符串,并通过输入变量生成具体的提示内容
PromptTemplate
的主要功能是将模板字符串和输入变量结合,生成用于语言模型的提示。它支持动态填充变量,使得提示可以根据不同的输入生成不同的内容
主要属性
- input_variables:一个字符串列表,指定模板中需要动态填充的变量名称
- template:模板字符串,其中可以包含占位符(如 {variable_name}),用于动态替换
主要方法
- format():根据输入变量的值,将模板字符串中的占位符替换为实际值,生成最终的提示内容。
- from_template():类方法,通过模板字符串直接创建 PromptTemplate 实例,LangChain 会自动推断 input_variables。
3.2 FewShotPromptTemplate
是 LangChain 中用于构建带有少量示例(Few-shot examples)的提示模板的类。它通过向语言模型提供一些示例输入和对应的输出,帮助模型更好地理解任务要求,从而生成更准确的响应。
主要功能是将少量示例与用户输入结合,生成一个完整的提示,供语言模型使用。这些示例作为上下文信息,帮助模型理解任务的模式和要求。
主要属性
- examples:一个包含示例的列表,每个示例是一个字典,包含输入和输出。
- example_prompt:一个 PromptTemplate 对象,用于格式化每个示例。
- prefix:在所有示例之前添加的文本,通常用于说明任务要求。
- suffix:在所有示例之后添加的文本,通常包含用户输入的占位符。
- input_variables:用户输入的变量名称列表。
- example_separator:用于分隔示例的字符串,默认为换行符。
主要方法
- format():根据输入变量和示例生成完整的提示。
- invoke():调用语言模型,生成响应。
3.3 SemanticSimilarityExampleSelector
根据语义相似度动态选择示例的工具。它通过计算输入与示例之间的余弦相似度,选择与输入最相关的示例。
主要功能是根据输入的语义相似度动态选择示例。它通过以下步骤实现:
- 使用嵌入模型(如 OpenAIEmbeddings)将输入和示例转换为嵌入向量。
- 计算输入嵌入与示例嵌入之间的余弦相似度。
- 根据相似度选择最相关的示例。
主要属性
- k:表示要选择的示例数量,默认为 4。
- vectorstore:用于存储嵌入向量并执行相似度搜索的向量存储类。
- input_keys:可选参数,指定用于搜索的输入变量。
- example_keys:可选参数,指定过滤示例的键。
主要方法
- from_examples():用于创建 SemanticSimilarityExampleSelector 实例。它需要提供示例列表、嵌入模型和向量存储类。
- add_example():向向量存储中添加新的示例。
- select_examples():根据输入变量选择最相关的示例
select_examples = example_selector.select_examples({"question": "穆罕默德·阿里和艾伦·图灵谁的寿命更长"})