4. 提示词模板LangChain
提示词工程的基石:LangChain 提示词模板的艺术与实践
在 LLM 应用开发中,提示词(Prompt)是核心。但如果直接将提示词硬编码在代码中,会导致代码混乱、难以维护、不易优化。
- LangChain 的解决方案: LangChain 的
PromptTemplate模块提供了一套标准、动态、可复用的机制,将提示词工程从业务逻辑中解耦出来,使开发者能像管理配置文件一样管理和迭代提示词。
4.1 PromptTemplate 的本质
提示词模板是 LangChain 对提示词工程的抽象化 和结构化。
- 定义:
PromptTemplate本质上是一个包含变量 和固定文本的字符串。它允许您将静态的指令、角色定义、以及格式要求与动态的用户输入(或中间结果)完美地结合起来。 - 作用: 它是 LLM 应用中连接数据 和模型的桥梁,确保每次对 LLM 的调用都能接收到格式正确且上下文丰富的输入。
4.2 LangChain 模板的优势
| 优势点 | 详细描述 | 实际价值 |
|---|---|---|
| 可复用性 (Reusability) | 一旦定义了模板,就可以在应用的不同部分,甚至不同的 Chain 中重复使用。 | 提升开发效率,确保提示词风格和要求的一致性。 |
| 动态输入 (Dynamic Inputs) | 模板允许运行时注入变量,例如用户的提问、检索到的文档片段、或对话历史等。 | 使提示词能根据实时数据变化,实现上下文感知的交互。 |
| 工程化管理 (Engineering) | 将提示词从 Python/JavaScript 代码中分离出来,便于版本控制、审计和A/B测试。 | 将提示词工程(Prompt Engineering)变成一个可管理的软件资产。 |
| 类型抽象 (Abstraction) | LangChain 提供多种模板类型(如 PromptTemplate、ChatPromptTemplate),以适应不同模型类型(文本模型 vs. 聊天模型)。 |
开发者无需关心底层模型如何区分"系统指令"、"用户消息"和"助手回复"。 |
4.3 提示模板类型
| 序号 | 提示模板类型 | 含义 / 功能 / 用途 | 关键参数 / 特点 | 备注 / 在官方文档中的定位 / 限制 |
|---|---|---|---|---|
| 1 | PromptTemplate | 最基础的字符串模板。用于将若干输入参数填入模板中,生成一条完整的 prompt 字符串 | template(模板字符串)、input_variables、partial_variables、template_format(如 f-string、jinja2、mustache) LangChain+2LangChain+2 |
在官方 API 参考中有清晰定义。可用 PromptTemplate.from_template(...) 构造。 LangChain |
| 2 | ChatPromptTemplate | 用于构建对话/聊天风格的提示,由多条消息 (system / human / ai) 组成 | 通常由若干消息模板组成,如 SystemMessagePromptTemplate、HumanMessagePromptTemplate 等;接收 input variables 用于格式化各条消息 LangChain+2python.langchain.com.cn+2 |
在 LangChain 的 "Prompt Templates" 概念页有说明:ChatPromptTemplate 用来格式化一系列消息以交给聊天模型。 LangChain |
| 3 | FewShotPromptTemplate | 在 prompt 中插入若干示例 (few-shot examples) 来"教"模型如何回答 | example_prompt(单个示例模板)、examples 或 example_selector、prefix、suffix、example_separator、input_variables 等 LangChain+2python.langchain.com.cn+2 |
在官方 API Reference 有定义 FewShotPromptTemplate。 LangChain |
| 4 | PipelinePrompt / PipelinePromptTemplate | 用于把多个子提示模板按顺序组合起来,最终生成一个整体 prompt | final_prompt(最终模板),pipeline_prompts(一个由 (name, 子模板) 组成的列表) python.langchain.com.cn+1 |
在 LangChain 中文组合文档中称为 PipelinePrompt(或 PipelinePromptTemplate),用于重用、组合提示模板。 python.langchain.com.cn |
| 5 | 自定义模板 | 用户可以继承现有模板类(如继承 StringPromptTemplate、BaseChatPromptTemplate 等)来自定义自己的逻辑 |
通常要实现模板渲染逻辑(format/invoke 等方法)、变量管理、可能自定义流程 |
在 LangChain 官方文档中虽不一定有专门一节叫 "自定义模板",但在 "Prompt 组合 / 扩展" 相关章节有提及;在中文翻译或社区资料中,也有 "自定义模板" 的说法。 知乎专栏+2千帆大模型平台+2 |
4.4 代码应用示例
4.4.1 客服助手
这段代码演示了如何使用 LangChain 框架构建一个基于 OpenAI 聊天模型 的客服助手,并清晰地展示了 ChatPromptTemplate 的工程化使用流程。

具体代码如下
from langchain_openai import ChatOpenAI
from langchain.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
# 定义模型
llm = ChatOpenAI(model_name="gpt-4o-mini")
# 定义 Prompt 模板
template = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是 {product} 的客服助手,你的名字叫 {name}"),
HumanMessagePromptTemplate.from_template("{query}")
])
# 格式化 Prompt
prompt = template.format_messages(
product="智能家居",
name="小傻子",
query="你是谁?"
)
# 打印 Prompt
print(prompt)
# 调用模型
response = llm.invoke(prompt)
# # 打印结果
# print(response)
print(response.content)
4.4.2 多语言翻译专家
这段代码使用 LangChain 框架,构建了一个复杂的动态、多任务翻译工作流。它通过提示词模板(Prompt Templates)将 LLM 打造成一个"多语言翻译专家",能够根据每次请求的不同参数(输入语言、输出语言、翻译风格)动态地生成提示词,并循环执行多个定制化的翻译任务。

具体代码如下
from langchain.prompts import (
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain_openai import ChatOpenAI
# 定义 System 提示模板
system_template_text = (
"你是一位多语言超译专家,能够将 {input_language} 翻译成 {output_language},"
"并根据用户指定的风格 {style} 输出自然流畅、符合语境的译文。"
)
system_prompt_template = SystemMessagePromptTemplate.from_template(system_template_text)
# 定义 Human 提示模板
human_template_text = "原文内容:{text}"
human_prompt_template = HumanMessagePromptTemplate.from_template(human_template_text)
# 定义模型
llm = ChatOpenAI(model="gpt-4o-mini")
# 多组输入
requests = [
{
"input_language": "英语",
"output_language": "汉语",
"text": "I'm so hungry I could eat a horse",
"style": "文言文"
},
{
"input_language": "法语",
"output_language": "英语",
"text": "Je suis désolé pour ce que tu as fait",
"style": "古英语"
},
{
"input_language": "俄语",
"output_language": "意大利语",
"text": "Сегодня отличная погода", # 正确俄语写法
"style": "网络用语"
},
{
"input_language": "韩语",
"output_language": "日语",
"text": "오늘은 정말 좋은 날이에요", # 韩语:今天真是好日子
"style": "俚语"
}
]
# 循环执行每个请求
results = []
for req in requests:
system_prompt = system_prompt_template.format(
input_language=req["input_language"],
output_language=req["output_language"],
style=req["style"]
)
human_prompt = human_prompt_template.format(text=req["text"])
response = llm.invoke([system_prompt, human_prompt])
results.append({
"输入语言": req["input_language"],
"输出语言": req["output_language"],
"风格": req["style"],
"原文": req["text"],
"译文": response.content.strip()
})
# 输出结果
print("\\n===== 翻译结果 =====")
for r in results:
print(f"\\n {r['输入语言']} {r['输出语言']} (风格:{r['风格']})")
print(f"原文:{r['原文']}")
print(f"译文:{r['译文']}")