摘要Prompt不是随便写两句话就行。角色、任务、约束、输入字段四个要素缺一不可。本文用商品文案、学习计划、客服回复三个案例把PromptTemplate和ChatPromptTemplate的用法讲清楚。一、什么是PromptPrompt就是给模型的指令。简单版python介绍一下Python实际项目中会复杂得多python你是一个资深Python工程师请用通俗易懂的语言向初学者解释什么是装饰器要求不超过200字给出一个代码示例Prompt的质量直接决定输出的质量。二、为什么需要Prompt模板手写完整Prompt有几个问题代码里字符串太长看着费劲多个地方重复写类似提示词改一处要改好几处变量拼接容易出错引号、换行符经常搞乱后期维护困难改个规则要翻半天代码比如这种写法pythonprompt f你是一个{role}请帮我{task}要求{requirement}输入内容是{user_input}短的时候还行一旦提示词超过十行就不好维护了。LangChain提供了两种模板PromptTemplate和ChatPromptTemplate。三、PromptTemplate基本使用PromptTemplate适合普通文本提示词就是生成一段字符串。pythonfrom langchain.prompts import PromptTemplate template PromptTemplate( input_variables[product, target_audience], template你是一个营销专家请为{product}写一段广告文案目标用户是{target_audience}要求简洁有力。 ) prompt template.format(product智能手表, target_audience年轻上班族)模板里的{product}和{target_audience}会被实际数据替换。四、ChatPromptTemplate基本使用如果要使用system/human消息结构用ChatPromptTemplate。pythonfrom langchain.prompts import ChatPromptTemplate template ChatPromptTemplate.from_messages([ (system, 你是一个{role}请用{style}的语气回答问题。), (human, {user_input}) ]) prompt template.invoke({ role: 客服助手, style: 温和耐心, user_input: 我的订单什么时候发货 })ChatPromptTemplate生成的是消息列表适合聊天模型。后面所有案例都会用这个。两种模板的本质区别PromptTemplate生成纯文本字符串没有角色概念所有内容揉在一起。适合简单的文本生成任务。ChatPromptTemplate生成结构化的消息列表原生支持SystemMessage、HumanMessage、AIMessage。适合所有对话模型和智能体场景。建议优先用这个。五、Prompt编写建议第一阶段掌握四个原则就够了。明确角色告诉模型它是什么身份。python你是一个资深Java工程师有10年开发经验。角色决定了回答的语气、深度和专业方向。明确任务告诉模型具体要做什么。python请将以下代码重构为更简洁的写法并解释优化点。任务越具体输出越精准。明确约束告诉模型不能做什么、必须做到什么。python回答不超过100字不要使用专业术语必须给出具体例子。约束可以减少输出跑偏。给出输入字段让模型清楚知道每个变量代表什么。python商品名称{product_name}商品价格{price}目标人群{audience}这四个要素凑齐了Prompt基本不会太差。六、案例一商品文案生成器根据商品信息生成一段电商文案。新建 01_product_copywriter.pypythonfrom langchain.prompts import ChatPromptTemplate from utils.model_factory import get_deepseek_model model get_deepseek_model(temperature0.7) template ChatPromptTemplate.from_messages([ (system, 你是一个资深电商文案策划师擅长写打动人的商品描述。), (human, 请为以下商品写一段电商详情页文案。 商品名称{product_name} 商品卖点{features} 目标用户{target_audience} 价格{price} 要求 1. 字数150-200字 2. 开头用一句话吸引注意 3. 中间突出2-3个卖点 4. 结尾引导购买 5. 语气亲切但不浮夸 ) ]) prompt template.invoke({ product_name: 智能降噪蓝牙耳机, features: 主动降噪、40小时续航、佩戴舒适, target_audience: 通勤上班族, price: 499元 }) response model.invoke(prompt) print(response.content)七、减少重复代码封装模型初始化前面每个案例都要写一遍模型初始化可以抽到工具模块里。创建 utils/model_factory.pypythonfrom dotenv import load_dotenv from langchain.chat_models import init_chat_model import os load_dotenv() def get_deepseek_model(temperature0.5): return init_chat_model( modeldeepseek-v4-flash, model_provideropenai, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), temperaturetemperature )然后案例中直接调用pythonfrom utils.model_factory import get_deepseek_model model get_deepseek_model(temperature0.7)八、案例二学习计划生成器根据学习目标生成一份学习计划。新建 02_study_plan.pypythonfrom langchain.prompts import ChatPromptTemplate from utils.model_factory import get_deepseek_model model get_deepseek_model(temperature0.5) template ChatPromptTemplate.from_messages([ (system, 你是一个资深技术学习规划师擅长制定高效的学习路径。), (human, 请根据以下信息制定一份学习计划。 学习目标{goal} 当前水平{level} 可用时间{time_per_week}小时/周 学习周期{duration}周 要求 1. 按周拆解学习内容 2. 每周给出具体学习任务 3. 推荐2-3个学习资源 4. 给出阶段性的检验方式 5. 计划要可执行不要过于理想化 ) ]) prompt template.invoke({ goal: 成为一名合格的Python后端开发工程师, level: 学过Python基础语法写过一些小脚本, time_per_week: 10, duration: 12 }) response model.invoke(prompt) print(response.content)这个案例展示了Prompt可以接收多个变量而且变量可以是数字。九、案例三客服回复生成器根据用户问题和订单状态生成客服回复接近真实业务场景。新建 03_customer_reply.pypythonfrom langchain.prompts import ChatPromptTemplate from utils.model_factory import get_deepseek_model model get_deepseek_model(temperature0.3) template ChatPromptTemplate.from_messages([ (system, 你是一个电商客服主管擅长处理各种用户问题回复要专业、耐心、解决实际问题。), (human, 请根据以下信息生成客服回复。 用户问题{user_question} 订单号{order_id} 订单状态{order_status} 物流信息{logistics_info} 用户等级{user_level} 要求 1. 称呼用户为亲 2. 先安抚情绪再解决问题 3. 给出具体可操作的建议 4. 如果问题需要进一步处理说明下一步会做什么 5. 回复控制在100-150字 ) ]) prompt template.invoke({ user_question: 我的快递都三天没动了到底发没发货, order_id: OD20250115001, order_status: 已发货, logistics_info: 2025-01-16 已揽收2025-01-17 运输中最新状态到达武汉中转站, user_level: 黄金会员 }) response model.invoke(prompt) print(response.content)这个案例接近真实业务用户问题来自前端订单状态来自数据库物流信息来自第三方接口Prompt负责把这些信息组织起来生成回复。十、MessagesPlaceholderMessagesPlaceholder用来在ChatPromptTemplate中插入一组消息列表。普通变量{question}只能填充一段文本而MessagesPlaceholder可以一次插入多条消息比如聊天历史。导入方式pythonfrom langchain.prompts import ChatPromptTemplate, MessagesPlaceholder基本语法pythonChatPromptTemplate.from_messages([ (system, 你是一个问答助手), MessagesPlaceholder(variable_namehistory), (human, {question}) ])使用时传入历史消息列表pythonprompt template.invoke({ history: [ (human, 我叫小明), (ai, 你好小明有什么可以帮你的), (human, 我喜欢Python), (ai, Python是一门很棒的语言) ], question: 我叫什么名字 })最终消息顺序相当于system消息 - history中的4条消息 - 当前用户问题。参数说明variable_name占位符对应的变量名和invoke时传入的key保持一致。optional是否允许不传该变量。默认False不传会报错。如果历史可能为空设为True。n_messages限制插入最近多少条消息。比如设为4只取最后4条历史消息更早的丢弃。错误写法python# history不能是普通字符串 prompt template.invoke({ history: 我叫小明, # 错误 question: 我叫什么名字 })history必须是消息列表可以是tuple格式或LangChain消息对象。完整示例pythonfrom langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from utils.model_factory import get_deepseek_model model get_deepseek_model(temperature0.7) template ChatPromptTemplate.from_messages([ (system, 你是一个问答助手), MessagesPlaceholder(variable_namehistory, optionalTrue, n_messages4), (human, {question}) ]) prompt template.invoke({ history: [ (human, 我叫小明), (ai, 你好小明), (human, 我喜欢Python), (ai, Python很棒), (human, 我也用LangChain), (ai, LangChain很有用) ], question: 我叫什么名字 }) response model.invoke(prompt) print(response.content)这里n_messages4所以只插入最后4条历史消息从我喜欢Python开始更早的被丢弃然后追加当前问题。简写方式python# 这两种写法等价 (placeholder, {history}) MessagesPlaceholder(variable_namehistory)如果需要设置n_messages用显式写法。十一、常见问题Prompt越长越好吗不是。Prompt应该清晰完整但不要堆无关要求。要求越多模型越可能顾此失彼反而执行不稳定。模型没有完全按Prompt输出大模型不是传统程序不能保证百分百服从每一条指令。如果输出格式必须精确后续要结合结构化输出或程序校验。PromptTemplate和ChatPromptTemplate怎么选普通文本任务可以用PromptTemplate。所有聊天模型和智能体场景优先用ChatPromptTemplate。