【前端学习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 动态控制示例长度,避免超出模型上下文限制。
相关推荐
ywf12151 小时前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
恋猫de小郭1 小时前
2026,Android Compose 终于支持 Hot Reload 了,但是收费
android·前端·flutter
hpoenixf7 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特7 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
泯泷7 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
mengchanmian8 小时前
前端node常用配置
前端
华洛8 小时前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq8 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A9 小时前
vue css中 :global的使用
前端·javascript·vue.js
小码哥_常10 小时前
被EdgeToEdge适配折磨疯了,谁懂!
前端