【前端学习AI】FewShotPromptTemplate

核心定义

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 动态控制示例长度,避免超出模型上下文限制。
相关推荐
小魔女千千鱼2 小时前
在 Vue 中,this 的行为在箭头函数和普通函数中是不同的
前端·javascript·vue.js
霍理迪3 小时前
CSS盒模型布局规则
前端·javascript·css
千寻girling3 小时前
面试官: “ 说一下 JS 中什么是事件循环 ? ”
前端·javascript
程序员龙语3 小时前
CSS 高级选择器应用
前端·css
Cassie燁3 小时前
el-table源码解读2-2——createStore()初始化方法
前端·javascript·vue.js
程序员修心3 小时前
CSS文本样式全解析:11个核心属性详解
前端·css
旧梦吟3 小时前
脚本网站 开源项目
前端·web安全·网络安全·css3·html5
北极糊的狐3 小时前
按钮绑定事件达成跳转效果并将树结构id带入子页面形成参数完成查询功能并将返回的数据渲染到页面上2022.5.29
前端·javascript·vue.js
幽络源小助理3 小时前
幽络源二次元分享地址发布页源码(HTML) – 源码网免费分享
前端·html