langchain从入门到精通(三)——Prompt组件及使用技巧
PromptTemplate:用于创建文本消息提示模板,用于用于与大语言模型/文本生成模型进行交互。ChatPromptTemplate:用于创建聊天消息提示模板,一般用于与聊天模型进行交互。MessagePlaceholder:消息占位符,在聊天模型中对不确定是否需要的消息进行占位。SystemMessagePromptTemplate:用于创建系统消息提示模板,角色为系统。HumanMessa
·
1. Prompt 组件的基本组成
大多数 LLM 应用程序都不会直接将用户输入传递给 LLM。通常,它们会将用户输入添加到一个更大的文
本片段中,称为提示模板,该模板提供有关特定任务的附加上下文。并且 Prompt 是所有 AI 应用交互的起点,例如在 LangChain 中一个最基础的聊天应用机器人的运行流程
如下:
- 为了适配不同的 LLM,LangChain 封装了 Prompt 组件,并且 Prompt 组件是高可移植性的,同一个Prompt 可以支持各种 LLM,在切换 LLM 的时候,无需修改 Prompt。
-在 LangChain 中,Prompt 被分成了两大类:
- Prompt Template:将 Prompt 按照 template 进行一定格式化,针对 Prompt 进行变量处理以及提示词的组合。
- Selectors:根据不同条件去选择不同提示词,或者在不同情况下通过 Selector,选择不同示例去进一步提高 Prompt 支持能力。本质上 Selectors 只是 Prompt Template 的二次封装。
1.1 Prompt Template
Prompt Template 是 LangChain 中最常用的 Prompt 类型,它的作用是:
用变量动态地填充提示词;
支持模板字符串、格式化、结构化提示;
结构清晰、可复用、易维护。
对于 Prompt Template,在 LangChain 中,又涵盖了多个子组件,例如:角色提示模板、消息占位符、文本提示模板、聊天消息提示模板、提示、消息等,Prompt Template 的运行流程如下:
1.2 不同 Prompt 组件功能的简介
- PromptTemplate:用于创建文本消息提示模板,用于用于与大语言模型/文本生成模型进行交
互。 - ChatPromptTemplate:用于创建聊天消息提示模板,一般用于与聊天模型进行交互。
- MessagePlaceholder:消息占位符,在聊天模型中对不确定是否需要的消息进行占位。
- SystemMessagePromptTemplate:用于创建系统消息提示模板,角色为系统。
- HumanMessagePromptTemplate:用于创建人类消息提示模板,角色为人类。
- AIMessagePromptTemplate:用于创建AI消息提示模板,角色为AI。
- PipelinePromptTemplate:用于创建管道消息,管道消息可以将提示模板作为变量进行快速复
用。
1.3 Prompt 不同方法的功能简介
- partial:用于格式化提示模板中的部分变量。
- format:传递变量数据,格式化提示模板为文本消息。
- invoke:传递变量谁,格式化提示模板为提示。
- to_string:将提示/消息提示列表转换成字符串。
- to_messages:用于将消息提示列表转换成字符串。
Prompt 中重载的运算符:
- +运算符:在 Prompt 组件中,对 + 运算符使用 add 方法进行重写,所以几乎所有 Prompt组件都可以使用 + 进行组装拼接。
2. 基本演示案例
2.1 Prompt组件基础用法
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import (
PromptTemplate,
ChatPromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder,
)
# 1️⃣ 单轮对话提示模板:生成一个关于某个主题的冷笑话
print("==== 单轮提示模板 ====")
joke_prompt = PromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
# 使用 format 方法直接填充变量
print(joke_prompt.format(subject="喜剧演员"))
# 使用 invoke 获取 PromptValue 对象(LangChain 0.1+ 推荐用法)
joke_prompt_value = joke_prompt.invoke({"subject": "程序员"})
# 将 PromptValue 转为字符串
print(joke_prompt_value.to_string())
# 将 PromptValue 转为消息格式(可用于 Chat 模型)
print(joke_prompt_value.to_messages())
print("\n==== 多轮对话提示模板 ====")
# 2️⃣ 多轮对话提示模板:系统提示 + 聊天历史 + 用户提问
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是由 OpenAI 开发的聊天机器人,请根据用户的提问进行回复。当前时间为:{now}"),
MessagesPlaceholder(variable_name="chat_history"), # 插入历史对话
HumanMessagePromptTemplate.from_template("请讲一个关于{subject}的冷笑话"),
])
# 使用 partial 预填充当前时间
chat_prompt = chat_prompt.partial(now=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 构造输入参数
chat_input = {
"chat_history": [
HumanMessage(content="我叫梅长苏"),
AIMessage(content="你好,我是 ChatGPT,有什么可以帮到您?"),
],
"subject": "程序员"
}
# 调用 prompt 模板生成最终的提示词
chat_prompt_value = chat_prompt.invoke(chat_input)
# 输出结构化提示词
print(chat_prompt_value)
print("\n==== 转为字符串 ====")
print(chat_prompt_value.to_string())
print("\n==== 转为消息列表(可用于 LLM 调用) ====")
for msg in chat_prompt_value.to_messages():
print(f"[{msg.type}] {msg.content}")

2.2 字符串提示拼接
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from langchain_core.prompts import PromptTemplate
prompt = (
PromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
+ ",让我开心下" +
"\n使用{language}语言"
)
print(prompt.invoke({"subject": "程序员", "language": "中文"}).to_string())

2.3 消息模板拼接
#!/usr/bin/env python
# -*- coding: utf-8 -*-
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
print(chat_prompt.invoke({
"username": "梅长苏",
"query": "你好,你是?"
}))

2.4 复用提示模板
#!/usr/bin/env python
# -*- coding: utf-8 -*-
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
print(chat_prompt.invoke({
"username": "梅长苏",
"query": "你好,你是?"
}))

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)