LangChain提示词模板
提示词模板(Prompt Template)是 LangChain 的核心概念之一。它允许你将提示词中的固定部分和动态变量分离开来,写出可复用的提示词。
1. ChatPromptTemplate
ChatPromptTemplate 是最常用的模板类型,对应聊天模型的消息格式。
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的{role},请用简洁的语言回答问题。"),
("human", "{question}"),
])
# 填入变量,生成最终的消息列表
messages = prompt.invoke({
"role": "Python 程序员",
"question": "什么是列表推导式?",
})
print(messages)
花括号 {变量名} 是占位符,调用 invoke() 时传入对应的值替换它们。
2. 与模型结合使用
将模板和模型用管道符 | 连接起来,形成一个处理链:
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
load_dotenv()
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位{language}编程专家。"),
("human", "请解释一下:{concept}"),
])
llm = ChatOpenAI(model="gpt-4o-mini")
chain = prompt | llm
response = chain.invoke({
"language": "Python",
"concept": "生成器(Generator)",
})
print(response.content)
prompt | llm 创建了一个链:先由模板生成消息,再传给模型处理。这是 LangChain 表达式语言(LCEL)的基础用法。
3. 多轮对话模板
可以在模板中加入历史消息,实现多轮对话效果:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位友善的助手。"),
MessagesPlaceholder(variable_name="history"), # 历史消息占位符
("human", "{input}"),
])
messages = prompt.invoke({
"history": [
HumanMessage(content="我叫小明"),
AIMessage(content="你好,小明!很高兴认识你。"),
],
"input": "你还记得我叫什么吗?",
})
print(messages)
MessagesPlaceholder 是一个特殊占位符,用于插入一组消息(通常是对话历史)。
4. PromptTemplate(纯文本模板)
如果用的是纯文本类型的模型(非聊天格式),可以使用 PromptTemplate:
from langchain_core.prompts import PromptTemplate
template = PromptTemplate.from_template(
"将下面的文字从{source_lang}翻译成{target_lang}:\n\n{text}"
)
prompt = template.invoke({
"source_lang": "中文",
"target_lang": "英文",
"text": "你好,世界!",
})
print(prompt.text)
# 将下面的文字从中文翻译成英文:
#
# 你好,世界!
5. 部分填充(Partial)
有时某些变量是已知的固定值,可以提前填入,生成一个新的"部分模板":
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位{language}专家。"),
("human", "{question}"),
])
# 固定 language,得到一个只需要填 question 的新模板
python_prompt = prompt.partial(language="Python")
chain_response = python_prompt.invoke({"question": "什么是 GIL?"})
print(chain_response)
6. 示例选择器(Few-shot)
Few-shot 是指给模型提供几个示例,帮助它更好地理解你的需求:
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
load_dotenv()
examples = [
{"input": "开心", "output": "😊"},
{"input": "悲伤", "output": "😢"},
{"input": "愤怒", "output": "😡"},
]
example_prompt = ChatPromptTemplate.from_messages([
("human", "{input}"),
("ai", "{output}"),
])
few_shot_prompt = FewShotChatMessagePromptTemplate(
examples=examples,
example_prompt=example_prompt,
)
final_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个将情绪转换为表情符号的助手。"),
few_shot_prompt,
("human", "{input}"),
])
llm = ChatOpenAI(model="gpt-4o-mini")
chain = final_prompt | llm
response = chain.invoke({"input": "惊讶"})
print(response.content) # 输出类似 😮
总结
ChatPromptTemplate用于聊天模型,PromptTemplate用于纯文本模型- 用
{变量名}定义占位符,invoke()时传入字典填充 MessagesPlaceholder用来插入动态消息列表(如对话历史)partial()可以提前固定部分变量,得到更专用的模板- Few-shot 示例模板帮助模型理解输出格式