【前端学习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 动态控制示例长度,避免超出模型上下文限制。
相关推荐
光影少年29 分钟前
前端如何调用gpu渲染,提升gpu渲染
前端·aigc·web·ai编程
Surplusx1 小时前
运用VS Code前端开发工具完成网页头部导航栏
前端·html
小宇的天下1 小时前
Calibre 3Dstack --每日一个命令day13【enclosure】(3-13)
服务器·前端·数据库
一只小bit2 小时前
Qt 文件:QFile 文件读写与管理教程
前端·c++·qt·gui
午安~婉2 小时前
整理知识点
前端·javascript·vue
军军君012 小时前
Three.js基础功能学习十二:常量与核心
前端·javascript·学习·3d·threejs·three·三维
m0_748254663 小时前
CSS AI 编程
前端·css·人工智能
27669582923 小时前
dy bd-ticket-guard-client-data bd-ticket-guard-ree-public-key 逆向
前端·javascript·python·abogus·bd-ticket·mstoken·ticket-guard
m0_726365833 小时前
哈希分分预测系统 + Python Worker + Web 仪表盘”小系统(PHP + MySQL)
前端·python·哈希算法
WX-bisheyuange3 小时前
基于SpringBoot的交通管理在线服务系统
前端·javascript·vue.js·毕业设计