摘要

提示词(Prompt)是调控大模型输出效果最直接的手段。原生字符串拼接难以维护、不利于项目迭代,LangChain 提供一套标准化提示模板组件实现提示词工程化管理。本文基于 LangChain1.0,详解PromptTemplate、ChatPromptTemplate核心差异与用法,深入讲解MessagesPlaceholder实现多轮对话上下文,附带商品文案、学习计划、智能客服三大可直接运行业务案例,带你掌握工业级提示词编写规范,搭建可复用、易维护的 AI 应用提示体系。


LangChain 1.0 提示词工程实战:Prompt 模板、多轮对话与业务场景落地

前言

在前两章节,我们已经完成基础环境搭建,掌握使用init_chat_model对接 DeepSeek 大模型、构建基础对话、保存简单对话历史。 在正式搭建业务 AI 应用前,我们必须攻克提示词(Prompt)工程。 很多新手直接使用 f-string 拼接字符串传递指令,在小型 Demo 尚可使用,但进入正式项目会暴露出大量维护难题。LangChain 提供标准化提示模板组件,实现固定指令与动态变量解耦,是开发企业级 AI 应用必备技能。

本章学习目标

学完本章内容,你将具备以下能力:

  • 理解 Prompt 在大模型应用中的核心作用
  • 区分普通字符串 Prompt 与模板化 Prompt 的优劣
  • 熟练使用PromptTemplate构建纯文本提示词
  • 掌握ChatPromptTemplate结构化消息模板(生产首选)
  • 实现模板动态变量注入
  • 遵循规范编写适配业务场景的高质量提示词
  • 掌握MessagesPlaceholder,实现多轮对话历史注入
  • 完成三大实战案例:商品文案生成、学习计划生成、智能客服回复

一、什么是 Prompt

Prompt 就是交给大模型的指令、上下文与输入信息,直接决定大模型输出的风格、格式、内容质量。

简单示例(极简 Prompt):

请用一句话介绍 LangChain。

业务场景下的复杂 Prompt:

你是一名电商运营专家。 请根据商品名称、商品卖点、目标用户,生成一段适合详情页展示的商品文案。 要求:

  1. 语气自然
  2. 不超过 150 字
  3. 突出用户利益

核心结论:Prompt 质量,直接决定大模型输出质量。

二、为什么需要 Prompt 模板

很多初学者习惯直接使用字符串插值拼接 Prompt,示例如下:

python

运行

prompt = f"请为商品 {product_name} 写一段文案,卖点是 {selling_points}"

这种写法存在诸多痛点:

  1. 提示文本过长时,代码可读性极差
  2. 多处业务复用相同指令,大量重复代码
  3. 字符串拼接极易产生语法、格式错误
  4. 后期修改提示规则,需要到处改动,维护成本高

解决方案:使用 LangChain 提示模板,将固定指令与动态变量彻底分离。

三、PromptTemplate 基础使用

PromptTemplate面向纯文本场景,用于构建无角色区分的单行 / 段落式提示词模板。 语法使用{变量名}作为占位符,调用时传入字典完成变量填充。

基础示例

python

运行

from langchain_core.prompts import PromptTemplate

# 定义模板
prompt_template = PromptTemplate.from_template(
    "请为商品 {product_name} 写一句广告语,突出卖点:{selling_points}"
)

# 注入变量
prompt = prompt_template.invoke(
    {
        "product_name": "无线鼠标",
        "selling_points": "静音、续航长、轻便",
    }
)

print(prompt.text)

模板内{product_name}、{selling_points}会被传入数据自动替换,最终生成完整文本字符串。

四、ChatPromptTemplate 基础使用【生产环境优先推荐】

现代对话大模型(DeepSeek、GPT、通义千问等)原生支持结构化消息:

  • System:系统指令(角色、约束、规则)
  • Human:用户提问
  • AI:模型历史回答

ChatPromptTemplate专门用来构建结构化消息列表,原生支持角色划分,模型更容易区分指令与用户输入,输出稳定性更强。

基础示例

python

运行

from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一名电商运营专家,回答要简洁、有吸引力。"),
        ("human", "请为商品 {product_name} 写一段文案,卖点是:{selling_points}"),
    ]
)

prompt = prompt_template.invoke(
    {
        "product_name": "无线鼠标",
        "selling_points": "静音、续航长、轻便",
    }
)
print(prompt)

