提示词模板
提示词(Prompt)是与大语言模型交互的核心。好的提示词能让模型产出更准确、更有用的回答。本章将介绍 LangChain 中的提示词模板系统。
为什么需要提示词模板
直接拼接字符串存在的问题:
# ❌ 不推荐
prompt = f"你是一个{role},请回答:{question}"
# 问题:
# 1. 难以维护和复用
# 2. 没有参数验证
# 3. 无法追踪版本
# 4. 特殊字符处理麻烦
使用模板的好处:
# ✅ 推荐
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template(
"你是一个{role},请回答:{question}"
)
# 好处:
# 1. 参数自动验证
# 2. 易于复用和组合
# 3. 与 LangChain 组件无缝集成
# 4. 支持模板继承和扩展
基础提示词模板
PromptTemplate
最基础的字符串模板:
from langchain_core.prompts import PromptTemplate
# 方式一:from_template
prompt = PromptTemplate.from_template(
"请用{language}写一个{task}的程序"
)
# 方式二:显式指定变量
prompt = PromptTemplate(
template="请用{language}写一个{task}的程序",
input_variables=["language", "task"]
)
# 格式化
result = prompt.format(language="Python", task="冒泡排序")
print(result)
# 输出: 请用Python写一个冒泡排序的程序
ChatPromptTemplate
用于对话模型的模板:
from langchain_core.prompts import ChatPromptTemplate
# 方式一:使用元组
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role}"),
("human", "{input}")
])
# 方式二:使用消息类
from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是一个{role}"),
HumanMessagePromptTemplate.from_template("{input}")
])
# 格式化
messages = prompt.format_messages(role="翻译官", input="Hello")
消息占位符
使用 MessagesPlaceholder 插入动态消息列表:
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}")
])
# 使用
history = [
HumanMessage(content="我叫小明"),
AIMessage(content="你好小明!"),
]
messages = prompt.format_messages(
history=history,
input="你还记得我的名字吗?"
)
可选占位符
# 可选的历史消息
prompt = ChatPromptTemplate.from_messages([
("system", "你是助手"),
MessagesPlaceholder(variable_name="history", optional=True),
("human", "{input}")
])
# 不传 history 也可以
messages = prompt.format_messages(input="你好")
部分变量
预先填充部分变量:
from langchain_core.prompts import PromptTemplate
from datetime import datetime
prompt = PromptTemplate(
template="今天是{date},{name}你好!请回答:{question}",
input_variables=["name", "question"],
partial_variables={"date": datetime.now().strftime("%Y年%m月%d日")}
)
# 只需要提供剩余变量
result = prompt.format(name="小明", question="什么是AI?")
使用函数动态生成
def get_current_time():
return datetime.now().strftime("%H:%M:%S")
prompt = PromptTemplate(
template="当前时间:{time}。{question}",
input_variables=["question"],
partial_variables={"time": get_current_time}
)
Few-Shot 提示词
提供示例让模型学习:
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
# 定义示例
examples = [
{"input": "高兴", "output": "😊"},
{"input": "悲伤", "output": "😢"},
{"input": "愤怒", "output": "😠"},
]
# 示例格式模板
example_prompt = PromptTemplate(
template="输入: {input}\n输出: {output}",
input_variables=["input", "output"]
)
# Few-Shot 模板
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="将情绪词转换为表情符号:",
suffix="输入: {input}\n输出:",
input_variables=["input"]
)
result = prompt.format(input="惊讶")
print(result)
输出:
将情绪词转换为表情符号:
输入: 高兴
输出: 😊
输入: 悲伤
输出: 😢
输入: 愤怒
输出: 😠
输入: 惊讶
输出:
动态示例选择
根据输入选择最相关的示例:
from langchain_core.prompts import FewShotPromptTemplate
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 示例库
examples = [
{"input": "我今天很开心", "output": "正面"},
{"input": "这太糟糕了", "output": "负面"},
{"input": "天气不错", "output": "正面"},
{"input": "我很失望", "output": "负面"},
{"input": "产品质量很好", "output": "正面"},
]
# 创建示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
Chroma,
k=2 # 选择最相关的2个示例
)
# 创建 Few-Shot 模板
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=PromptTemplate(
template="文本: {input}\n情感: {output}",
input_variables=["input", "output"]
),
prefix="判断以下文本的情感倾向:",
suffix="文本: {input}\n情感:",
input_variables=["input"]
)
提示词组合
使用管道操作符
from langchain_core.prompts import PromptTemplate
# 基础模板
base = PromptTemplate.from_template("回答以下问题:{question}")
# 添加前缀
with_role = PromptTemplate.from_template(
"你是一个{role}。"
) + base
# 添加后缀
full = with_role + PromptTemplate.from_template(
"\n请用{language}回答。"
)
result = full.format(
role="Python专家",
question="什么是装饰器?",
language="简体中文"
)
PipelinePrompt
组合多个提示词:
from langchain_core.prompts import PipelinePromptTemplate, PromptTemplate
# 完整模板
full_template = PromptTemplate.from_template(
"""{introduction}
{example}
{question}"""
)
# 子模板
intro_template = PromptTemplate.from_template(
"你是一个{role},专门负责{task}。"
)
example_template = PromptTemplate.from_template(
"示例输入:{example_input}\n示例输出:{example_output}"
)
question_template = PromptTemplate.from_template(
"现在请处理:{user_input}"
)
# 组合
pipeline_prompt = PipelinePromptTemplate(
final_prompt=full_template,
pipeline_prompts=[
("introduction", intro_template),
("example", example_template),
("question", question_template),
]
)
result = pipeline_prompt.format(
role="代码审查员",
task="发现代码中的问题",
example_input="for i in range(10): print(i)",
example_output="代码正确,但建议添加注释",
user_input="x = 1/0"
)
提示词最佳实践
1. 角色设定
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个专业的{domain}专家。
你的特点:
- 回答准确、专业
- 使用通俗易懂的语言
- 适当举例说明
- 如果不确定,会明确说明"""),
("human", "{question}")
])
2. 输出格式指定
prompt = ChatPromptTemplate.from_template(
"""分析以下文本的情感。
文本:{text}
请按以下 JSON 格式输出:
{{
"sentiment": "正面/负面/中性",
"confidence": 0.0-1.0,
"keywords": ["关键词1", "关键词2"]
}}"""
)
3. 思维链(Chain of Thought)
prompt = ChatPromptTemplate.from_template(
"""请解决以下数学问题。
问题:{problem}
请按以下步骤思考:
1. 首先,理解问题要求什么
2. 然后,列出已知条件
3. 接着,确定解题方法
4. 最后,逐步计算并得出答案
让我们一步一步来:"""
)
4. 示例引导
prompt = ChatPromptTemplate.from_template(
"""将用户的描述转换为 SQL 查询。
示例1:
描述:查找所有年龄大于18岁的用户
SQL:SELECT * FROM users WHERE age > 18
示例2:
描述:统计每个部门的员工数量
SQL:SELECT department, COUNT(*) FROM employees GROUP BY department
现在请转换:
描述:{description}
SQL:"""
)
提示词保存与加载
保存到文件
from langchain_core.prompts import PromptTemplate
import json
prompt = PromptTemplate(
template="你是{role},请回答:{question}",
input_variables=["role", "question"]
)
# 保存为 JSON
prompt.save("my_prompt.json")
# 保存为 YAML
prompt.save("my_prompt.yaml")
从文件加载
from langchain_core.prompts import load_prompt
# 从 JSON 加载
prompt = load_prompt("my_prompt.json")
# 从 YAML 加载
prompt = load_prompt("my_prompt.yaml")
完整示例:智能写作助手
"""
智能写作助手 - 提示词模板示例
"""
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
load_dotenv()
# 写作风格示例
style_examples = {
"正式": [
{"input": "产品很好", "output": "该产品在各方面均表现出色,充分满足了用户的需求。"},
{"input": "我不同意", "output": "对于上述观点,本人持有不同意见,理由如下..."},
],
"轻松": [
{"input": "产品很好", "output": "这产品绝了!用过都说好~"},
{"input": "我不同意", "output": "emm...这个嘛,我有不同的看法哦~"},
],
"学术": [
{"input": "产品很好", "output": "经实证研究表明,该产品在多维度评估中均达到优良水平。"},
{"input": "我不同意", "output": "基于现有文献及研究数据,笔者对此观点持保留态度。"},
],
}
def create_writing_assistant(style: str = "正式"):
"""创建特定风格的写作助手"""
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
# 获取风格示例
examples = style_examples.get(style, style_examples["正式"])
# 创建示例模板
example_prompt = ChatPromptTemplate.from_messages([
("human", "{input}"),
("ai", "{output}")
])
# Few-Shot 模板
few_shot_prompt = FewShotChatMessagePromptTemplate(
examples=examples,
example_prompt=example_prompt,
)
# 完整模板
prompt = ChatPromptTemplate.from_messages([
("system", f"你是一个专业的写作助手,擅长{style}风格的文字表达。请根据用户的简短描述,扩写成{style}风格的完整句子或段落。"),
few_shot_prompt,
("human", "{input}")
])
return prompt | llm | StrOutputParser()
def main():
print("=== 智能写作助手 ===\n")
user_input = "这个方案有问题"
for style in ["正式", "轻松", "学术"]:
chain = create_writing_assistant(style)
result = chain.invoke({"input": user_input})
print(f"【{style}风格】")
print(f"原文:{user_input}")
print(f"改写:{result}\n")
if __name__ == "__main__":
main()
小结
本章介绍了:
✅ 提示词模板的基本使用
✅ ChatPromptTemplate 和 MessagesPlaceholder
✅ 部分变量和动态变量
✅ Few-Shot 提示词和示例选择
✅ 提示词组合和管道
✅ 提示词设计最佳实践
✅ 提示词保存与加载
下一步
基础篇到此结束!接下来进入进阶篇,学习如何使用链式调用构建更复杂的应用。
练习
- 设计一个用于代码生成的提示词模板
- 实现一个支持多语言的翻译提示词
- 创建一个带有示例选择的问答系统
- 尝试使用思维链提示词解决复杂问题