LangChain 最新版 Zero/One/Few-Shot 提示词模板实战详解

大家好,今天分享的是langChain的提示词模版部分,本部分会持续更新,欢迎关注!

一. 环境准备

使用前安装对应依赖包,

复制代码
pip install -U langchain-core langchain-ollama

-U 代表--upgrade,作用是强制升级至当前最新稳定版本,规避版本兼容问题。

包归属说明

  1. 所有提示词相关模板 PromptTemplateFewShotPromptTemplate 统一归属 langchain-core 包,当前主流稳定版本为 0.2 系列;
  2. OllamaLLM 等模型不再存放于社区包中,2024 年 7 月官方完成模块化拆分,独立为 langchain-ollama 专属对接包,是目前唯一官方推荐写法;
  3. 旧版将模型存放于langchain_community社区包的方式已正式废弃。

二、5 大核心模板最新详解(附实战代码)

1. PromptTemplate:基础字符串模板(最常用)

功能定义

String 类型基础模板,支持动态填充变量,无角色区分,适用于 Zero-shot 无样本场景(如直接提问、简单指令执行)。

核心参数

  • input_variables:必填变量列表(数组格式,支持多变量);
  • partial_variables:可选偏变量(固定部分值,无需每次 format 传入);
  • template:固定指令 + 变量占位符的字符串模板。

最新实战代码

ini 复制代码
# 最新版导入(langchain-core 0.2+标准)
from langchain_core.prompts import PromptTemplate

# 1. 单变量模板(对应之前的反义词场景)
single_var_template = PromptTemplate(
    input_variables=["word"],  # 数组格式,支持多个变量
    template="给出单词{word}的反义词,要求回答简洁"
)
# format填坑:替换{word}占位符
single_result = single_var_template.format(word="tall")
print("单变量模板输出:", single_result)  # 输出:给出单词tall的反义词,要求回答简洁

# 2. 多变量模板(拓展场景:带词性约束)
multi_var_template = PromptTemplate(
    input_variables=["word", "pos"],  # 多个变量传入数组
    template="单词:{word}(词性:{pos}),请给出2个反义词"
)
multi_result = multi_var_template.format(word="快乐", pos="形容词")
print("多变量模板输出:", multi_result)  # 输出:单词:快乐(词性:形容词),请给出2个反义词

# 3. 偏变量用法(固定部分指令,动态传入核心变量)
partial_template = PromptTemplate(
    input_variables=["question"],
    partial_variables={"role": "专业技术顾问"},  # 固定角色,无需每次传入
    template="你是{role},请详细解答:{question}"
)
partial_result = partial_template.format(question="LangChain模板如何避免变量遗漏?")
print("偏变量模板输出:", partial_result)

关键注意点

(注意:input_variables必须与模板中{变量名}完全一致,遗漏会直接报错;偏变量适合固定指令场景,如角色定义、格式要求)

2. ChatPromptTemplate:对话角色模板

功能定义

带角色区分的对话模板,适用于 Chat 模型(如 GPT、千问),通过角色划分明确系统、用户、AI 的指令边界,生成符合对话格式的提示词。

核心角色模板

  • SystemMessagePromptTemplate:系统指令(定义 AI 身份、规则);
  • HumanMessagePromptTemplate:用户提问(动态输入内容);
  • AIMessagePromptTemplate:AI 示例回答(用于 Few-shot 场景);
  • ChatMessagePromptTemplate:通用角色消息(自定义角色名称)。

最新实战代码(极简写法推荐)

ini 复制代码
from langchain_core.prompts import ChatPromptTemplate

# 新版推荐:from_messages极简写法(无需手动创建角色模板)
chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是知识库助手,仅基于提供的文档内容回答,不编造信息"),  # 系统角色
    ("human", "文档内容:{doc},我的问题:{query}")  # 用户角色(含动态变量)
])

# 格式化生成对话提示词
formatted_chat = chat_prompt.format(
    doc="LangChain核心包langchain-core版本已更新至0.2+",
    query="LangChain模板的导入路径有什么变化?"
)
print("对话模板输出:")
print(formatted_chat)

