目录
[1. 整合示例与模板,构建结构化提示](#1. 整合示例与模板,构建结构化提示)
[2. 引导模型理解任务逻辑](#2. 引导模型理解任务逻辑)
[3. 提升少样本场景下的模型性能](#3. 提升少样本场景下的模型性能)
[4. 支持动态示例选择(扩展功能)](#4. 支持动态示例选择(扩展功能))
[5. 与其他模块协同工作](#5. 与其他模块协同工作)
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
的运作流程如下:
- 定义示例列表(
examples
),每个示例包含问题与分步答案。 - 创建
example_prompt
,规定单个示例的展示格式。 - 实例化
FewShotPromptTemplate
,将示例与用户输入的问题拼接成完整提示。 - 输出结果会包含所有示例和用户问题,模型基于此生成类似结构的答案。
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
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)。
因此最终答案是:鲁道夫·科赫。