给AI“喂”例子就像教小朋友看图说话?LangChain这波操作我服了

AI1周前发布 beixibaobao
13 0 0

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

给AI“喂”例子就像教小朋友看图说话?LangChain这波操作我服了

前言

在大模型开发过程中,很多开发者只会写零样本提示:直接下发任务指令,让模型依靠原生知识作答。但零样本存在明显短板:输出格式混乱、推理逻辑不统一、自定义规则难以对齐、模型容易自由发挥产生幻觉。

我们上一篇刚学了样本提示词模板,这就派上用场了!

学的提示词模板是作为“加工每个样例的工具”传入少样本模板的。它不直接构成最终答案,但少样本模板最终拼出来的那堵“提示词大墙”,每一块砖(每个样例)都是由你那个小模板烧制出来的

少样本提示(Few-shotting) 是解决该问题的核心提示工程手段:给 LLM 提供少量「输入 + 标准输出」样例,让模型模仿样例的格式、逻辑、思考流程完成任务。结合 LangChain 封装的FewShotPromptTemplateFewShotChatMessagePromptTemplate,我们可以标准化、工程化实现少样本能力,搭配结构化输出还能实现高精度信息提取。

本文从零讲解少样本提示核心概念、区分字符串 / 聊天两类少样本模板,附带两大完整实战案例:链式推理问答、人物结构化信息提取,全部代码可直接复制运行,适配生产环境。

一、少样本提示核心概念

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 少样本提示能解决哪些开发痛点?

  1. 统一输出格式:强制模型输出 JSON、固定列表、自定义文本结构,避免格式杂乱;
  2. 描述复杂任务逻辑:部分风格、推理规则难以用文字说清,示例比长篇指令更直观;
  3. 规范多步推理:提供思考链样例,引导模型分步推导,减少一步错漏;
  4. 降低模型幻觉:限定输出风格、字段范围,让回答贴合样例标准。

二、LangChain 少样本模板基础实现

LangChain 区分两类场景,提供两套少样本模板:

  1. FewShotPromptTemplate:纯文本大模型使用,搭配基础PromptTemplate
  2. FewShotChatMessagePromptTemplate:对话类 Chat 模型专用,搭配ChatPromptTemplate,工程开发最常用。

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核心区别对比

特性 FewShotPromptTemplate FewShotChatMessagePromptTemplate
输出格式 纯文本字符串 角色化消息列表(Human/AI等)
适用模型 传统文本生成模型 聊天专用模型(如ChatGPT、DeepSeek)
模板类型 常与 PromptTemplate 配合 常与 ChatPromptTemplate 配合
消息结构 扁平,无角色区分 层次化,支持 SystemHumanAI 等角色
应用场景 文本分类、信息提取等简单任务 对话机器人、复杂指令遵循等

可涵的疑问:

为什么 FewShotPromptTemplate 有 few_shot_prompt 就可以直接链式调用了,而 FewShotChatMessagePromptTemplate 还需要再封装一层# 最终提示词模板chat_prompt_template = ChatPromptTemplate  ?

核心一句话结论

  1. FewShotPromptTemplate 内部自带完整文本拼接能力(prefix+ 样例 +suffix),本身就是完整独立 Prompt,直接进链就能发给文本 LLM;
  2. FewShotChatMessagePromptTemplate 只负责批量生成一堆人机对话样例消息,没有 system 全局指令、没有用户当前提问占位,它只是「消息片段」,必须外层套 ChatPromptTemplate 组装完整对话结构才能给 Chat 模型。

三、两大落地实战案例

案例一:少样本引导多步链式推理

需求

对于问答类问题,强制模型分步拆解提问、分步查询中间信息,最后给出结论,禁止直接输出答案。

  1. 定义样例格式化模板
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
example_prompt = PromptTemplate.from_template("Question: {question}n{answer}")
  1. 构造多组推理标准样例