输出结果(结构化对话格式)

css 复制代码
[    SystemMessage(content='你是知识库助手,仅基于提供的文档内容回答,不编造信息'),    HumanMessage(content='文档内容:LangChain核心包langchain-core版本已更新至0.2+,我的问题:LangChain模板的导入路径有什么变化?')]

关键注意点: 新版from_messages写法无需手动实例化SystemMessagePromptTemplate,直接用元组(角色, 内容)简化;Chat 模型必须用该模板,否则角色混乱会影响回答质量)

3. FewShotPromptTemplate:少样本教学模板

功能定义

带示例的教学模板,通过传入少量样本(One-shot 单样本 / Few-shot 多样本),让模型模仿格式输出,适用于需要固定格式、逻辑推导的场景(如反义词、翻译、数据提取)。

核心参数

  • examples:样本列表(1 个 = One-shot,2 个以上 = Few-shot);
  • example_prompt:样本格式模板(定义单个样本的展示方式);
  • prefix:样本前缀(给模型的总指令);
  • suffix:样本后缀(最终提问 + 变量占位符);
  • input_variables:最终需要传入的动态变量。

最新实战代码

ini 复制代码
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

# 1. 定义样本(One-shot用1个,Few-shot用多个)
examples = [
    {"word": "tall", "antonym": "short"},
    {"word": "fast", "antonym": "slow"},
    {"word": "happy", "antonym": "sad"}
]

# 2. 样本格式模板(定义单个样本的展示样式)
example_template = PromptTemplate(
    input_variables=["word", "antonym"],
    template="单词:{word} → 反义词:{antonym}"
)

# 3. 组装少样本模板
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,  # 传入样本列表
    example_prompt=example_template,  # 样本格式
    prefix="严格按照以下示例格式,输出单词的反义词,无需额外解释",  # 总指令
    suffix="单词:{input_word} → 反义词:",  # 最终提问
    input_variables=["input_word"]  # 动态输入变量
)

# 格式化生成提示词
formatted_few_shot = few_shot_prompt.format(input_word="two")
print("少样本模板输出:")
print(formatted_few_shot)

输出结果(带示例的完整提示词)

arduino 复制代码
严格按照以下示例格式,输出单词的反义词,无需额外解释
单词:tall → 反义词:short
单词:fast → 反义词:slow
单词:happy → 反义词:sad
单词:two → 反义词:

关键注意点:样本格式必须与最终要求的输出格式一致,否则模型会混淆;One-shot 是 Few-shot 的特例,仅需将examples改为单个元素列表即可)

4. PipelinePromptTemplate:组合模板

功能定义

多模板拼接组合模板,将多个独立的小模板按顺序拼接成一个完整提示词,适用于复杂提示词拆分(如先定义角色、再给示例、最后提问),提升代码可维护性。

最新实战代码

python

运行

ini 复制代码
from langchain_core.prompts import PipelinePromptTemplate, PromptTemplate

# 1. 定义3个独立小模板
role_template = PromptTemplate(
    input_variables=[],
    template="你是专业的语言翻译助手,仅提供翻译结果,不添加额外说明"
)

example_template = PromptTemplate(
    input_variables=[],
    template="示例:apple → 苹果,banana → 香蕉"
)

query_template = PromptTemplate(
    input_variables=["word"],
    template="请翻译单词:{word}"
)

# 2. 组合模板(按顺序拼接)
pipeline_prompt = PipelinePromptTemplate(
    pipeline_prompts=[
        ("role", role_template),  # 第一个模板:角色定义
        ("example", example_template),  # 第二个模板:示例
        ("query", query_template)  # 第三个模板:提问
    ],
    input_variables=["word"]  # 仅需传入最终动态变量
)

# 格式化生成完整提示词
formatted_pipeline = pipeline_prompt.format(word="orange")
print("组合模板输出:")
print(formatted_pipeline)

输出结果(按顺序拼接的完整提示词)

