PromptTemplate纯文本模板
PromptTemplate,纯文本模板,普通字符串,单轮文本问答、补全类模型、非对话场景。
from langchain_core.prompts import PromptTemplate
# PromptTemplate
# from_template: 自动提取变量名
prompt1=PromptTemplate.from_template("请用{language}写一个关于{topic}的{style}文章,大约{count}字。")
print(prompt1.input_variables) # ['language', 'topic', 'style', 'count']
formatted1=prompt1.format_prompt(language="中文",topic="外星人",style='科普',count='500')
print(formatted1)
# 构造函数方式
prompt2 = PromptTemplate(
input_variables=["name", "age"],
template="你好,我叫{name},今年{age}岁。"
)
print(prompt2.input_variables)
formatted2 = prompt2.format_prompt(name="小离",age=40)
print(formatted2)
# jinja2 模板格式
# pip install jinja2
prompt3 = PromptTemplate(
input_variables=["items"],
template="{% for item in items %}- {{ item }}\n{% endfor %}",
template_format="jinja2",
)
print(prompt3.format(items=["苹果", "香蕉", "橙子"]))
# partial:预填充部分变量
prompt4 = PromptTemplate.from_template("你是一个{role}。请回答:{question}")
translator_prompt4 = prompt4.partial(role="翻译专家")
print(translator_prompt4.format(question="hello 怎么翻译?"))
ChatPromptTemplate对话消息模板
ChatPromptTemplate,对话消息模板,聊天模型(ChatGPT/DeepSeek/ 通义千问等)、多轮对话,角色 + 内容(system/human/ai)。
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage,AIMessage
# ChatPromptTemplate
## 元祖格式
prompt1=ChatPromptTemplate.from_messages([
("system","你是一个{role},回答要{style}。"),
("human","question")
])
messages1=prompt1.format_prompt(role="Python专家",style="通俗",question="什么是装饰器?")
print(messages1)
# 消息类
prompt2=ChatPromptTemplate.from_messages([
HumanMessage(content="请将以下文本翻译成{language}:{text}")
])
messages2=prompt2.format_prompt(language="中文",text="hello")
print(messages2)
# from_template快捷方法
prompt3 = ChatPromptTemplate.from_template("请解释{concept}")
messages3=prompt3.format_prompt(concept="外星人")
print(messages3)
MessagesPlaceholder消息占位符
MessagesPlaceholder,消息占位符,承接历史对话上下文、动态插入多条消息,嵌入消息列表。
# demo_messages_placeholder.py
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的 AI 助手。"),
MessagesPlaceholder(variable_name="chat_history"), # 插入对话历史
("human", "{user_input}"),
])
chat_history = [
HumanMessage(content="我叫小明"),
AIMessage(content="你好小明!"),
]
messages1 = prompt.format_messages(
chat_history=chat_history,
user_input="我叫什么名字?"
)
# AI 能从历史中知道用户叫小明
print(messages1)
# 可选占位符
prompt2 = ChatPromptTemplate.from_messages([
("system", "你是一个客服机器人。"),
MessagesPlaceholder(variable_name="history", optional=True),
("human", "{question}"),
])
messages2 = prompt2.format_messages(question="你好") # 不提供 history 也可以
print(messages2)
# partial方法
# 创建时预填充
prompt3 = ChatPromptTemplate(
messages=[
("system", "你是一个{role},使用{language}回答。"),
("human", "{question}"),
],
partial_variables={"role": "编程专家", "language": "中文"}
)
messages3 = prompt3.format_messages(question="什么是Python?")
print(messages3)
# 运行时预填充
teacher_prompt4 = prompt3.partial(role="老师")
messages4 = teacher_prompt4.format_messages(question="什么是光合作用?")
print(messages4)
完整运行代码
import os
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
from langchain_deepseek import ChatDeepSeek
load_dotenv()
# 代码审查助手
code_review_prompt = ChatPromptTemplate.from_messages([
("system", "你是一位资深代码审查专家。请审查代码的质量、安全性和性能。"),
("human", "请审查以下 {language} 代码:\n```{language}\n{code}\n```"),
])
model=ChatDeepSeek(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url=os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com"),
model="deepseek-chat",
temperature=0
)
chain = code_review_prompt | model
result = chain.invoke({"language": "Python", "code": "def add(a, b): return a + b"})
print(result.content)
# 带对话历史的翻译助手
translation_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业翻译。翻译成{target_language}。只输出翻译结果。"),
MessagesPlaceholder(variable_name="history", optional=True),
("human", "{text}"),
])
chain = translation_prompt | model
result = chain.invoke({"target_language": "英文", "text": "今天天气真好", "history": []})
print(result.content)