PromptTemplate VS ChatPromptTemplate 核心差异

表格

组件结构适用场景优点
PromptTemplate生成一段纯文本字符串简单文本生成、非对话任务使用简单
ChatPromptTemplate结构化消息列表 [SystemMessage,HumanMessage]对话模型、智能体、多轮对话支持角色划分,输出更稳定,主流项目首选

重要提醒:传给聊天大模型时,优先使用ChatPromptTemplate。 不要把系统提示词、用户提问全部揉在一段文本中,极易造成模型混淆指令边界。

随堂完整演示代码

python

运行

from langchain_core.prompts import PromptTemplate

# 纯文本模板
prompt_template=PromptTemplate.from_template("请为商品 {product_name} 写一句广告语,突出卖点:{selling_points}")
prompt=prompt_template.invoke(
	{
		"product_name":"logi鼠标",
		"selling_points":"特别安静,灵敏,速度快,无延迟"
	}
)
print(prompt.text)

from langchain_core.prompts import ChatPromptTemplate
# 结构化对话模板
chat_template=ChatPromptTemplate.from_messages(
	[
		("system","你是一名电商运营专家,回答要简洁、有吸引力。"),
		("human","请为商品 {product_name} 写一段文案,卖点是:{selling_points}")
	]
)

prompt=chat_template.invoke(
	{
		"product_name":"logi鼠标",
		"selling_points":"特别安静,灵敏,速度快,无延迟"
	}
)
print(prompt)
# 获取用户消息内容
print(prompt.messages[1].content)

五、高质量 Prompt 通用编写规范

设计提示词遵循四大要素,可以显著提升输出可控性:

  1. 明确角色:定义模型身份,决定回答风格

    示例:你是一名电商运营专家

  2. 明确任务:清晰告知需要完成什么工作

    示例:根据商品名称和卖点生成一段详情页文案

  3. 明确约束条件:字数、格式、语气、禁止行为

    示例:不超过 150 字,禁止夸张宣传

  4. 规范输入字段:清晰定义每一项变量含义

    商品名称:{product_name};商品卖点:{selling_points}

六、三大业务实战案例

先进行工程优化:模型初始化重复代码抽取为工具类,避免每个 Demo 重复编写环境与模型配置。 新建 utils/model_factory.py

python

运行

# model_factory.py
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

def get_deepSeek_model(temperature:float=0.7):
	load_dotenv()
	model = init_chat_model(
		model="deepseek-v4-flash",
		model_provider="openai",
		base_url=os.getenv("DEEPSEEK_BASE_URL"),
		api_key=os.getenv("DEEPSEEK_API_KEY"),
		temperature=temperature
	)
	return model

案例一:商品文案生成器

文件名:01_product_copywriter.py

python

运行

import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from utils.model_factory import get_deepSeek_model

load_dotenv()
model=get_deepSeek_model(temperature=0.5)

prompt_str="""
请根据下面信息生成一段商品详情页文案。
商品名称:{product_name}
商品卖点:{selling_points}
目标用户:{target_user}

要求:
1. 不超过 150 字
2. 突出用户能获得的好处
3. 不要使用虚假夸张表达
"""
chat_promt_template=ChatPromptTemplate.from_messages([
	("system","你是一名电商运营专家,擅长写自然、有吸引力但不过度夸张的商品文案"),
	("human",prompt_str)
])
prompt=chat_promt_template.invoke({
	"product_name":"无线静音鼠标",
	"selling_points":"静音按键、蓝牙连接、续航 30 天、轻便便携",
	"target_user":"经常在办公室和图书馆使用电脑的人",
})

response=model.invoke(prompt)
print(response.content)

案例二:学习计划生成器

文件名:02_study_plan.py

python

运行

from langchain_core.prompts import ChatPromptTemplate
from utils.model_factory import get_deepSeek_model

model=get_deepSeek_model(0.5)
prompt_str="""
请为我制定一个学习计划。
学习主题:{topic}
学习时长:{days} 天
每天可学习时间:{hours_per_day} 小时
当前基础:{level}

要求:
1. 按天列出学习内容
2. 每天给出练习任务
3. 内容要适合当前基础
"""
chat_promt_template=ChatPromptTemplate.from_messages([
	("system","你是一名编程课程规划老师,擅长为初学者制定可执行的学习计划。"),
	("human",prompt_str)
])
prompt=chat_promt_template.invoke({
	"topic":"langchain",
	"days":"3",
	"hours_per_day":"1",
	"level":"会python基础"
})

