📌 所属章节:第三阶段 - Messages 与 Prompt 提示词模板
← 上一篇:LLM / ChatModel 大模型接口 | 📚 系列目录 | 下一篇:Content Blocks 与批处理 →
📋 摘要
本文详细讲解了 Messages 与 Prompt 提示词模板,包括核心概念、实战代码示例和最佳实践。通过本文的学习,你将掌握 LangChain 1.0 的核心技术要点,能够快速构建基于大模型的 AI 应用。
适合人群:
- 想系统学习 LangChain 1.0 的开发者
- 需要构建 AI Agent 应用的工程师
- 对 LLM 应用开发感兴趣的技术爱好者
3.2 消息列表messages
messages与:
-
OpenAI ChatCompletion API
-
Anthropic Claude Messages API
-
Google Gemini API
-
Llama/Ollama 的 Chat 模式
完全一致。
python
# 导入OpenAI官方SDK,用于调用兼容OpenAI接口的模型服务
from openai import OpenAI
# 初始化DeepSeek的API客户端
client = OpenAI(api_key = "********************", base_url="https://api.deepseek.com")
# 指定模型为deepseek-chat,构造系统提示和用户提问
response = client.chat.completions.create(
model="deepseek-chat", # 使用的模型名称
messages=[
{"role": "system", "content": "你是乐于助人的助手,请根据用户的问题给出回答"}, # 系统角色,定义助手行为
{"role": "user", "content": "你好,请你介绍一下你自己。"}, # 用户提问内容
],
)
messages 模板被称为 "消息管道":
-
每一条 message 都能放变量
-
每一条 message 都能单独渲染
-
messages 最后被组装成一个列表传给模型
-
messages = 构造上下文 + 定义模型行为 + 填充历史 + 控制推理流程
这是 LangChain 最核心的思想:让 prompt 模块化、结构化、可维护。模型需要清楚:谁在说话?哪句是历史内容?哪句是现在的请求?哪些是规则?哪些不能被忽略?仅靠纯文本 Prompt是无法做到的。
| role | 作用 |
|---|---|
| system | 设定模型的身份、风格、规则,是"最高优先级" |
| user | 表示用户提问内容,是本轮对话的主体输入 |
| assistant/ai | 表示模型历史回答,有助于形成上下文记忆 |
| tool | 工具调用结果(用于 Agent) |
| developer | 开发者提示(OpenAI 新增 role),模型的功能逻辑 / 工程约束 |
python
# 构建对话历史,依次包含系统设定、助手开场白和用户问题
messages = [
{"role": "system", "content": "你是大模型专家,回答要专业。"}, # 系统角色:设定助手为技术专家
{"role": "assistant", "content": "我准备好了,请问您遇到什么问题?"}, # 助手角色:主动询问用户问题
{"role": "user", "content": "我的电脑会自动重启。"} # 用户角色:描述电脑故障
]
# 调用模型生成回复
resp = model.invoke(messages)
# 打印模型返回的回复内容
print(resp.content)
messages 的执行顺序与优先级(非常关键)
LLM 按如下顺序解析:
-
1.system(最高优先级)
-
2.developer(模型的功能逻辑 / 工程约束)
-
3.user/human 用户当前输入的 query
-
4.assistant 历史对话
-
5.tool 调用
模型永远会参考全部 messages 才得出最终输出。
python
# 导入所需的消息类型
from langchain.messages import HumanMessage, SystemMessage
# 创建系统消息,设定模型角色为编程专家
system_msg = SystemMessage("你是一个编程专家。")
# 创建用户消息,请求生成一段3行的Python示例代码
human_msg = HumanMessage("给我写一段 3 行的 Python 示例。")
# 将系统消息和用户消息组合成消息列表
messages = [system_msg, human_msg]
# 调用模型,传入消息列表并获取响应
resp = model.invoke(messages)
# 提取并返回模型生成的内容
resp.content
- 更多message管理,详见:https://docs.langchain.com/oss/python/langchain/messages
3.3 Prompt提示词模版
-
变量化 prompt 的模板化工具,支持输入插值与简单逻辑。
-
学习要点:模板管理、prompt engineering 的组织方式。
1. PromptTemplate
python
from langchain_core.prompts import PromptTemplate
# 创建一个带有{product}占位符变量的模板,{} 中的变量会被动态替换
prompt_template = PromptTemplate.from_template(
"为生产{product}的公司起一个好名字?"
)
# 使用具体值格式化模板
formatted_prompt = prompt_template.format(product="智能水杯")
# 输出: "为生产智能水杯的公司起一个好名字?"
# 将格式化后的提示词直接传递给模型
response = model.invoke(formatted_prompt)
print(f"打印生成的提示词:{formatted_prompt}")
print("=" * 60)
print(response.content)
输出结果:
打印生成的提示词:为生产智能水杯的公司起一个好名字?
============================================================
为智能水杯起名,既要体现科技感、智能属性,又要传递健康、关怀和愉悦饮水的核心价值。一个好名字应该**简洁、易记、有联想空间**,并且便于国际化。
以下为您分类提供一些思路和具体建议,并附上命名逻辑:
### 一、核心命名方向
1. **突出"智能"与"连接"**
* **智饮(ZhiYin)**:直接点明智能饮水,简洁有力,中文意境好。
* **CupLink / CupLync**:强调连接(手机、健康数据),科技感强,易于国际化。
* **HydraSmart**:结合"Hydration"(补水)和"Smart",专业且国际通用。
* **iCup / WeCup**:借鉴经典科技命名方式,亲切易记(需注意商标查重)。
2. **强调"健康"与"关怀"**
* **水伴(ShuiBan)**:像伙伴一样陪伴健康生活,温馨、有安全感。
* **衡饮(HengYin)**:强调平衡、科学的饮水,给人专业健康的感觉。
* **VitaCup / AquaVita**:拉丁语系中,"Vita"意为生命,"Aqua"为水,组合起来寓意"生命之水",高端有质感。
* **Guardian Cup(守护者杯)**:强调其监护健康的角色,有力量感和信任感。
3. **体现"提醒"与"准时"**
* **准时杯(ZhunShi Cup)**:功能点直白,容易吸引注重规律的用户。
* **水滴提醒(DropRemind)**:形象化,将微小水滴与提醒功能结合,生动有趣。
* **Punctual Water**:Punctual意为守时的,组合起来独特且点明核心功能。
4. **融合"科技"与"美学/情感"**
* **涟漪(LianYi)**:科技如水波般融入生活,名字富有诗意和画面感。
* **知温(ZhiWen)**:知晓水温,也谐音"知心",有温度和智慧感。
* **Glint Cup**:Glint意为闪烁的微光
python
# 导入 PromptTemplate 类,用于构建可复用的提示词模板
from langchain_core.prompts import PromptTemplate
# 创建模板:{} 中的变量会被动态替换
# 类比:邮件模板中的{{姓名}}占位符
template = PromptTemplate(
input_variables=["product", "feature"], # 明确声明变量名,确保模板知道需要哪些输入
template="请为{product}的{feature}功能写一段宣传文案。" # 定义模板字符串,占位符将在运行时被替换
)
# 格式化:填充变量,将具体值传入模板生成最终提示词
prompt_text = template.format(
product="智能手机", # 替换模板中的 {product}
feature="AI摄影" # 替换模板中的 {feature}
)
print("生成的提示词:")
print(prompt_text)
# 输出:请为智能手机的AI摄影功能写一段宣传文案。
输出结果:
生成的提示词:
请为智能手机的AI摄影功能写一段宣传文案。
partial_variables固定变量
partial_variables = 提前填充固定变量,使 PromptTemplate 成为"半成品模版"
-
让模板更简洁,锁定系统设定、风格角色、不变提示词,它仍可以进行覆盖操作,可用于动态函数变量,强烈建议用于 RAG / Agent 中的系统指令管理!
-
一些变量通常是 固定不变 的(例如:风格、角色、系统设定)
-
另一些变量由 用户输入决定(如用户问题、上下文、消息)
-
如果全部变量都在 .format() 填,会很啰嗦,还容易丢变量。
-
因此 LangChain 允许你把不变的变量"预填"到模板中,变成一个 partial prompt。
python
# 1. 创建 PromptTemplate 对象,指定需要填充的变量为 user_question
template = PromptTemplate(
input_variables=["user_question"],
template="""
你是一个专业的技术支持,回答风格:{style}。
请先复述用户问题,然后提供解决方案。
用户问题:{user_question}
解决方案:""",
partial_variables={"style": "简洁明了"} # 可选:部分变量固定,这里预设 style 为"简洁明了",后续可覆盖
)
# 2. 使用 partial 方法覆盖 style 为"通俗易懂",再填充用户问题
prompt = template.partial(style="通俗易懂").format(user_question="电脑无法开机")
# 3. 调用模型生成回复
response = model.invoke(prompt)
# 4. 打印最终生成的提示词
print(f"打印生成的提示词:{prompt}")
print("=" * 60)
# 5. 打印模型返回的内容
print(response.content)
输出结果:
打印生成的提示词:
你是一个专业的技术支持,回答风格:通俗易懂。
请先复述用户问题,然后提供解决方案。
用户问题:电脑无法开机
解决方案:
============================================================
好的,您的问题是:**电脑无法开机**。
这是一个非常常见的问题,别担心,我们可以按照从简单到复杂的顺序,一步步排查。请跟着以下步骤操作:
### 第一步:检查最基础的问题(最常见)
1. **电源与接线**:
* **确认插座有电**:试试把台灯或手机充电器插到同一个插座上,看是否工作。
* **检查电源线**:确保电脑的电源线两端(插座端和主机端)都插紧了。如果是笔记本,检查电源适配器的指示灯是否亮着。
* **尝试更换**:如果可能,换一根确认好用的电源线试试。
2. **排除外部设备干扰**:
* 拔掉所有不必要的外接设备,比如U盘、移动硬盘、打印机、额外的显示器等,**只保留电源线、键盘和显示器**。然后尝试开机。有时一个故障的外设会导致电脑无法启动。
### 第二步:观察现象,听声音,看指示灯
按下开机键后,请仔细观察:
* **完全没反应(风扇不转,灯不亮)**:
* 重点检查第一步的电源问题。
* 如果是台式机,检查机箱背后的**电源开关**是否被误关了("-"是开,"O"是关)。
* 可能是电源或主板故障。
* **有反应但屏幕不亮(风扇转,指示灯亮)**:
* **听声音**:仔细听有没有"嘀嘀"的报警声(长短组合不同代表不同故障,可搜索"主板报警声"对应您的主板品牌查询)。
* **看键盘指示灯**:按一下键盘上的 `Num Lock` 或 `Caps Lock` 键,看指示灯会不会亮灭。如果会,说明主机可能已启动,问题在**显示器或连接线**。
* 检查显示器电源和信号线(如HDMI、VGA线)是否接好。
* 尝试更换一根信号线。
* 把显示器接到另一台电脑上测试,或换一台显示器测试。
### 第三步:进阶硬件检查(适合台式机或有一定动手能力的用户)
*
| 项目 | input_variables | partial_variables |
|---|---|---|
| 是不是用户必须提供? | 是 | 否 |
| 何时填入? | .format() 时 |
Template 定义时/.partial()覆盖 |
| 是否可覆盖? | 是 | 是 |
| 是否支持函数? | 否 | 支持(动态变量) |
| 适合场景 | 用户输入内容 | prompt 预设、系统指令 |
2. ChatPromptTemplate
python
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage
# 使用messages模板字符串(最常用)
chat_template = ChatPromptTemplate.from_messages([
# SystemMessage: 定义AI角色和行为准则
("system", "你是一个专业的Python代码审查助手。请严格检查代码风格、潜在Bug和性能问题。"),
# HumanMessage: 用户输入
("human", "请审查以下代码:\n\n{code_snippet}"),
# AIMessage: 可选,提供示例输出(Few-shot)
("ai", "我发现了以下问题:1. 缺少类型注解 2. 使用全局变量"),
# HumanMessage: 用户的后续指令
("human", "{follow_up_instruction}")
])
# 格式化:生成消息列表
messages = chat_template.format_messages(
code_snippet="def add(a,b):\n return a+b",
follow_up_instruction="请给出优化后的代码"
)
print("生成的消息结构:")
for i, msg in enumerate(messages):
print(f"\n--- 消息 {i+1} ---")
print(f"角色: {msg.schema}")
print(f"内容: {msg.content}")
# 直接传递给模型
response = model.invoke(messages)
print("\n 模型审查结果:")
print(response.content_blocks[0]["text"])
输出结果:
生成的消息结构:
--- 消息 1 ---
角色: <bound method BaseModel.schema of <class 'langchain_core.messages.system.SystemMessage'>>
内容: 你是一个专业的Python代码审查助手。请严格检查代码风格、潜在Bug和性能问题。
--- 消息 2 ---
角色: <bound method BaseModel.schema of <class 'langchain_core.messages.human.HumanMessage'>>
内容: 请审查以下代码:
def add(a,b):
return a+b
--- 消息 3 ---
角色: <bound method BaseModel.schema of <class 'langchain_core.messages.ai.AIMessage'>>
内容: 我发现了以下问题:1. 缺少类型注解 2. 使用全局变量
--- 消息 4 ---
角色: <bound method BaseModel.schema of <class 'langchain_core.messages.human.HumanMessage'>>
内容: 请给出优化后的代码
模型审查结果:
```python
def add(a: int | float, b: int | float) -> int | float:
"""
计算两个数字的和
Args:
a: 第一个数字
b: 第二个数字
Returns:
两个数字的和
Examples:
>>> add(1, 2)
3
>>> add(1.5, 2.5)
4.0
"""
return a + b
**主要改进:**
1. **添加类型注解**:使用 `int | float` 表示参数和返回值可以是整数或浮点数
2. **添加文档字符串**:包含函数说明、参数说明、返回值说明和使用示例
3. **提高可读性**:添加适当的空格和换行
**其他建议**
3. LangChain Hub 模版库
使用提示词模版库之前需要先到LangSmith官网上申请一个api_key,官网地址:https://smith.langchain.com/


- hub提示词模版库地址:https://smith.langchain.com/hub/


python
import os
from dotenv import load_dotenv
load_dotenv()
# 从langsmith库引入Client类
from langsmith import Client
# 通过LangSmith的LANGSMITH_API_KEY创建Client实例化
client = Client(api_key = "********************"
# 从hub上拉取对应的prompt模版
# 指定prompt标识符"rlm/rag-prompt",获取可用于RAG场景的提示模板
prompt = client.pull_prompt("rlm/rag-prompt", include_model=True)
print(prompt)
输出结果:
input_variables=['context', 'question'] input_types={} partial_variables={} metadata={'lc_hub_owner': 'rlm', 'lc_hub_repo': 'rag-prompt', 'lc_hub_commit_hash': '50442af133e61576e74536c6556cefe1fac147cad032f4377b60c436e6cdcb6e'} messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['context', 'question'], input_types={}, partial_variables={}, template="You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.\nQuestion: {question} \nContext: {context} \nAnswer:"), additional_kwargs={})]
python
# 使用模板
formatted = prompt.format(
context="""
LangChain 是一个构建 LLM 应用的框架,
目标是把 LLM 与外部工具、数据源和复杂工作流连接起来 ------ 支持从简单的 prompt 封装到复杂的 Agent
(能够调用工具、做决策、执行多步任务)""", # 模板中定义的上下文变量,用于填充到模板中
question="什么是LangChain?") # 模板中定义的问题变量,用于填充到模板中
print("\n格式化后:")
print(formatted)
输出结果:
格式化后:
Human: You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.
Question: 什么是LangChain?
Context:
LangChain 是一个构建 LLM 应用的框架,
目标是把 LLM 与外部工具、数据源和复杂工作流连接起来 ------ 支持从简单的 prompt 封装到复杂的 Agent
(能够调用工具、做决策、执行多步任务)
Answer:
python
response = model.invoke(formatted)
print(response.content)
输出结果:
LangChain 是一个用于构建大型语言模型(LLM)应用的框架,其核心目标是将 LLM 与外部工具、数据源及复杂工作流连接起来。它支持从简单的提示词封装到复杂的智能体系统,使应用能够调用工具、自主决策并执行多步任务。
python
# 打印输出内容块
response.content_blocks
🎯 总结
本文详细介绍了 Messages 与 Prompt 提示词模板 的核心概念和实战技巧。希望这些内容能帮助你更好地理解和使用 LangChain 1.0!
如果你有任何问题或建议,欢迎在评论区留言交流!💬
← 上一篇:LLM / ChatModel 大模型接口 | 📚 系列目录 | 下一篇:Content Blocks 与批处理 →
🏷️ 标签 :LangChain Prompt工程 消息系统
💝 感谢阅读!如果觉得有帮助,记得点赞收藏关注哦!
本文为原创内容,版权归作者所有,转载需注明出处。