欢迎光临
我们一直在努力

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

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

前言

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

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

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

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

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

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

  • FewShotPromptTemplate:纯文本大模型使用,搭配基础PromptTemplate
  • 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核心区别对比

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

    可涵的疑问:

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

    核心一句话结论

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

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

    需求

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

  • 定义样例格式化模板
  • 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),
    ]),
    ),
    ]

  • 模板定义与样例消息转换 使用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
    ))

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

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

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

    赞(0)
    未经允许不得转载:171主机测评 » 给AI“喂”例子就像教小朋友看图说话?LangChain这波操作我服了
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址