examples = [
 {
 "question": "李白和杜甫,谁更长寿?",
 "answer": """
是否需要后续问题:是的。
后续问题:李白享年多少岁?
中间答案:李白享年61岁。
后续问题:杜甫享年多少岁?
中间答案:杜甫享年58岁。
所以最终答案是:李白
 """
 },
 {
 "question": "腾讯的创始人什么时候出生?",
 "answer": """
是否需要后续问题:是的。
后续问题:腾讯的创始人是谁?
中间答案:腾讯由马化腾创立。
后续问题:马化腾什么时候出生?
中间答案:马化腾出生于1971年10月29日。
所以最终答案是:1971年10月29日
 """,
 },
 {
 "question": "孙中山的外祖父是谁?",
 "answer": """
是否需要后续问题:是的。
后续问题:孙中山的母亲是谁?
中间答案:孙中山的母亲是杨太夫人。
后续问题:杨太夫人的父亲是谁?
中间答案:杨太夫人的父亲是杨胜辉。
所以最终答案是:杨胜辉
 """,
 },
 {
 "question": "电影《红高粱》和《霸王别姬》的导演来自同一个国家吗?",
 "answer": """
是否需要后续问题:是的。
后续问题:《红高粱》的导演是谁?
中间答案:《红高粱》的导演是张艺谋。
后续问题:张艺谋来自哪里?
中间答案:中国。
后续问题:《霸王别姬》的导演是谁?
中间答案:《霸王别姬》的导演是陈凯歌。
后续问题:陈凯歌来自哪里?
中间答案:中国。
所以最终答案是:是
 """,
 },
]
  1. 组装少样本模板,拼接用户提问
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    suffix="Question: {input}",
    input_variables=["input"],
)
  1. 完整执行链路
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 定义输出结构 → 构造工具调用样例 → 工具样例转消息模板 → 少样本注入提示词 → 绑定结构化模型执行。

  1. 定义结构化输出模型
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]
  1. 构造两组覆盖边界的样例(无人物、单人物)
examples = [
    (
        "海洋是广阔而蓝色的。它有两万多英尺深。",
        Data(people=[]),
    ),
    (
        "小强从中国远行到美国。",
        Data(people=[
            Person(name="小强", height_in_meters=None, skin_color=None, hair_color=None),
        ]),
    ),
]
  1. 模板定义与样例消息转换 使用tool_example_to_messages将 Pydantic 工具样例转换为模型可识别的完整消息组(HumanMessage + AI 工具调用 + ToolMessage + AI 回复)
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
    ))
  1. 绑定结构化模型,构建执行链
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')
]

该方案完美解决纯指令提取不准、字段缺失、格式错乱问题,是文档解析、简历抽取类业务标准方案。

四、核心知识点总结(面试 & 开发必背)

  1. 少样本提示核心价值:通过少量输入输出样例,对齐模型输出格式、推理逻辑,降低幻觉,解决复杂规则难以文字描述的痛点;
  2. 两类少样本模板区分

    • FewShotChatMessagePromptTemplate:对话模型专用,基于ChatPromptTemplate,生成人机对话消息;
    • FewShotPromptTemplate:纯文本模型使用,支持 prefix/suffix 自定义文本前后缀;
  3. 依赖基础模板少样本模板必须传入普通PromptTemplate/ChatPromptTemplate作为example_prompt,用来统一格式化每一条样例;承接上一篇内容
  4. 统一 Runnable 规范:两类少样本模板都实现 Runnable 接口,支持.invoke().to_messages().to_string(),可直接接入 LCEL 链式;
  5. 高阶组合方案:少样本 + with_structured_output结构化输出,是信息抽取、实体识别、表单提取生产级标准实现;
  6. 工具样例转换tool_example_to_messages可快速将 Pydantic 工具样例转为完整工具调用消息,省去手动拼接多条消息的繁琐工作。

结语

提示词模板是 LangChain 提示工程的基础,而少样本提示是提示工程进阶核心能力。相比零样本,少样本能极大提升输出稳定性、统一业务规范,尤其适合结构化提取、标准化问答、固定格式生成等场景。

本文覆盖了少样本基础语法、纯文本 / 对话两套模板、推理引导、结构化信息提取两大可落地案例,所有代码开箱即用。掌握少样本提示后,搭配之前学习的基础 PromptTemplate、LangChain Hub 公共模板,即可搭建一套完整、标准化、工程化的提示词开发体系,支撑企业级 AI Agent、文档解析、对话机器人开发。

© 版权声明

相关文章