langchain系列 - FewShotPromptTemplate 少量示例
导读
环境:OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3
背景:前期忙碌的开发阶段结束,需要沉淀自己的应用知识,过一遍LangChain
时间:20250220
说明:技术梳理,针对FewShotPromptTemplate专门来写一篇博客
概念说明
few-shot最初来源于机器学习的概念,还有one-shot、zero-shot概念,概念如下:
机器学习中的概念
Zero-Shot学习
在训练集中没有某个类别的样本,但在测试集中出现了这个类别。我们需要模型在训练过程中,即使没有接触过这个类别的样本,但仍然可以通过对这个类别的描述,对没见过的类别进行分类。
One-Shot学习
可以理解为用一条数据fine-tune模型。例如,在人脸识别场景里,你只提供一张照片,门禁就能认识各个角度的你。属于Few-Shot学习的特例。
Few-Shot学习
在模型训练过程中,如果每个类别只有少量样本(一个或几个),研究人员希望机器学习模型在学习了一定类别的大量数据后,对于新的类别,只需要少量的样本就能快速学习。
LangChain中的概念
zero-shot
仅通过提示词即可实现模型正确回答
one-shot
通过一个示例和提示词模型正确回答
few-shot
通过少量(大于1)示例和提示词模型正确回答
参数说明
examples
Optional[list[dict]] = None
示例格式化到提示词中,应提供examples 或 example_selector。
example_selector
Optional[BaseExampleSelector] = None
ExampleSelector 选择要格式化到提示符中的示例,应提供examples 或 example_selector。
validate_template
bool = False
是否尝试验证模板。
example_prompt
PromptTemplate
PromptTemplate 用于格式化单个示例。"
suffix
str
要放在示例后面的提示模板字符串。
example_separator
str = "\n\n"
用于连接前缀、示例和后缀的字符串分隔符。
prefix
str = ""
要放在示例前面的提示模板字符串。
template_format
Literal["f-string", "jinja2"] = "f-string"
提示模板的格式。选项包括:'f-string', 'jinja2'。
代码实战
使用少量示例的prompt和大模型实现分类的功能
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
# 示例
examples = [
{
"question": "下面两个动物是同一种类吗?\n1:拉布拉多\n2:哈士奇",
"answer": "是"
},
{
"question": "下面两个动物是同一种类吗?\n1:草鱼\n2:鲸鱼",
"answer": "不是"
}
]
# 示例提示
example_prompt = PromptTemplate(template="Question: {question}\n{answer}")
# 整合后的提示词的前缀
prefix = "你是一个生物学家,判断用户提问的动物种类回答,就判断为同一种类, 回答'是',反之回答'不是'。\n下面是一些示例:"
# 整合后的提示词的前缀
suffix = "Question: {input}"
# 通过FewShotPromptTemplate整合提示词
prompt = FewShotPromptTemplate(
prefix=prefix,
examples=examples,
example_prompt=example_prompt,
suffix=suffix,
# input_variables=["input"] # 可省略
)
print(prompt.invoke("下面两种动物是同一种类吗?\n1:波斯猫\n2:英国短毛").to_string())
# 输出
你是一个生物学家,判断用户提问的动物种类回答,就判断为同一种类, 回答'是',反之回答'不是'。
下面是一些示例:
Question: 下面两个动物是同一种类吗?
1:拉布拉多
2:哈士奇
是
Question: 下面两个动物是同一种类吗?
1:草鱼
2:鲸鱼
不是
Question: 下面两种动物是同一种类吗?
1:波斯猫
2:英国短毛
显然,promptvalue将提示词按照规则整合在一起了,并将用户提问放在最后
下面看下配置大模型后运行结果
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_openai import ChatOpenAI
# 示例
examples = [
{
"question": "下面两个动物是同一种类吗?\n1:拉布拉多\n2:哈士奇",
"answer": "是"
},
{
"question": "下面两个动物是同一种类吗?\n1:草鱼\n2:鲸鱼",
"answer": "不是"
}
]
# 示例提示
example_prompt = PromptTemplate(template="Question: {question}\n{answer}")
# 整合后的提示词的前缀
prefix = "你是一个生物学家,判断用户提问的动物种类回答,就判断为同一种类, 回答'是',反之回答'不是'。\n下面是一些示例:"
# 整合后的提示词的前缀
suffix = "Question: {input}"
# 通过FewShotPromptTemplate整合提示词
prompt = FewShotPromptTemplate(
prefix=prefix,
examples=examples,
example_prompt=example_prompt,
suffix=suffix,
# input_variables=["input"] # 可省略
)
# 大模型信息
# translate_llm = ChatOpenAI(base_url="https://llm.xxx.xxxx.com/v1/",openai_api_key="sk-xxxxxxxxxx",model_name="qwen2.5-instruct")
translate_llm = ChatOpenAI(**llm_info)
translate_llm = prompt | translate_llm
input5 = "下面两种动物是同一种类吗?\n1:波斯猫\n2:英国短毛"
response = translate_llm.invoke(input5)
print(response.content)
# 输出
是
注:虽然波斯猫和英国短毛猫是两种不同的猫品种,但它们同属于家猫(Felis catus),因此可认为是同一种类。
结束