复制代码
你是专业的语言翻译助手,仅提供翻译结果,不添加额外说明
示例:apple → 苹果,banana → 香蕉
请翻译单词:orange

关键注意点

(注意:pipeline_prompts按列表顺序拼接,变量需在最终模板中声明;适合复杂提示词拆分管理,避免单个模板字符串过长难以维护)

5. 自定义模板:继承扩展

功能定义

通过继承官方基类,开发自定义模板(如固定格式校验、动态内容生成),适用于企业级特殊场景(如合规检查、个性化指令注入)。

最新实战代码(简单自定义示例)

python 复制代码
from langchain_core.prompts import BaseStringPromptTemplate
from typing import List

# 继承基类,自定义模板
class CustomPromptTemplate(BaseStringPromptTemplate):
    # 自定义参数:固定前缀
    prefix: str = "【合规检查】"
    
    def format(self, **kwargs) -> str:
        # 重写format方法:拼接前缀+用户指令+变量
        user_query = kwargs.get("query")
        return f"{self.prefix} {user_query}(注:回答需符合企业内容规范)"
    
    @property
    def input_variables(self) -> List[str]:
        # 必须重写:声明输入变量
        return ["query"]

# 使用自定义模板
custom_prompt = CustomPromptTemplate()
formatted_custom = custom_prompt.format(query="如何申请员工福利?")
print("自定义模板输出:", formatted_custom)

输出结果

复制代码
【合规检查】 如何申请员工福利?(注:回答需符合企业内容规范)

关键注意点:自定义模板必须继承BaseStringPromptTemplate,并重写formatinput_variables;企业级项目中需谨慎使用,避免破坏提示词结构化)

三、新旧写法对比表(快速迁移)

表格

模板类 旧版导入路径(已淘汰) 最新版导入路径(推荐) 核心变化
PromptTemplate from langchain.prompts import... from langchain_core.prompts import... 仅导入路径变化,用法不变
ChatPromptTemplate from langchain.prompts import... from langchain_core.prompts import... 新增 from_messages 极简写法
FewShotPromptTemplate from langchain.prompts import... from langchain_core.prompts import... 无变化,完全兼容
PipelinePromptTemplate from langchain.prompts import... from langchain_core.prompts import... 无变化,完全兼容

变量校验input_variables必须与模板中{变量名}一一对应,建议开发时添加validate_template=True(默认开启),避免变量遗漏;

四. 完整实战代码

python 复制代码
# 最新官方标准导入写法
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_ollama import OllamaLLM

# 废弃旧版导入写法(仅作参考,不推荐使用)
# from langchain.prompts import PromptTemplate, FewShotPromptTemplate
# from langchain.llms import Ollama

# 初始实例化本地大模型
model = OllamaLLM(model="qwen:7b")

1)、Zero-Shot 零样本提示词

零样本模式---不提供任何参考案例,仅依靠基础提示模板与模型自身知识库完成任务,是最简单的提示词使用方式。

ini 复制代码
# 自定义基础文本模板
template = "给出单词{word}的反义词"
# 初始化模板,声明输入变量
prompt = PromptTemplate(input_variables=["word"], template=template)
# format方法填充占位变量,生成完整提示词
prompt_text = prompt.format(word="tall")
# 调用模型获取结果
result = model.invoke(prompt_text)
print("Zero-Shot输出结果:", result)
  1. prompt.format() :该方法核心作用为模板占位符填充,将{变量名}预设占位位置通过format(变量名=传入值),精准替换占位符,拼接后完成格式化,将拼接后的完整模版传入大模型的提示语句。
  2. input_variables 参数:该参数接收列表格式数据,属于模板声明参数,用于提前定义模板内所有占位变量名称,支持定义单个或多个变量,变量数量与模板内占位符一一对应即可。
  3. template=template 参数释义 等号左侧templatePromptTemplate类内置固定形参,右侧是开发者自定义编写的模板字符串变量,该写法本质是将自定义文本模板传入模板类完成初始化。

拓:多变量模板用法

