核心定义
FewShotPromptTemplate 是 LangChain 中构建少样本提示的模板类,核心是在提示词中嵌入少量示例,引导大模型遵循示例的格式、逻辑或风格完成任务,提升输出准确性与一致性。
核心作用
通过「示例集 + 模板字符串 + 动态变量」,让模型快速掌握任务输入输出模式,解决陌生任务或复杂格式适配问题,避免繁琐规则编写,提升提示词复用性与任务适配性。
核心概念
- 示例(Examples) :少样本学习的样本数据,通常为列表形式,每个元素是含输入输出的字典(如
[{"input": "文本1", "output": "结果1"}, ...]),用于展示任务具体模式。 - 示例模板(Example Prompt Template) :用于格式化单个示例的子模板,定义每个示例在提示词中的呈现形式(如输入输出的排版、描述性文字)。
- 前缀(Prefix) :提示词的前置说明部分,用于告知模型任务目标、示例的作用(如"以下是文本分类任务的示例,请参考示例将输入文本分类到对应类别")。
- 后缀(Suffix) :提示词的后置部分,用于承载用户的动态输入变量,引导模型完成当前任务(如"请对以下文本进行分类:{input_text}")。
创建实例
核心原则:先定义示例集和示例模板,再通过 FewShotPromptTemplate组合示例、前缀、后缀等,生成完整少样本提示模板。
基础创建(完整流程)
python
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
# 定义示例集(少样本数据)
examples = [
{"input": "我喜欢阳光明媚的天气", "output": "积极情绪"},
{"input": "今天的工作太多,压力好大", "output": "消极情绪"},
{"input": "收到了朋友送的礼物,很开心", "output": "积极情绪"},
{"input": "错过末班车,只能打车回家了", "output": "中性情绪"}
]
# 定义示例模板(格式化单个示例)
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="输入:{input}\n输出:{output}\n"
)
# 定义 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
# 传入示例集
examples=examples,
# 传入示例模板
example_prompt=example_prompt,
# 前置说明
prefix="请参考以下示例,判断输入文本的情绪类别(积极情绪/消极情绪/中性情绪):",
# 后置用户输入部分
suffix="输入:{user_input}\n输出:",
# 待填充的动态变量(用户输入文本)
input_variables=["user_input"]
)
含示例筛选的创建(动态控制示例数量)
通过 example_selector 参数指定示例选择器,可动态筛选示例(如控制数量、按相似度筛选),适配不同长度限制或任务难度场景。
python
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_core.prompts.example_selector import LengthBasedExampleSelector
# 定义示例集(更多样本)
examples = [
{"input": "我喜欢阳光明媚的天气", "output": "积极情绪"},
{"input": "今天的工作太多,压力好大", "output": "消极情绪"},
{"input": "收到了朋友送的礼物,很开心", "output": "积极情绪"},
{"input": "错过末班车,只能打车回家了", "output": "中性情绪"},
{"input": "电影情节很精彩,推荐大家观看", "output": "积极情绪"},
{"input": "餐厅的食物很美味,服务也很好", "output": "积极情绪"},
{"input": "路上堵车,迟到了十分钟", "output": "消极情绪"}
]
# 定义示例模板
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="输入:{input}\n输出:{output}\n"
)
# 定义示例选择器(按长度筛选,控制示例总长度)
example_selector = LengthBasedExampleSelector(
examples=examples,
example_prompt=example_prompt,
# 示例总长度上限(字符数),超过则自动减少示例
max_length=100
)
# 定义 FewShotPromptTemplate(传入示例选择器,而非直接传 examples)
few_shot_prompt = FewShotPromptTemplate(
# 动态示例选择器
example_selector=example_selector,
example_prompt=example_prompt,
prefix="请参考以下示例,判断输入文本的情绪类别(积极情绪/消极情绪/中性情绪):",
suffix="输入:{user_input}\n输出:",
input_variables=["user_input"]
)
无示例的少样本模板(ZeroShot 兼容)
若需兼容零样本场景(无需示例),可通过 examples=[] 创建空示例模板,后续可动态添加示例。
python
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
# 空示例集
examples = []
# 示例模板
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="输入:{input}\n输出:{output}\n"
)
# 定义空示例少样本模板
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="请判断输入文本的情绪类别(积极情绪/消极情绪/中性情绪):",
suffix="输入:{user_input}\n输出:",
input_variables=["user_input"]
)
# 后续可动态添加示例
few_shot_prompt.examples.append({"input": "今天心情很好", "output": "积极情绪"})
实例属性
examples
核心属性,存储少样本示例列表,每个元素为含输入输出的字典(如 [{"input": "...", "output": "..."}])。
example_prompt
示例模板对象(PromptTemplate 实例),定义单个示例的格式化规则。
prefix / suffix
字符串属性,分别对应提示词的前置说明和后置用户输入部分,共同构成完整提示词的框架。
input_variables
待填充动态变量列表(如 ["user_input"]),不包含示例中的变量(示例变量由 example_prompt 单独定义)。
example_selector(可选)
示例选择器对象(如 LengthBasedExampleSelector),用于动态筛选示例,未指定时直接使用全部 examples。
实例方法
format
python
def format(**kwargs: Any) -> str
功能
填充动态变量,结合示例、前缀、后缀生成完整的少样本提示词字符串。
参数
**kwargs:键值对参数,填充input_variables中定义的动态变量
返回值
字符串类型的最终少样本提示词。
示例
python
# 续基础创建示例
prompt_str = few_shot_prompt.format(user_input="今天的考试很顺利")
print(prompt_str)
# 输出结果:
# 请参考以下示例,判断输入文本的情绪类别(积极情绪/消极情绪/中性情绪):
# 输入:我喜欢阳光明媚的天气
# 输出:积极情绪
#
# 输入:今天的工作太多,压力好大
# 输出:消极情绪
#
# 输入:收到了朋友送的礼物,很开心
# 输出:积极情绪
#
# 输入:错过末班车,只能打车回家了
# 输出:中性情绪
#
# 输入:今天的考试很顺利
# 输出:
format_prompt
python
def format_prompt(**kwargs: Any) -> PromptValue
功能
填充动态变量后,生成 LangChain 模型可直接接收的 PromptValue 对象(无需手动转换字符串)。
参数
**kwargs:键值对参数,填充动态变量
返回值
PromptValue 对象,可直接传入 LangChain 模型的 invoke() 等方法。
示例
python
# 续基础创建示例
prompt = few_shot_prompt.format_prompt(user_input="今天的考试很顺利")
# 直接传入模型调用
# model.invoke(prompt)
invoke
python
def invoke(
input: dict,
config: RunnableConfig | None = None,
**kwargs: Any
) -> PromptValue
功能
适配 LangChain 链式调用(Runnable 接口)的规范方法,生成 PromptValue 对象,用于流水线式模型调用流程。
参数
-
input:字典类型,键为变量名,值为变量值(核心传参方式); -
config:运行时配置(如超时时间、日志等级等); -
**kwargs:额外键值对变量(补充 input 中未包含的变量)。
返回值
PromptValue 对象,可直接用于链式调用中的模型输入。
示例
python
# 续基础创建示例
prompt = few_shot_prompt.invoke(input={"user_input": "今天的考试很顺利"})
关键注意事项
- 示例质量直接影响模型效果:示例需准确、典型,覆盖任务核心场景,避免错误或模糊示例;
- 示例数量需平衡:过少可能无法让模型掌握任务模式,过多可能导致提示词过长(超出模型上下文窗口),建议3-5个示例为宜;
- 示例模板需统一:所有示例需遵循相同的格式化规则(如输入输出的排版、字段名称),避免格式混乱;
- 动态变量与示例变量需区分:
input_variables仅定义用户动态输入变量,示例变量由example_prompt单独定义,不可混淆; - 建议结合示例选择器优化:示例较多时,使用
example_selector动态控制示例长度,避免超出模型上下文限制。