你好,我是阿扩。很高兴与你继续这趟旅程。
在前两章,我们学会了如何启动并与AI的“大脑”——模型进行对话。但你可能已经发现,我们每次提问,都需要手动在代码里拼接字符串或消息对象。如果应用逻辑变得复杂,这种方式会显得非常笨拙且难以维护。
别担心,LangChain早已为我们准备好了优雅的解决方案。今天,我将带你掌握一项让AI沟通变得“标准化”和“自动化”的艺术——提示模板 (Prompt Templates)。
3.1 本节目标
- 理解为什么需要使用提示模板。
- 掌握
ChatPromptTemplate
的使用方法,为聊天模型创建动态提示。 - 学会如何定义带有输入变量(placeholders)的模板。
- 能够将模板、用户输入和模型三者结合,完成一次动态的AI调用。
3.2 核心概念速览
提示模板 (Prompt Template) 的核心思想非常简单,我们可以用一个大家都很熟悉的例子来理解它——信件模板。
想象一下,你要写一封邮件,邀请多位嘉宾参加活动。你不会为每一位嘉宾都重写一封邮件,而是会创建一个模板:
尊敬的
{嘉宾姓名}
:您好!诚挚邀请您参加我们将于
{日期}
在{地点}
举办的{活动名称}
。期待您的光临!
在这个模板中,{嘉宾姓名}
、{日期}
、{地点}
和 {活动名称}
就是占位符(placeholders)。你只需要提供这些变量的具体值,就能快速生成一封封个性化的邮件。
在LangChain中,提示模板的工作原理完全一样。我们预先定义好一个包含占位符的提示结构,程序运行时,只需要把动态的变量“填”进去,就能生成一个最终发送给LLM的、格式完美的完整提示。
3.3 LangChain组件解析
今天我们的主角是 ChatPromptTemplate
,它是专门为 聊天模型(Chat Models) 设计的模板工具。
-
ChatPromptTemplate.from_messages([...])
: 这是创建聊天提示模板最常用、最直观的方法。它接收一个由消息模板组成的列表。这些消息模板可以是SystemMessage
、HumanMessage
或AIMessage
的字符串形式,其中可以包含用花括号{}
包裹的输入变量。 -
template.format_messages(**kwargs)
: 这是模板对象的一个核心方法。当你调用它并传入一个包含变量值的字典时(例如product="智能手表", features="心率监测、超长待机"
),它会用这些值替换掉模板中的占位符,并返回一个格式化好的、可以被聊天模型直接使用的消息列表。
3.4 实战代码演练
让我们来构建一个“产品描述生成器”。我们的程序将接收一个产品名称和一些特性,然后利用提示模板,让AI为我们生成一段吸引人的营销文案。
第一步:确保环境就绪
和之前一样,请确保你已安装所需库,并设置了DASHSCOPE_API_KEY
环境变量。
pip install langchain langchain_community dashscope
第二步:编写并运行Python代码
创建一个名为 prompt_template_demo.py
的文件,然后将下面的代码复制进去。
# 1. 导入必要的模块
from langchain_community.chat_models import ChatTongyi
from langchain_core.prompts import ChatPromptTemplate
def main():
"""主函数,演示如何使用提示模板"""
print("--- 提示模板演示:产品描述生成器 ---")
# 2. 创建聊天模型实例
chat_model = ChatTongyi(temperature=0.5)
# 3. 定义聊天提示模板
# 我们使用 from_messages 方法,传入一个消息列表。
# SystemMessage 定义了AI的角色和任务。
# HumanMessage 包含了两个占位符:{product_name} 和 {features}。
template = ChatPromptTemplate.from_messages([
("system", "你是一位专业的营销文案专家,擅长为产品撰写富有吸引力的描述。"),
("human", "请为产品“{product_name}”生成一段营销文案,突出它的以下特点:{features}。")
])
# 4. 准备动态输入值
product_name = "AI智能降噪耳机"
features = "主动降噪、30小时超长续航、空间音频技术"
# 5. 使用模板格式化输入
# 我们调用 .format_messages() 并传入一个字典来填充占位符。
formatted_prompt = template.format_messages(
product_name=product_name,
features=features
)
print("\n--- 格式化后的完整提示 ---")
print(formatted_prompt)
print("--------------------------\n")
# 6. 调用模型并获取回答
print("正在生成文案...")
response = chat_model.invoke(formatted_prompt)
# 7. 打印模型的回答
print("\nAI生成的营销文案:")
print(response.content)
if __name__ == "__main__":
main()
运行结果可能如下:
--- 提示模板演示:产品描述生成器 ---
--- 格式化后的完整提示 ---
[SystemMessage(content='你是一位专业的营销文案专家,擅长为产品撰写富有吸引力的描述。'), HumanMessage(content='请为产品“AI智能降噪耳机”生成一段营销文案,突出它的以下特点:主动降噪、30小时超长续航、空间音频技术。')]
--------------------------
正在生成文案...
AI生成的营销文案:
**静享纯粹,声临其境——您的AI智能降噪耳机已上线!**
厌倦了城市的喧嚣,渴望一片只属于自己的听觉绿洲?现在,让科技为您隔绝纷扰。
我们的全新AI智能降噪耳机,搭载业界领先的**主动降噪**技术,能精准识别并消除环境噪音,无论是在通勤地铁还是嘈杂的咖啡馆,都能让您瞬间沉浸在纯净的音乐世界。
告别电量焦虑!我们为您带来了惊人的**30小时超长续航**能力,一次充电,满足您数日的聆听需求,让美妙旋律从不间断。
更进一步,我们引入了革命性的**空间音频技术**。它能追踪您的头部动态,营造出影院级的3D环绕声场,无论听歌、看电影还是玩游戏,都能为您带来前所未有的沉浸式体验。
AI智能降噪耳机,不仅是耳机,更是您通往纯粹声音世界的钥匙。立即体验,开启您的听觉新纪元!
3.5 代码逻辑详解
from langchain_core.prompts import ChatPromptTemplate
: 我们从langchain_core.prompts
模块中导入了核心的ChatPromptTemplate
类。template = ChatPromptTemplate.from_messages([...])
: 这是本章最关键的一步。我们创建了一个模板实例。("system", "...")
: 这是SystemMessage
的简写形式,LangChain能够智能地识别它。它为AI设定了“营销专家”的身份。("human", "...")
: 这是HumanMessage
的简写。注意字符串中的{product_name}
和{features}
,它们就是等待被填充的“空”。
formatted_prompt = template.format_messages(...)
: 我们调用了.format_messages()
方法。传入的字典的key
(product_name
,features
)必须与模板中的占位符名称完全对应。该方法返回一个标准的消息列表([SystemMessage(...), HumanMessage(...)]
),这正是chat_model.invoke()
所期望的输入格式。response = chat_model.invoke(formatted_prompt)
: 我们将格式化后的、包含了具体产品信息的消息列表传递给模型,从而得到一个高度定制化的回答。
通过这种方式,我们的核心逻辑(AI的角色和提问结构)被固定在了模板里,而动态变化的数据(产品名和特性)则在运行时才传入。这大大提高了代码的复用性和可维护性。
3.6 总结与思考
恭喜你,你已经掌握了与AI进行“精准沟通”的艺术!使用提示模板,就像是为你的AI应用建立了一套标准作业流程(SOP),确保了每次输入的质量和一致性,从而得到更可控、更优质的输出。
本章重点回顾:
- 提示模板的核心价值在于分离静态逻辑和动态数据。
ChatPromptTemplate.from_messages
是为聊天模型创建模板的利器。- 使用
{}
来定义占位符,并通过.format_messages()
方法传入字典来填充它们。 - 模板让我们的代码更模块化、可复用、易维护。
思考与练习:
现在,请你来挑战一下!创建一个新的Python脚本,设计一个“代码解释器”的提示模板。
- AI角色:一位资深的软件工程师,擅长用简单易懂的语言解释复杂的代码。
- 输入变量:
language
(编程语言,如Python、JavaScript)和code_snippet
(一小段代码)。 - 任务:让AI解释你提供的代码片段是做什么的。
尝试用你新学的知识,构建这个模板并调用AI,看看它能否胜任“代码解释器”这个新角色。这个练习将帮助你巩固今天所学,并让你体会到提示模板的无限可能。
在下一章,我们将解决一个新问题:AI的回答是自由文本,如何让它输出我们程序需要的结构化数据(如JSON)呢?敬请期待 输出解析器(Output Parsers) 的登场!