LangChain v1.0+ Prompt 模板完全指南:构建精准可控的大模型交互

【个人主页:玄同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:对话场景的核心模板

核心用途 :基于消息对象(SystemMessageHumanMessage等)构建提示词,完美适配 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+ 的提示词模板体系通过结构化、参数化、动态化的设计,解决了手写字符串提示词的诸多痛点,核心价值体现在:

  1. 复用性:参数化模板可重复使用,减少重复代码
  2. 维护性:模板与数据分离,便于修改和扩展
  3. 兼容性:统一适配所有 LLM 和 Chat 模型,无需为每个模型单独适配
  4. 扩展性:可与记忆、工具、输出解析器等组件无缝集成,构建复杂的大模型应用
  5. 可控性:通过少样本学习、动态模板等技术,提升模型输出的精准度和一致性

无论你是开发简单的文本生成应用,还是复杂的对话系统、RAG 应用,LangChain v1.0+ 的提示词模板都能帮你快速构建精准可控的大模型交互体验。掌握这些模板,你就能从"手写提示词的开发者"升级为"结构化大模型应用的架构师"!

相关推荐
Ryan老房2 小时前
开源vs商业-数据标注工具的选择困境
人工智能·yolo·目标检测·计算机视觉·ai
取个鸣字真的难2 小时前
Obsidian + CC:用AI 打造知识管理系统
人工智能·产品运营
困死,根本不会2 小时前
OpenCV摄像头实时处理:基于 HSV 颜色空间的摄像头实时颜色筛选工具
人工智能·opencv·计算机视觉
Shirley~~2 小时前
Vue-skills的中文文档
前端·人工智能
一只理智恩2 小时前
筹备计划·江湖邀请令!!!
python·langchain
华大哥2 小时前
AI大模型基于LangChain 进行RAG与Agent智能体开发
人工智能·langchain
Sagittarius_A*3 小时前
角点检测:Harris 与 Shi-Tomasi原理拆解【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉
子春一3 小时前
Flutter for OpenHarmony:构建一个 Flutter 井字棋游戏,深入解析状态驱动逻辑、胜利判定与极简交互设计
flutter·游戏·交互
困死,根本不会3 小时前
OpenCV实时摄像头处理:曝光调节、降噪与二值化实战
人工智能·opencv·计算机视觉