【LangChain少样本提示工程实战】FewShotPromptTemplate原理与应用解析——附运行代码

目录

引言

重点提炼

一、FewShotPromptTemplate作用

[1. ​​整合示例与模板,构建结构化提示​​](#1. 整合示例与模板,构建结构化提示)

[2. ​​引导模型理解任务逻辑​​](#2. 引导模型理解任务逻辑)

[3. ​​提升少样本场景下的模型性能​​](#3. 提升少样本场景下的模型性能)

[4. ​​支持动态示例选择(扩展功能)​​](#4. 支持动态示例选择(扩展功能))

[5. ​​与其他模块协同工作​​](#5. 与其他模块协同工作)

二、适用场景

三、用户代码解析

1、依赖库

2、使用FewShotPromptTemplate创建聊天提示模板


引言

在AI工程实践中,如何让大语言模型快速适应复杂任务且避免海量数据训练?LangChain框架的FewShotPromptTemplate提供了高效解决方案。本文深入剖析其核心机制:通过结构化示例动态构建提示模板,引导模型学习分步推理逻辑,实现少样本场景下的精准输出控制。作为少样本提示工程的代表性工具,它既能减少对模型微调的依赖,又能突破零样本提示的局限性,在复杂问答、格式规范输出等场景展现显著优势。文章通过完整代码示例,演示了从示例设计、模板构建到推理链调用的全流程,并解析了模型模仿示例生成多步推理的核心原理,为开发者提供开箱即用的少样本提示工程实践指南。


重点提炼

1.核心功能

  • 示例动态嵌入:自动化拼接示例与用户输入,构建结构化提示

  • 推理逻辑引导:通过分步答案示例训练模型拆解复杂问题

  • 输出格式控制:统一答案风格与流程,提升结果规范性

2.适用场景

  • 多跳推理问答

  • 领域专业术语处理

  • 低资源语言/跨语言任务

3.技术优势

  • 1-5个示例即可显著提升模型表现

  • 支持动态示例选择器优化上下文相关性

  • 无缝对接LangChain生态链式组件

4.实战价值

  • 提供可复用的代码范式(含千问API接入)

  • 解析模板变量对齐等工程细节

  • 验证少样本提示对历史人物关系推理的实践效果


一、FewShotPromptTemplate作用

FewShotPromptTemplate 是 LangChain 中用于构建 ​​少样本提示(Few-Shot Prompt)​​ 的核心工具,其核心作用是通过提供少量示例引导大语言模型(LLM)理解任务模式,从而提升输出质量。


1. ​​整合示例与模板,构建结构化提示​

  • ​动态插入示例​ :将预先定义的示例列表(examples)与问题模板(example_prompt)结合,自动生成包含示例的完整提示文本。
  • ​模板格式控制​ :通过 example_prompt 参数自定义每个示例的展示格式(如问题与答案的排版),确保示例与最终问题在结构上一致。
    示例代码中,example_prompt 将每个示例格式化为"问题:{question}\n{answer}",最终生成的提示会包含所有示例和用户输入的问题。

2. ​​引导模型理解任务逻辑​

  • ​展示推理过程​:示例中的答案通常包含分步推理(如追问、中间答案),帮助模型学习如何拆解复杂问题。
  • ​统一输出风格​ :通过示例定义输出的语气、结构和逻辑(如是否需追问、如何总结答案),确保模型生成符合预期的结果。
    例如,用户提供的示例中,每个答案均以"后续问题→中间答案→最终答案"的流程呈现,模型会模仿此模式回答新问题。

3. ​​提升少样本场景下的模型性能​

  • ​减少训练依赖​:无需微调模型,仅通过少量示例即可让模型适应新任务,节省数据标注和计算资源。
  • ​缓解零样本局限性​ :当任务复杂或需要特定推理步骤时,Few-Shot 提示比 Zero-Shot(纯指令)更可靠。
    研究表明,Few-Shot 提示在 1-2 个示例后性能显著提升,但过多示例可能引入噪声

4. ​​支持动态示例选择(扩展功能)​

  • ​示例选择器(Example Selector)​:可根据用户输入动态筛选最相关的示例(如基于语义相似度),提升提示的针对性。
  • ​灵活适应不同场景​:例如在客服场景中,根据用户问题类型(如退货、咨询)匹配对应的解决流程示例。

5. ​​与其他模块协同工作​

  • ​与链(Chain)结合​:作为 LangChain 流程的一部分,FewShotPromptTemplate 可与检索器、记忆模块等结合,实现复杂任务(如多步问答)。
  • ​多模态支持​:理论上支持文本、代码等多种示例类型,扩展应用场景。

二、适用场景

  • ​复杂推理任务​:如多跳问答、数学问题分解。
  • ​风格/格式控制​:生成特定格式的文本(如报告、邮件)。
  • ​低资源领域​:缺乏标注数据时快速适配模型到新领域,如:混合多语言示例增强跨语言理解。

三、用户代码解析

用户代码中,FewShotPromptTemplate 的运作流程如下:

  1. 定义示例列表(examples),每个示例包含问题与分步答案。
  2. 创建 example_prompt,规定单个示例的展示格式。
  3. 实例化 FewShotPromptTemplate,将示例与用户输入的问题拼接成完整提示。
  4. 输出结果会包含所有示例和用户问题,模型基于此生成类似结构的答案。

1、依赖库

python 复制代码
pip install langchain-core
pip install langchain-community
pip install openai langchain-openai

说明:如果安装过程速度太慢或总是安装失败,可用镜像源进行安装。在安装命令后加上:-i https://mirrors.aliyun.com/pypi/simple/。如:pip install openai langchain-openai -i https://mirrors.aliyun.com/pypi/simple/


2、使用FewShotPromptTemplate创建聊天提示模板

准备工作:

1、申请千问大模型api key

申请教程:【千问大模型API申请教程】-CSDN博客

2.创建.env文件

需要创建".env"文件用于存放APIkey,内容写入如下:

DASHSCOPE_API_KEY="sk-xxxxxxxxxxxxxxxxxxxx" #替换为自己的API key

示例代码

python 复制代码
from langchain_core.prompts import PromptTemplate
from langchain_core.prompts import FewShotPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
import os

#1、加载配置文件
load_dotenv()

#2.调用千问大模型
qwen=ChatOpenAI(
        model="qwen-max",
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
        )

#3、提示词模板文本:定义包含问题和答案的示例列表
text=[
        {
    "question": "穆罕默德·阿里和艾伦·图灵谁活得更久?",
    "answer":
"""
此处是否需要后续问题:是。
后续问题:穆罕默德·阿里去世时多少岁?
中间答案:穆罕默德·阿里去世时享年74岁。
后续问题:艾伦·图灵去世时多少岁?
中间答案:艾伦·图灵去世时享年41岁。
因此最终答案是:穆罕默德·阿里
"""
  },
  {
    "question": "Craigslist的创始人何时出生?",
    "answer":
"""
此处是否需要后续问题:是。
后续问题:谁是Craigslist的创始人?
中间答案:Craigslist由克雷格·纽马克创立。
后续问题:克雷格·纽马克何时出生?
中间答案:克雷格·纽马克出生于1952年12月6日。
因此最终答案是:1952年12月6日
"""
  },
  {
    "question": "乔治·华盛顿的外祖父是谁?",
    "answer":
"""
此处是否需要后续问题:是。
后续问题:乔治·华盛顿的母亲是谁?
中间答案:乔治·华盛顿的母亲是玛丽·鲍尔·华盛顿。
后续问题:玛丽·鲍尔·华盛顿的父亲是谁?
中间答案:玛丽·鲍尔·华盛顿的父亲是约瑟夫·鲍尔。
因此最终答案是:约瑟夫·鲍尔
"""
  },
  {
    "question": "《大白鲨》和《007:大战皇家赌场》的导演是否来自同一个国家?",
    "answer":
"""
此处是否需要后续问题:是。
后续问题:《大白鲨》的导演是谁?
中间答案:《大白鲨》的导演是史蒂文·斯皮尔伯格。
后续问题:史蒂文·斯皮尔伯格来自哪里?
中间答案:美国。
后续问题:《007:大战皇家赌场》的导演是谁?
中间答案:《007:大战皇家赌场》的导演是马丁·坎贝尔。
后续问题:马丁·坎贝尔来自哪里?
中间答案:新西兰。
因此最终答案是:否
"""
  }
]

#4、定义模板格式
prompt_text=PromptTemplate(
        input_variables=["question","answer"],
        template="问题:{question}\n{answer}"
        )

#5、创建FewShotPromptTemplate实例
#传入示例列表、示例模板、后缀和输入变量
prompt=FewShotPromptTemplate(
        examples=text,
        example_prompt=prompt_text,
        suffix="问题:{input}",
        input_variables=["input"]
        )
#6、定义任务链
chain= prompt|qwen|StrOutputParser()

#7、设置问题输出结果
print(chain.invoke({"input":"爱因斯坦的外祖父是谁?"}))

运行结果

此处是否需要后续问题:是。

后续问题:爱因斯坦的母亲是谁?

中间答案:爱因斯坦的母亲是波林·科赫(Pauline Koch)。

后续问题:波林·科赫的父亲是谁?

中间答案:波林·科赫的父亲是鲁道夫·科赫(Rudolf Koch)。

因此最终答案是:鲁道夫·科赫。

相关推荐
GOTXX15 分钟前
【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门
开发语言·数据库·c++·qt·图形渲染·图形化界面·qt新手入门
猿小喵17 分钟前
记录一次TDSQL网关夯住故障
运维·数据库·mysql
电商api接口开发21 分钟前
如何在C#中使用LINQ对数据库进行查询操作?
数据库·c#·linq
hnsqls40 分钟前
Redis 常问知识
数据库·redis·缓存
小臭希1 小时前
python蓝桥杯备赛常用算法模板
开发语言·python·蓝桥杯
mosaicwang1 小时前
dnf install openssl失败的原因和解决办法
linux·运维·开发语言·python
蹦蹦跳跳真可爱5891 小时前
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
人工智能·pytorch·python·分类·逻辑回归·学习方法
Bruce_Liuxiaowei2 小时前
基于Flask的Windows事件ID查询系统开发实践
windows·python·flask
carpell2 小时前
二叉树实战篇1
python·二叉树·数据结构与算法
经年小栈2 小时前
性能优化-Spring参数配置、数据库连接参数配置、JVM调优
数据库·spring·性能优化