LangChain Prompt 模板保姆级教程:让大模型秒懂你的心
别再手写一坨坨的 Prompt 字符串了!LangChain 的模板功能让你的提示词优雅又好维护~
开篇碎碎念
你是否也曾写出过这种代码
prompt = f"请帮我为商品{name}写文案,它的卖点是{points},目标用户是{user},要求不超过{length}字,语气要{tone}..." # 字符串越来越长,越来越难维护...😭明明能用,但维护起来简直要命。改一个地方,满代码找半天。
别慌!LangChain 的 Prompt 模板来拯救你的代码洁癖了!
啥是 Prompt?
通俗点说,Prompt 就是你跟大模型说的话。
比如:
- "请用一句话介绍 LangChain。" —— 这是最简单的 Prompt
- "你是一名资深程序员,请用通俗易懂的语言解释什么是递归。" —— 这就复杂点了
Prompt 写得好,模型输出就像开了挂;Prompt 写得烂,输出能让你怀疑人生。
PromptTemplate:最简单的模板
想象一下,你有个模板:
请为商品 {商品名} 写一句广告语,突出卖点:{卖点}每次只需要填空就行:
from langchain_core.prompts import PromptTemplate 创建模板 template = PromptTemplate.from_template( "请为商品 {product_name} 写一句广告语,突出卖点:{selling_points}" ) 填空调用 prompt = template.invoke({ "product_name": "无线鼠标", "selling_points": "静音、续航长、轻便" }) print(prompt.text)输出:
请为商品 无线鼠标 写一句广告语,突出卖点:静音、续航长、轻便是不是像填空题一样简单?😄
ChatPromptTemplate:聊天模型的好搭档
现代大模型(GPT、Claude、通义千问等)都支持角色消息,这时候用ChatPromptTemplate更香:
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": "静音、灵敏、无延迟" })PromptTemplate vs ChatPromptTemplate
| 模板类型 | 输出格式 | 角色支持 | 推荐指数 |
|---|---|---|---|
| PromptTemplate | 纯文本字符串 | ❌ 无 | ⭐⭐⭐ |
| ChatPromptTemplate | 消息列表 | ✅ system/human/ai | ⭐⭐⭐⭐⭐ |
一句话总结:聊天模型用 ChatPromptTemplate 就对了!
Prompt 编写的"万能公式"
记住这个四件套,你的 Prompt 就不会太差:
1️⃣ 明确角色
你是一名资深电商运营专家。让模型知道"自己是谁",风格就稳了。
2️⃣ 明确任务
请根据商品信息生成详情页文案。别让模型猜你想要啥,直接说清楚。
3️⃣ 明确约束
要求: 1. 不超过 150 字 2. 不夸大宣传 3. 适合年轻用户规则越多,跑偏越少。
4️⃣ 明确输入
商品名称:{product_name} 商品卖点:{selling_points} 目标用户:{target_user}变量清清楚楚,模型一看就懂。
实战演练:三个拿来即用的案例
案例 1:商品文案生成器
import os from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain_core.prompts import ChatPromptTemplate load_dotenv() model = init_chat_model( model="deepseek-chat", model_provider="openai", base_url=os.getenv("DEEPSEEK_BASE_URL"), api_key=os.getenv("DEEPSEEK_API_KEY"), temperature=0.5 ) prompt_str = """ 请根据以下信息生成商品详情页文案: 商品名称:{product_name} 商品卖点:{selling_points} 目标用户:{target_user} 要求: 不超过 150 字 突出用户利益 不虚假夸张 """ chat_prompt = ChatPromptTemplate.from_messages([ ("system", "你是电商运营专家,擅长写自然有吸引力的商品文案"), ("human", prompt_str) ]) prompt = chat_prompt.invoke({ "product_name": "无线静音鼠标", "selling_points": "静音按键、蓝牙连接、续航30天", "target_user": "办公室和图书馆用户" }) response = model.invoke(prompt) print(response.content)一句话点评:角色 + 输入 + 约束 = 稳定输出 ✅
案例 2:学习计划生成器
prompt_template = ChatPromptTemplate.from_messages([ ("system", "你是一名编程老师,擅长制定可执行的学习计划。"), ("human", """ 请为我制定学习计划: 学习主题:{topic} 学习时长:{days} 天 每天学习:{hours_per_day} 小时 当前基础:{level} 要求: 按天列出学习内容 每天给出练习任务 内容适合当前基础 """) ]) prompt = prompt_template.invoke({ "topic": "LangChain 入门", "days": 5, "hours_per_day": 2, "level": "会 Python 基础" })小贴士:变量可以是数字哦~ 不一定是字符串!
案例 3:客服回复生成器
prompt_template = ChatPromptTemplate.from_messages([ ("system", "你是电商客服,回复礼貌明确,不推卸责任。"), ("human", """ 请根据以下信息生成客服回复: 用户问题:{user_question} 订单状态:{order_status} 物流信息:{shipping_info} 要求: 先安抚用户 再说明情况 最后给建议 不超过 120 字 """) ]) prompt = prompt_template.invoke({ "user_question": "我的快递三天没更新了,是不是丢了?", "order_status": "已发货", "shipping_info": "包裹已到上海转运中心" })业务价值:用户问题 → 数据库 → 第三方接口 → Prompt → 秒回用户!
进阶玩法:MessagesPlaceholder
当你需要插入聊天历史时,用MessagesPlaceholder:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个有用的助手。"), MessagesPlaceholder("history"), # 这里插入历史消息 ("human", "{question}"), ]) 调用时传入历史 prompt_value = prompt.invoke({ "history": [ ("human", "我叫小明"), ("ai", "你好小明!"), ], "question": "我叫什么名字?", })参数说明
| 参数 | 作用 |
|---|---|
optional=True | 允许不传 history,不报错 |
n_messages=4 | 只保留最近 4 条消息,防止 token 爆表 |
简写形式:
("placeholder", "{history}") # 等价于 MessagesPlaceholder("history", optional=True)封装技巧:告别重复代码
每个案例都写一遍模型初始化?太累了!
创建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() return init_chat_model( model="deepseek-chat", model_provider="openai", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url=os.getenv("DEEPSEEK_BASE_URL"), temperature=temperature, )以后一行搞定:
from model_factory import get_deepseek_model model = get_deepseek_model(temperature=0.5)常见问题快问快答
Q:Prompt 越长越好吗?
A:不是!要求太多反而会让模型顾此失彼,保持清晰就够了。
Q:为什么模型没完全按要求输出?
A:大模型不是程序,不能百分百服从。后续可以结合结构化输出做校验。
Q:PromptTemplate 和 ChatPromptTemplate 选哪个?
A:聊天模型优先用 ChatPromptTemplate!这是现代应用的标配。
总结划重点
| 知识点 | 一句话总结 |
|---|---|
| Prompt 本质 | 给模型的"任务说明书" |
| 模板好处 | 变量分离,复用 easy |
| PromptTemplate | 简单文本任务用 |
| ChatPromptTemplate | 聊天模型首选 |
| MessagesPlaceholder | 插入历史消息神器 |
| 编写公式 | 角色 + 任务 + 输入 + 约束 |
觉得有用的话,点个赞再走呗~ 你的鼓励是我持续输出的动力!🎉
有问题欢迎评论区唠两句,一起学习一起进步!
