我挖掘了一个巨牛的 人工智能 学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

前言
在大模型开发过程中,很多开发者只会写零样本提示:直接下发任务指令,让模型依靠原生知识作答。但零样本存在明显短板:输出格式混乱、推理逻辑不统一、自定义规则难以对齐、模型容易自由发挥产生幻觉。
我们上一篇刚学了样本提示词模板,这就派上用场了!
学的提示词模板是作为“加工每个样例的工具”传入少样本模板的。它不直接构成最终答案,但少样本模板最终拼出来的那堵“提示词大墙”,每一块砖(每个样例)都是由你那个小模板烧制出来的。
少样本提示(Few-shotting) 是解决该问题的核心提示工程手段:给 LLM 提供少量「输入 + 标准输出」样例,让模型模仿样例的格式、逻辑、思考流程完成任务。结合 LangChain 封装的FewShotPromptTemplate、FewShotChatMessagePromptTemplate,我们可以标准化、工程化实现少样本能力,搭配结构化输出还能实现高精度信息提取。
本文从零讲解少样本提示核心概念、区分字符串 / 聊天两类少样本模板,附带两大完整实战案例:链式推理问答、人物结构化信息提取,全部代码可直接复制运行,适配生产环境。
一、少样本提示核心概念
1.1 零样本 vs 少样本直观对比
零样本(Zero-shot)
只下发任务指令,无任何参考样例,模型自由解读需求。 示例代码:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")
res = model.invoke("What is 2 🦜 9?")
res.pretty_print()
输出问题:模型无法理解🦜代表运算,会解读为符号组合,无法给出计算结果。
少样本(Few-shot)
在正式提问前,提供多组标准样例,让模型自主归纳任务规则。 样例集:
examples = [
{"input": "2 🦜 2", "output": "4"},
{"input": "2 🦜 3", "output": "5"},
]
模型读取样例后可自动识别:🦜等价于加法,最终计算2 🦜 9 = 11。
1.2 少样本提示能解决哪些开发痛点?
二、LangChain 少样本模板基础实现
LangChain 区分两类场景,提供两套少样本模板:
2.1 对话专用:FewShotChatMessagePromptTemplate
聊天模型接收HumanMessage/AIMessage消息结构,该模板自动将样例批量转换为对话消息。
完整基础示例
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_openai import ChatOpenAI
# 1. 定义样例数据集
examples = [
{"input": "2 🦜 2", "output": "4"},
{"input": "2 🦜 3", "output": "5"},
]
# 2. 定义单条样例的格式化模板(基础ChatPromptTemplate)
example_prompt = ChatPromptTemplate([
("human", "{input}"),
("ai", "{output}"),
])
# 3. 初始化少样本模板
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt, # 样例格式化模板
examples=examples # 样例数据
)
# 4. 组装完整全局提示词:系统指令 + 少样本示例 + 用户新问题
final_prompt = ChatPromptTemplate([
("system", "你是一个神奇的数学奇才。"),
few_shot_prompt,
("human", "{input}"),
])
# 5. 构建LCEL链执行
model = ChatOpenAI(model="gpt-4o-mini")
chain = final_prompt | model
res = chain.invoke({"input": "What is 2 🦜 9?"})
res.pretty_print()
输出结果:11,模型成功通过样例归纳运算规则。
核心参数说明
FewShotChatMessagePromptTemplate同样实现Runnable接口,支持.invoke()方法:
- examples:样例字典列表,存放每组输入输出;
- example_prompt:基础聊天模板,规定单组人机样例排版;
- .invoke():传入空字典生成完整样例消息;
- .to_messages():返回对话消息列表,可直接传入模型;
- .to_string():转换为纯文本字符串。
完整流程梳理:
- 准备原始样本数据 examples(list[dict]);
- 第一个 ChatPromptTemplate:定义单条样本的对话格式(user 提问 + ai 标准答案);
- FewShotChatMessagePromptTemplate: 接收两样东西:原始样本 examples + 格式化规则 example_prompt; 自动循环所有样本,按规则批量生成一堆 HumanMessage / AIMessage 示范对话;
- 第二个 ChatPromptTemplate(最终总模板): 把系统指令 system、上一步生成好的少样本对象、用户当前新提问拼接在一起,组装成一套完整对话上下文;
- 拼接模型形成 chain,调用执行。
2.2 纯文本场景:FewShotPromptTemplate
面向非对话文本模型,基于PromptTemplate构建,支持prefix前置说明、suffix后置提问。 核心参数:
- prefix:样例前全局任务描述;
- examples:文本样例集合;
- example_prompt:单条样例格式化文本模板;
- suffix:样例后用户新问题占位符;
- input_variables:模板动态变量列表。
FewShotChatMessagePromptTemplate vs FewShotPromptTemplate核心区别对比
| 输出格式 | 纯文本字符串 | 角色化消息列表(Human/AI等) |
| 适用模型 | 传统文本生成模型 | 聊天专用模型(如ChatGPT、DeepSeek) |
| 模板类型 | 常与 PromptTemplate 配合 | 常与 ChatPromptTemplate 配合 |
| 消息结构 | 扁平,无角色区分 | 层次化,支持 System、Human、AI 等角色 |
| 应用场景 | 文本分类、信息提取等简单任务 | 对话机器人、复杂指令遵循等 |
可涵的疑问:
为什么 FewShotPromptTemplate 有 few_shot_prompt 就可以直接链式调用了,而 FewShotChatMessagePromptTemplate 还需要再封装一层# 最终提示词模板chat_prompt_template = ChatPromptTemplate ?
核心一句话结论
三、两大落地实战案例
案例一:少样本引导多步链式推理
需求
对于问答类问题,强制模型分步拆解提问、分步查询中间信息,最后给出结论,禁止直接输出答案。
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
example_prompt = PromptTemplate.from_template("Question: {question}\\n{answer}")
examples = [
{
"question": "李白和杜甫,谁更长寿?",
"answer": """
是否需要后续问题:是的。
后续问题:李白享年多少岁?
中间答案:李白享年61岁。
后续问题:杜甫享年多少岁?
中间答案:杜甫享年58岁。
所以最终答案是:李白
"""
},
{
"question": "腾讯的创始人什么时候出生?",
"answer": """
是否需要后续问题:是的。
后续问题:腾讯的创始人是谁?
中间答案:腾讯由马化腾创立。
后续问题:马化腾什么时候出生?
中间答案:马化腾出生于1971年10月29日。
所以最终答案是:1971年10月29日
""",
},
{
"question": "孙中山的外祖父是谁?",
"answer": """
是否需要后续问题:是的。
后续问题:孙中山的母亲是谁?
中间答案:孙中山的母亲是杨太夫人。
后续问题:杨太夫人的父亲是谁?
中间答案:杨太夫人的父亲是杨胜辉。
所以最终答案是:杨胜辉
""",
},
{
"question": "电影《红高粱》和《霸王别姬》的导演来自同一个国家吗?",
"answer": """
是否需要后续问题:是的。
后续问题:《红高粱》的导演是谁?
中间答案:《红高粱》的导演是张艺谋。
后续问题:张艺谋来自哪里?
中间答案:中国。
后续问题:《霸王别姬》的导演是谁?
中间答案:《霸王别姬》的导演是陈凯歌。
后续问题:陈凯歌来自哪里?
中间答案:中国。
所以最终答案是:是
""",
},
]
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Question: {input}",
input_variables=["input"],
)
from langchain_openai import ChatOpenAI
# 生成消息列表
prompt_messages = prompt.invoke({"input": "《教父》和《星球大战》的导演来自同一个国家吗?"}).to_messages()
model = ChatOpenAI(model="gpt-4o-mini")
res = model.invoke(prompt_messages)
res.pretty_print()
模型输出会严格复刻样例的分步推理格式,先拆解子问题、输出中间答案,最后汇总结论。
案例二:少样本 + 结构化输出 实现文本信息提取
需求
自由文本中自动提取人物结构化信息(姓名、身高、发色、肤色),无人物返回空列表,字段未知填充null。 整体流程:Pydantic 定义输出结构 → 构造工具调用样例 → 工具样例转消息模板 → 少样本注入提示词 → 绑定结构化模型执行。
from typing import List, Optional
from pydantic import BaseModel, Field
class Person(BaseModel):
"""人物基础信息"""
name: Optional[str] = Field(default=None, description="人物姓名")
hair_color: Optional[str] = Field(default=None, description="头发颜色")
skin_color: Optional[str] = Field(default=None, description="肤色")
height_in_meters: Optional[str] = Field(default=None, description="身高,单位米")
class Data(BaseModel):
"""批量人物提取结果"""
people: List[Person]
examples = [
(
"海洋是广阔而蓝色的。它有两万多英尺深。",
Data(people=[]),
),
(
"小强从中国远行到美国。",
Data(people=[
Person(name="小强", height_in_meters=None, skin_color=None, hair_color=None),
]),
),
]
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.utils.function_calling import tool_example_to_messages
# 全局提示词模板,预留样例消息占位
prompt_template = ChatPromptTemplate([
("system", "你是信息提取专家,仅提取文本内人物信息,未知字段返回null"),
MessagesPlaceholder("example_messages"),
("user", "{new_message}"),
])
# 批量转换样例为消息列表
example_messages = []
for txt, tool_call in examples:
ai_response = "检测到人" if tool_call.people else "未检测到人"
example_messages.extend(tool_example_to_messages(
input=txt,
tool_calls=[tool_call],
ai_response=ai_response
))
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")
# 强制模型输出Data结构化对象
structured_model = model.with_structured_output(schema=Data)
chain = prompt_template | structured_model
# 测试输入文本
res = chain.invoke({
"example_messages": example_messages,
"new_message": "篮球场上,身高两米的中锋王伟默契地将一米七的后卫挚友李明传球,完成绝杀。"
})
print(res)
输出标准化结构化数据:
people=[
Person(name='王伟', hair_color=None, skin_color=None, height_in_meters='2.0'),
Person(name='李明', hair_color=None, skin_color=None, height_in_meters='1.7')
]
该方案完美解决纯指令提取不准、字段缺失、格式错乱问题,是文档解析、简历抽取类业务标准方案。
四、核心知识点总结(面试 & 开发必背)
- FewShotChatMessagePromptTemplate:对话模型专用,基于ChatPromptTemplate,生成人机对话消息;
- FewShotPromptTemplate:纯文本模型使用,支持 prefix/suffix 自定义文本前后缀;
结语
提示词模板是 LangChain 提示工程的基础,而少样本提示是提示工程进阶核心能力。相比零样本,少样本能极大提升输出稳定性、统一业务规范,尤其适合结构化提取、标准化问答、固定格式生成等场景。
本文覆盖了少样本基础语法、纯文本 / 对话两套模板、推理引导、结构化信息提取两大可落地案例,所有代码开箱即用。掌握少样本提示后,搭配之前学习的基础 PromptTemplate、LangChain Hub 公共模板,即可搭建一套完整、标准化、工程化的提示词开发体系,支撑企业级 AI Agent、文档解析、对话机器人开发。