response=model.invoke(prompt)
print(response.content)

案例三:智能客服回复生成器

文件名:03_customer_reply.py

python

运行

from langchain_core.prompts import ChatPromptTemplate
from utils.model_factory import get_deepSeek_model

model = get_deepSeek_model(0.7)
prompt_str = """
请根据用户问题和订单状态,生成一段客服回复。
用户问题:{user_question}
订单状态:{order_status}
物流信息:{shipping_info}

要求:
1. 先安抚用户
2. 再说明当前情况
3. 最后给出下一步建议
4. 不超过 120 字
"""
chat_promt_template = ChatPromptTemplate.from_messages([
	("system", "你是一名电商客服,回复要礼貌、明确,不推卸责任。"),
	("human", prompt_str)
])
prompt = chat_promt_template.invoke({
	"user_question": "我的快递三天没更新了,是不是丢了?",
	"order_status": "已发货",
	"shipping_info": "物流显示包裹已到达上海转运中心,暂未更新下一站信息"
})

response = model.invoke(prompt)
print(response.content)

七、MessagesPlaceholder 实现多轮对话上下文

7.1 组件作用

普通变量{question}仅能传入一段文本; MessagesPlaceholder可以一次性传入多条消息列表,多用于:

  • 注入多轮聊天历史
  • 注入 Agent 工具中间步骤消息
  • 批量插入一组预先构造好的对话消息

核心参数说明

python

运行

MessagesPlaceholder(
    variable_name="history", # 变量名称,invoke时对应key
    optional=True,           # 是否允许不传该变量
    n_messages=6,            # 最多保留最近N条消息,控制上下文长度
)

完整示例代码

python

运行

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from utils.model_factory import get_deepSeek_model

model=get_deepSeek_model(temperature=0.7)

chat_prompt=ChatPromptTemplate.from_messages(
	[
		("system","你是一个很棒的问答助手"),
		MessagesPlaceholder(variable_name="history",optional=True,n_messages=4),
		("human","{question}")
	]
)

prompt=chat_prompt.invoke({
	"history":[
		("human", "My name is Alice."),
		("ai", "Nice to meet you, Alice."),
		("human", "I like Python."),
		("ai", "Great choice."),
		("human", "I also use LangChain."),
		("ai", "LangChain is useful for LLM apps."),
	],
	"question":"我叫什么名字?"
})

resp=model.invoke(prompt)
print(resp.content)

注意要点:

  1. history 必须是列表,不能直接传入字符串;
  2. optional=False(默认)时,调用必须传入 history,否则报错;
  3. n_messages 自动截断历史消息,防止上下文超限。

简写方式(等价写法,无法配置 n_messages):

python

运行

("placeholder", "{history}")

八、本章重点总结

  1. Prompt 是传递给大模型的任务指令,直接影响输出效果;
  2. 标准 Prompt 结构:角色定义 + 任务描述 + 输入信息 + 约束规则;
  3. PromptTemplate:纯文本模板;ChatPromptTemplate:结构化消息模板,业务开发优先选用;
  4. 模板通过{变量名}实现动态内容注入,实现指令与数据解耦;
  5. MessagesPlaceholder用于批量插入消息列表,是实现多轮对话历史的核心组件;
  6. 项目开发中将模型初始化封装为工具函数,消除重复代码。

九、常见问题答疑

Q1:Prompt 写得越长效果越好吗?

A:不是。指令尽量清晰简洁,堆砌大量无关约束,会让模型难以兼顾所有要求,更容易输出偏离预期的结果。

Q2:模型经常没有严格遵守 Prompt 约束怎么办?

A:大模型具备概率特性,无法 100% 严格服从指令。如果业务对输出格式要求极高,后续需要结合输出解析器做结果校验与格式化处理,下一章节讲解。

Q3:如何选择 PromptTemplate 和 ChatPromptTemplate?

  • 简单纯文本生成任务:可使用 PromptTemplate
  • 所有对话模型、智能体、多轮交互场景:强制优先 ChatPromptTemplate

更多推荐