Prompt组件及使用技巧
本目录涵盖LangChain中Prompt组件的核心使用方法,包括基础用法、拼接技巧和模板复用。 方便后续开发agent的时候,记住用户和大模型直接的对话,langchain涵盖多个大模型处理输入处理。
1. Prompt组件基础用法
核心组件
| 组件 | 说明 |
|---|---|
PromptTemplate | 基础字符串提示模板 |
ChatPromptTemplate | 聊天对话提示模板 |
MessagesPlaceholder | 消息占位符,用于动态插入历史消息 |
HumanMessagePromptTemplate | 人类消息模板 |
示例代码
from langchain_core.prompts import (
PromptTemplate,
ChatPromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder,
)
# 基础PromptTemplate
prompt = PromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
prompt_value = prompt.invoke({"subject": "程序员"})
# 输出方式
print(prompt.format(subject="喜剧演员")) # 格式化字符串
print(prompt_value.to_string()) # 转为字符串
print(prompt_value.to_messages()) # 转为消息列表
输出
请讲一个关于喜剧演员的冷笑话
请讲一个关于程序员的冷笑话
[HumanMessage(content='请讲一个关于程序员的冷笑话', additional_kwargs={}, response_metadata={})]
ChatPromptTemplate 完整示例
from langchain_core.messages import AIMessage
from langchain_core.prompts import (
PromptTemplate,
ChatPromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder,
)
from datetime import datetime
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,当前时间:{now}"),
MessagesPlaceholder("chat_history"), # 动态历史消息
HumanMessagePromptTemplate.from_template("请讲一个关于{subject}的冷笑话"),
]).partial(now=datetime.now()) # 预填充部分参数
chat_prompt_value = chat_prompt.invoke({
"chat_history": [
("human", "我叫慕小课"),
AIMessage("你好,我是ChatGPT"),
],
"subject": "程序员",
})
print(chat_prompt_value.to_string(), 'toString')
print(chat_prompt_value.to_messages(), 'toMessages')
输出
System: 你是OpenAI开发的聊天机器人,当前时间:2025-12-30 17:47:29.512705
Human: 我叫慕小课
AI: 你好,我是ChatGPT
Human: 请讲一个关于程序员的冷笑话 toString
[SystemMessage(content='你是OpenAI开发的聊天机器人,当前时间:2025-12-30 17:47:29.512705', additional_kwargs={}, response_metadata={}), HumanMessage(content='我叫慕小课', additional_kwargs={}, response_metadata={}), AIMessage(content='你好,我是ChatGPT', additional_kwargs={}, response_metadata={}), HumanMessage(content='请讲一个关于程序员的冷笑话', additional_kwargs={}, response_metadata={})] toMessages
关键方法
| 方法 | 说明 |
|---|---|
from_template() | 从字符串模板创建 |
invoke() | 传入参数生成PromptValue |
format() | 格式化为字符串 |
partial() | 预填充部分参数 |
2. 字符串提示拼接
使用 + 运算符直接拼接多个PromptTemplate。
from langchain_core.prompts import PromptTemplate
prompt = (
PromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
+ ",让我开心下" +
"\n使用{language}语言"
)
result = prompt.invoke({"subject": "程序员", "language": "中文"}).to_string()
输出结果:
请讲一个关于程序员的冷笑话,让我开心下
使用中文语言
3. 消息提示模板拼接
拼接多个ChatPromptTemplate,构建复杂对话结构。
from langchain_core.prompts import ChatPromptTemplate
# 系统消息模板
system_chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,我叫{username}"),
])
# 人类消息模板
human_chat_prompt = ChatPromptTemplate.from_messages([
("human", "{query}")
])
# 拼接
chat_prompt = system_chat_prompt + human_chat_prompt
result = chat_prompt.invoke({
"username": "慕小课",
"query": "你好,你是?"
})
print(result.to_string(), 'toString')
print(result.to_messages(), 'toMessages')
输出
System: 你是OpenAI开发的聊天机器人,我叫慕小课
Human: 你好,你是? toString
[SystemMessage(content='你是OpenAI开发的聊天机器人,我叫慕小课', additional_kwargs={}, response_metadata={}), HumanMessage(content='你好,你是?', additional_kwargs={}, response_metadata={})] toMessages
4. 复用提示模板(PipelinePromptTemplate) 低版本才有,高版本去除了
通过管道组合多个子模板,实现模块化和复用。
结构示意
┌─────────────────────────────────────┐
│ full_template │
│ ┌─────────────────────────────┐ │
│ │ {instruction} │ │
│ │ {example} │ │
│ │ {start} │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ pipeline_prompts │
│ instruction → instruction_prompt │
│ example → example_prompt │
│ start → start_prompt │
└─────────────────────────────────────┘
示例代码
from langchain_core.prompts import PromptTemplate, PipelinePromptTemplate
# 最终模板框架
full_template = PromptTemplate.from_template("""{instruction}
{example}
{start}""")
# 子模板1: 指令
instruction_prompt = PromptTemplate.from_template("你正在模拟{person}")
# 子模板2: 示例
example_prompt = PromptTemplate.from_template("""下面是一个交互例子:
Q: {example_q}
A: {example_a}""")
# 子模板3: 开始
start_prompt = PromptTemplate.from_template("""现在,你是一个真实的人,请回答用户的问题:
Q: {input}
A:"""")
# 组装管道
pipeline_prompts = [
("instruction", instruction_prompt),
("example", example_prompt),
("start", start_prompt)
]
pipeline_prompt = PipelinePromptTemplate(
final_prompt=full_template,
pipeline_prompts=pipeline_prompts,
)
# 调用
result = pipeline_prompt.invoke({
"person": "雷军",
"example_q": "你最喜欢的汽车是什么?",
"example_a": "小米su7",
"input": "你最喜欢的手机是什么?"
}).to_string()
输出结果:
你正在模拟雷军
下面是一个交互例子:
Q: 你最喜欢的汽车是什么?
A: 小米su7
现在,你是一个真实的人,请回答用户的问题:
Q: 你最喜欢的手机是什么?
A:
优势
- 模块化:每个子模板独立维护
- 复用性:子模板可在多个Pipeline中复用
- 可读性:复杂提示的结构更清晰
总结
| 技巧 | 适用场景 |
|---|---|
| PromptTemplate | 简单字符串提示 |
| ChatPromptTemplate | 对话场景,含多种消息类型 |
| MessagesPlaceholder | 动态插入历史消息 |