【个人主页:玄同765】
大语言模型(LLM)开发工程师 |中国传媒大学·数字媒体技术(智能交互与游戏设计)
**深耕领域:**大语言模型开发 / RAG知识库 / AI Agent落地 / 模型微调
**技术栈:**Python / LangChain/RAG(Dify+Redis+Milvus)| SQL/NumPy | FastAPI+Docker ️
**工程能力:**专注模型工程化部署、知识库构建与优化,擅长全流程解决方案
「让AI交互更智能,让技术落地更高效」
欢迎技术探讨/项目合作! 关注我,解锁大模型与智能交互的无限可能!
引言
当你用大模型开发应用时,是否曾被这些问题困扰:
- 手写的字符串提示词复用性差,改一个参数要修改所有相关代码
- 复杂对话场景下,手动拼接系统消息、用户历史、当前问题容易出错
- 想让模型模仿特定风格,手动编写示例提示词繁琐且不规范
- 生产环境中,提示词的版本管理、调试、优化无从下手
LangChain v1.0+ 提供了一套结构化、参数化、可扩展的提示词模板体系,覆盖从基础文本生成到复杂对话、少样本学习、RAG 等所有场景。本文将全面解析 LangChain v1.0+ 的所有提示词模板种类,帮你快速找到适合自己需求的模板,打造精准可控的大模型交互。
前置准备:快速搭建运行环境
1. 安装依赖
# 安装核心依赖(v1.0+版本)
pip install langchain-core langchain-openai langchain-community python-dotenv
# 可选:安装LangSmith用于调试监控
pip install langsmith
2. 配置环境变量
# Windows(PowerShell)
$env:OPENAI_API_KEY="your-openai-api-key"
$env:LANGCHAIN_API_KEY="your-langsmith-api-key" # 可选
$env:LANGCHAIN_PROJECT="prompt-templates-demo" # 可选
$env:LANGCHAIN_TRACING_V2="true" # 启用LangSmith追踪
一、基础文本模板:从手写字符串到参数化复用
1.1 PromptTemplate:最核心的参数化模板
核心用途:将静态提示词转化为参数化模板,支持动态填充变量,是所有模板的基础。
from dotenv import load_dotenv
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
load_dotenv()
# 初始化LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
# 1. 从模板字符串创建
prompt = PromptTemplate.from_template(
"请为{product}写一句{style}风格的广告语,不超过{max_length}字。"
)
# 2. 基础调用:format返回字符串
formatted_str = prompt.format(product="智能手表", style="科技感", max_length=20)
print(f"格式化字符串:{formatted_str}")
# 3. invoke返回结构化结果(LangChain v1.0+ 标准接口)
structured_output = prompt.invoke({
"product": "智能手表",
"style": "科技感",
"max_length": 20
})
print(f"结构化输出:{structured_output}")
# 4. 预填充部分变量
partial_prompt = prompt.partial(max_length=20)
result = partial_prompt.invoke({"product": "智能手表", "style": "科技感"})
print(f"预填充结果:{result}")
# 5. LCEL 流水线集成 (推荐方式)
chain = prompt | llm
response = chain.invoke({
"product": "智能手表",
"style": "科技感",
"max_length": 20
})
print(f"LCEL链结果:{response.content}")
适用场景:所有需要参数化提示词的场景,比如文本生成、摘要、翻译等。
1.2 Prompt 组合(Prompt Composition)
在 LangChain v1.0+ 中,最推荐的组合 Prompt 的方式是使用 + 运算符。这比之前的 PipelinePromptTemplate 更加直观和简洁。
from dotenv import load_dotenv
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 1. 定义角色部分
role_prompt = PromptTemplate.from_template("你是一名{role}专家,擅长{domain}领域。")
# 2. 定义任务部分
task_prompt = PromptTemplate.from_template("请针对以下背景执行任务:{task}")
# 3. 组合 Prompt(使用 + 运算符)
full_prompt = role_prompt + "\n\n" + task_prompt
# 4. 调用
chain = full_prompt | llm
response = chain.invoke({
"role": "广告语撰写",
"domain": "消费电子",
"task": "为智能手表写一句科技感广告语"
})
print(response.content)
注意 :
PipelinePromptTemplate在 v1.0+ 版本中已不再推荐使用,建议全面转向这种基于+运算符或 LCEL 管道的组合方式。
二、对话场景模板:适配 Chat 模型的消息式交互
2.1 ChatPromptTemplate:对话场景的核心模板
核心用途 :基于消息对象(SystemMessage、HumanMessage等)构建提示词,完美适配 ChatGPT、Claude 等对话模型。
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 1. 从消息列表创建
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一名专业的广告语撰写师,擅长创作简洁有力的广告语。"),
("human", "请为{product}写一句{style}风格的广告语,不超过{max_length}字。")
])
# 2. 标准调用:invoke返回消息列表,可直接传入Chat模型
messages = chat_prompt.invoke({
"product": "智能手表",
"style": "科技感",
"max_length": 20
})
print(f"消息列表:{messages}")
# 3. LCEL 流水线集成
chain = chat_prompt | llm
response = chain.invoke({
"product": "智能手表",
"style": "科技感",
"max_length": 20
})
print(f"LCEL结果:{response.content}")
适用场景:所有对话场景,比如聊天机器人、客服系统、多轮对话交互等。
2.2 MessagesPlaceholder:动态插入对话历史(新版推荐做法)
⚠️ 重要提示 :
RunnableWithMessageHistory已被弃用,v1.0+ 推荐使用BaseChatMessageHistory直接管理或使用 LangGraph。
核心用途:在对话模板中预留位置,动态插入对话历史。
方式一:使用 BaseChatMessageHistory(推荐)
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from typing import Dict
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 1. 创建带占位符的对话模板
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一名友好的客服机器人,记住之前的对话内容。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}")
])
# 2. 会话存储
session_store: Dict[str, InMemoryChatMessageHistory] = {}
def get_session_history(session_id: str) -> InMemoryChatMessageHistory:
if session_id not in session_store:
session_store[session_id] = InMemoryChatMessageHistory()
return session_store[session_id]
# 3. 多轮对话函数
def chat_with_history(session_id: str, user_input: str) -> str:
# 获取会话历史
history = get_session_history(session_id)
# 构建消息列表
messages = chat_prompt.invoke({
"chat_history": history.messages,
"input": user_input
})
# 调用模型
response = llm.invoke(messages)
# 保存到历史
history.add_user_message(user_input)
history.add_ai_message(response.content)
return response.content
# 4. 多轮对话示例
print("=== 第一轮对话 ===")
response1 = chat_with_history("user_123", "你好,我想了解智能手表的功能。")
print(f"AI: {response1}")
print("\n=== 第二轮对话 ===")
response2 = chat_with_history("user_123", "它支持心率监测吗?")
print(f"AI: {response2}")
# 查看历史
print("\n=== 对话历史 ===")
history = get_session_history("user_123")
for msg in history.messages:
print(f"{msg.type}: {msg.content}")
方式二:使用 LangGraph(官方最推荐)
from dotenv import load_dotenv
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langgraph.checkpoint.memory import MemorySaver
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 1. 创建带占位符的对话模板
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一名友好的客服机器人。"),
MessagesPlaceholder(variable_name="messages"),
])
# 2. 定义状态
class State(TypedDict):
messages: Annotated[list, add_messages]
# 3. 创建工作流
workflow = StateGraph(State)
def chatbot(state: State):
"""聊天机器人节点"""
# 使用模板格式化消息
formatted_messages = chat_prompt.invoke({"messages": state["messages"]})
response = llm.invoke(formatted_messages)
return {"messages": [response]}
workflow.add_node("chatbot", chatbot)
workflow.set_entry_point("chatbot")
workflow.add_edge("chatbot", "chatbot") # 循环
# 4. 添加内存检查点
checkpointer = MemorySaver()
app = workflow.compile(checkpointer=checkpointer)
# 5. 运行(带线程ID实现会话隔离)
config = {"configurable": {"thread_id": "user_123"}}
# 第一轮
result = app.invoke(
{"messages": [SystemMessage(content="用户问题:你好,我想了解智能手表的功能。")]},
config=config
)
print(f"AI: {result['messages'][-1].content}")
# 第二轮(自动从检查点恢复状态)
result = app.invoke(
{"messages": [SystemMessage(content="用户问题:它支持心率监测吗?")]},
config=config
)
print(f"AI: {result['messages'][-1].content}")
适用场景:多轮对话系统,比如客服机器人、个人助手等需要上下文记忆的场景。
三、少样本学习模板:让模型快速模仿特定风格
3.1 FewShotPromptTemplate:文本场景的少样本模板
核心用途:在提示词中加入示例,让模型模仿示例的风格或逻辑,提升任务效果。
from dotenv import load_dotenv
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 定义示例
examples = [
{"product": "无线耳机", "style": "科技感", "ad_copy": "自由聆听,无拘无束"},
{"product": "智能音箱", "style": "温暖", "ad_copy": "语音交互,智享生活"},
{"product": "运动手环", "style": "专业", "ad_copy": "精准监测,科学运动"}
]
# 定义示例模板
example_prompt = PromptTemplate.from_template(
"产品:{product}\n风格:{style}\n广告语:{ad_copy}"
)
# 创建少样本模板
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="请参考以下示例,为新产品创作广告语:",
suffix="产品:{product}\n风格:{style}\n广告语:",
input_variables=["product", "style"],
example_separator="\n\n"
)
# 生成提示词并调用模型
chain = few_shot_prompt | llm
response = chain.invoke({"product": "智能手表", "style": "科技感"})
print(response.content)
适用场景:需要模型模仿特定风格或逻辑的任务,比如广告语生成、代码生成、问答等。
3.2 FewShotChatMessagePromptTemplate:对话场景的少样本模板
核心用途:在对话提示词中加入对话示例,让模型模仿对话风格或逻辑。
from dotenv import load_dotenv
from langchain_core.prompts import (
FewShotChatMessagePromptTemplate,
ChatPromptTemplate
)
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 定义对话示例
examples = [
{"input": "你好,我想了解智能手表的功能。", "output": "您好,智能手表支持心率监测、运动追踪、消息提醒等功能。"},
{"input": "它支持防水吗?", "output": "是的,智能手表支持50米防水,可佩戴游泳。"}
]
# 定义示例模板
example_prompt = ChatPromptTemplate.from_messages([
("human", "{input}"),
("ai", "{output}")
])
# 创建少样本对话模板
few_shot_chat_prompt = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples
)
# 构建最终对话模板
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一名专业的智能手表客服机器人。"),
few_shot_chat_prompt,
("human", "{input}")
])
# 生成提示词并调用模型
chain = chat_prompt | llm
response = chain.invoke({"input": "它支持心率监测吗?"})
print(response.content)
适用场景:对话机器人的风格模仿、客服系统的话术规范等。
3.3 SemanticSimilarityExampleSelector:语义相似示例选择器
核心用途:根据输入的语义从示例库中选择最相关的示例,提升少样本的精准度。
from dotenv import load_dotenv
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
load_dotenv()
# 1. 定义示例库
examples = [
{"product": "无线耳机", "style": "科技感", "ad_copy": "自由聆听,无拘无束"},
{"product": "智能音箱", "style": "温暖", "ad_copy": "语音交互,智享生活"},
{"product": "运动手环", "style": "专业", "ad_copy": "精准监测,科学运动"},
{"product": "智能手表", "style": "科技感", "ad_copy": "腕间智能,掌控未来"},
]
# 2. 定义示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
FAISS,
k=1 # 每次仅选择最相关的 1 个示例
)
# 3. 定义示例模板
example_prompt = PromptTemplate.from_template(
"产品:{product}\n风格:{style}\n广告语:{ad_copy}"
)
# 4. 创建少样本模板
few_shot_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="请参考最相关的示例,为新产品创作广告语:",
suffix="产品:{product}\n风格:{style}\n广告语:",
input_variables=["product", "style"]
)
# 使用示例
result = few_shot_prompt.invoke({"product": "智能手表", "style": "科技感"})
print(result)
适用场景:示例库较大,需要根据输入动态选择相关示例的场景。
四、高级动态模板:应对复杂多变的任务场景
4.1 RunnableBranch:条件分支的现代实现
核心用途:根据输入的条件动态选择不同的逻辑路径,取代了旧版非标准的条件模板。
from dotenv import load_dotenv
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnableBranch
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 定义不同的模板
tech_template = PromptTemplate.from_template("请用专业技术术语解释{topic}。")
general_template = PromptTemplate.from_template("请用通俗易懂的语言解释{topic}。")
# 使用 RunnableBranch 定义条件分支
branch = RunnableBranch(
(lambda x: x["user_type"] == "expert", tech_template),
general_template # 默认路径
)
# 构建完整链
chain = branch | llm
# 根据用户类型选择模板并执行
result = chain.invoke({
"topic": "大模型的注意力机制",
"user_type": "expert"
})
print(result.content)
适用场景:需要根据用户类型、任务类型等动态调整提示词的场景。
五、特殊场景模板:适配特定任务的专用模板
5.1 自然语言转 SQL:LCEL 灵活构建方案
核心用途 :以更透明的 LCEL 方式生成 SQL 查询,取代了旧版黑盒化的 SQLDatabaseChain。
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 1. 定义 SQL 生成提示词
sql_prompt = ChatPromptTemplate.from_template("""根据以下数据库模式编写一个 SQL 查询:
{schema}
问题:{question}
SQL 查询:""")
# 2. 模拟获取数据库结构的函数
def get_schema():
return """表:customers
- id (INT, 主键)
- name (VARCHAR, 客户姓名)
- email (VARCHAR, 邮箱地址)
- created_at (DATETIME, 创建时间)"""
# 3. 构建 LCEL 链
sql_chain = (
RunnablePassthrough.assign(schema=lambda _: get_schema())
| sql_prompt
| llm
| StrOutputParser()
)
# 4. 执行
response = sql_chain.invoke({"question": "查询所有客户的姓名和邮箱。"})
print(f"生成的 SQL: {response}")
适用场景:自然语言查询数据库、数据分析等需要与 SQL 交互的场景。
5.2 RAG 问答:LCEL 检索增强方案
核心用途:结合检索器与文档处理,通过 LCEL 实现端到端的 RAG 流程。
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini")
# 1. 准备示例文档
documents = [
"LangChain 是一个用于开发大模型应用的框架。",
"LangChain 提供了提示词模板、链、代理等组件。",
"RAG(检索增强生成)是 LangChain 的重要应用场景。"
]
# 2. 创建向量存储和检索器
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(documents, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
# 3. 定义 RAG 提示词
rag_prompt = ChatPromptTemplate.from_template("""请根据以下上下文回答问题:
{context}
问题:{question}
答案:""")
# 4. 文档格式化函数
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
# 5. 构建 RAG 链
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
# 6. 执行
response = rag_chain.invoke("LangChain 是什么?")
print(f"答案:{response}")
适用场景:需要基于自有知识库回答问题的场景,比如企业知识库问答、文档问答等。
六、最佳实践:高效使用 LangChain 提示词模板
6.1 模板复用:使用 LangChain Hub
LangChain Hub 提供了大量优质的提示词模板,可以直接拉取复用:
from langchain import hub
# 1. 从 Hub 拉取模板 (如 RAG 提示词)
prompt = hub.pull("rlm/rag-prompt")
# 2. 与 LLM 集成
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
chain = prompt | llm
6.2 调试与监控:使用 LangSmith
# 启用LangSmith(需要设置LANGCHAIN_API_KEY)
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
os.environ["LANGCHAIN_PROJECT"] = "prompt-templates-demo"
# 运行链,会自动上传数据到LangSmith
chain.invoke({"input": "你好,我想了解智能手表的功能。"})
6.3 性能优化
缓存提示词:
from langchain_core.globals import set_llm_cache
from langchain_community.cache import InMemoryCache
set_llm_cache(InMemoryCache())
批量处理:
results = chain.batch([
{"product": "智能手表", "style": "科技感", "max_length": 20},
{"product": "无线耳机", "style": "简约", "max_length": 20}
])
6.4 已弃用 API 及替代方案
| 已弃用 API | 替代方案 | 说明 |
|---|---|---|
RunnableWithMessageHistory |
BaseChatMessageHistory 或 LangGraph |
直接管理消息历史 |
PipelinePromptTemplate |
+ 运算符或 LCEL 管道 |
更直观的模板组合 |
ConversationChain |
ChatPromptTemplate + MessagesPlaceholder |
更灵活的消息管理 |
七、总结:LangChain 提示词模板的核心价值
LangChain v1.0+ 的提示词模板体系通过结构化、参数化、动态化的设计,解决了手写字符串提示词的诸多痛点,核心价值体现在:
- 复用性:参数化模板可重复使用,减少重复代码
- 维护性:模板与数据分离,便于修改和扩展
- 兼容性:统一适配所有 LLM 和 Chat 模型,无需为每个模型单独适配
- 扩展性:可与记忆、工具、输出解析器等组件无缝集成,构建复杂的大模型应用
- 可控性:通过少样本学习、动态模板等技术,提升模型输出的精准度和一致性
无论你是开发简单的文本生成应用,还是复杂的对话系统、RAG 应用,LangChain v1.0+ 的提示词模板都能帮你快速构建精准可控的大模型交互体验。掌握这些模板,你就能从"手写提示词的开发者"升级为"结构化大模型应用的架构师"!