ini 复制代码
# 双变量模板
multi_template = "单词:{word},词性:{pos},请精准给出对应反义词"
multi_prompt = PromptTemplate(input_variables=["word", "pos"], template=multi_template)
# 同时填充两个变量
multi_prompt_text = multi_prompt.format(word="happy", pos="形容词")
print("多变量拼接提示词:", multi_prompt_text)

2)、One-Shot 单样本提示词

One-Shot 属于 Few-Shot 的特例,仅向模型提供一组参考案例,约束模型模仿案例格式完成输出。

核心基础知识点梳理

  1. FewShotPromptTemplate 五大核心参数
  • examples:存放示范案例,传入 1 组案例为 One-Shot,传入多组案例为 Few-Shot;
  • example_prompt:定义示范案例固定输出格式;
  • prefix:提示词前缀,用于统一规定模型执行规则;
  • suffix:提示词后缀,预留最终提问占位位置;
  • input_variables:声明后续用户输入的自定义变量。
ini 复制代码
# 定义单组示范案例
one_examples = [{"word": "tall", "antonym": "short"}]
# 定义案例统一排版模板
example_prompt = PromptTemplate(input_variables=["word", "antonym"], template="单词:{word},反义词:{antonym}")

# 组装少样本提示词模板
one_shot_prompt = FewShotPromptTemplate(
    examples=one_examples,
    example_prompt=example_prompt,
    prefix="严格遵循下方案例格式输出答案",
    suffix="单词:{input},反义词:",
    input_variables=["input"]
)
# 填充自定义提问内容
final_prompt = one_shot_prompt.format(input="big")
print("One-Shot输出结果:", model.invoke(final_prompt))

3)、Few-Shot 少样本提示词

向模型传入两组及以上参考案例,进一步规范模型输出格式、统一回答风格,在格式约束类场景使用频率最高。

ini 复制代码
# 定义多组示范案例
few_examples = [
    {"word": "tall", "antonym": "short"},
    {"word": "fast", "antonym": "slow"},
    {"word": "happy", "antonym": "sad"}
]

# 复用案例格式模板
few_shot_prompt = FewShotPromptTemplate(
    examples=few_examples,
    example_prompt=example_prompt,
    prefix="严格遵循案例格式,简洁输出单词反义词",
    suffix="单词:{input},反义词:",
    input_variables=["input"]
)
# 填充目标提问单词
few_final_prompt = few_shot_prompt.format(input="two")
print("Few-Shot输出结果:", model.invoke(few_final_prompt))

总结

  1. 组件划分:提示词模板统一从langchain-core导入,本地 Ollama 系列模型统一从独立包langchain-ollama导入,架构划分清晰,维护性更强;
  2. 使用区分:Zero-Shot 依托基础PromptTemplate实现,无任何参考案例;One-Shot 与 Few-Shot 统一使用FewShotPromptTemplate实现,仅通过案例数量进行区分;
  3. 核心逻辑:依靠input_variables声明占位变量,借助format方法完成文本填充,最终拼接完整提示词传入invoke方法调用模型;
  4. 场景选型:简单通用任务选用 Zero-Shot,需要规范输出格式的业务场景,优先使用 One-Shot 或 Few-Shot 提示词
相关推荐
贵慜_Derek10 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
Duang10 小时前
我把 Claude、Codex、Copilot、Gemini 拼成了一个工作流,接力写代码
人工智能·程序员·架构
白露与泡影10 小时前
轻量级微服务发布系统:Traefik + Nomad + Consul
微服务·架构·consul
humcomm10 小时前
如何利用AI进行智能监控
人工智能·架构
踩着两条虫11 小时前
AI 低代码引擎可视化设计器交互机制实战
前端·vue.js·人工智能·低代码·架构
珠海西格电力11 小时前
零碳园区的能源成本优势具体体现在哪些方面
大数据·人工智能·算法·架构·能源
heimeiyingwang11 小时前
【架构实战】监控告警Prometheus+Grafana:让系统问题无处遁形
架构·grafana·prometheus
小短腿的代码世界12 小时前
QCefView架构深度解析:从Chromium嵌入到Qt信号槽集成的完整技术链路
qt·架构