提出问题
看下面的代码
from langchain_community.llms.tongyi import Tongyi
from dotenv import load_dotenv
# 加载 .env 文件,并放入到环境变量中
load_dotenv()
model = Tongyi(model="qwen-max") # 创建模型对象
res = model.invoke(input="请分析 手机 出现 掉电快 的原因,只给出3条简短解决建议。")
print(res)
print("-"*50)
res = model.invoke(input="请分析 电脑 出现 卡顿 的原因,只给出3条简短解决建议。")
print(res)
print("-"*50)
res = model.invoke(input="请分析 羽绒服 出现 销量低 的原因,只给出3条简短解决建议。")
print(res)
提出问题
下面例子的 提示词 中,大部分内容都是 相同的:
请分析 aaa 出现 bbb 的原因,只给出3条简短解决建议。
只有 aaa 和 bbb 的部分是不同的,每次都把这些字符串发给AI,是不合理的
解决
使用提示词模板,像数学公式那样,只需要把数字替换公式中的变量
提示词模板是什么?
就是 带占位符的提示词,方便反复用。
比如:
请分析 aaa 出现 bbb 的原因,只给出3条简短解决建议。
填完变量,就变成 真正的提示词。
提示词模板类
在调用大模型时,我们经常需要 动态替换提示词中的变量(比如姓名、问题类型、参数等),PromptTemplate 就是为了解决这个问题:
- 把固定文本和动态变量分离,让提示词更易维护;
- 支持批量渲染、格式校验、多变量替换;
- 可与 LangChain 的其他组件(如模型、链)无缝衔接。
基础用法
1. 基本定义与渲染(不推荐)
先定义包含变量的模板(用 {变量名} 标记),再通过 format() 或 invoke() 填充变量:
from langchain_core.prompts import PromptTemplate
# 1. 定义提示词模板(包含两个变量:product 和 problem)
prompt_template = PromptTemplate(
input_variables=["product", "problem"], # 显式声明变量(可选,但建议写,方便校验)
template="请分析{product}出现{problem}的原因,并给出3条解决建议。"
)
# 2. 渲染模板(填充变量)—— 两种方式
# 方式1:format()(简单场景)
prompt_text1 = prompt_template.format(product="手机", problem="电池掉电快")
# 方式2:invoke()(推荐,支持字典输入,适配 LangChain 生态)
prompt_text2 = prompt_template.invoke({"product": "电脑", "problem": "卡顿"})
# 打印结果
print("渲染结果1:\n", prompt_text1)
print("-" * 50)
print("渲染结果2:\n", prompt_text2.content) # invoke 返回 PromptValue 对象,用 .content 取文本
运行结果:
渲染结果1:
请分析手机出现电池掉电快的原因,并给出3条解决建议。
--------------------------------------------------
渲染结果2:
请分析电脑出现卡顿的原因,并给出3条解决建议。
2. 简化定义(推荐)
用 from_template() 可以简化,LangChain 会自动识别模板中的变量:
# 简化写法(推荐)
prompt_template = PromptTemplate.from_template(
"请给{age}岁的{gender}用户推荐{num}个适合的健身运动。"
)
# 渲染
prompt_text = prompt_template.format(age=25, gender="女性", num=5)
# 输出:请给25岁的女性用户推荐5个适合的健身运动。
print(prompt_text)
案例
使用提示词模板类和阿里千问大模型:
from langchain_core.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from dotenv import load_dotenv
# 加载 .env 文件,并放入到环境变量中
load_dotenv()
# 简化写法(推荐)
prompt_template = PromptTemplate.from_template(
"请给{age}岁的{gender}用户推荐{num}个适合的健身运动。"
)
# 渲染
prompt_text = prompt_template.format(age=25, gender="女性", num=3)
# 输出:请给25岁的女性用户推荐3个适合的健身运动。
print(prompt_text)
model = Tongyi(model="qwen-max") # 创建模型对象
res = model.invoke(input=prompt_text) # 调用模型获取结果
print(res)
进阶功能
处理默认值(避免变量缺失)
给变量设置默认值,即使不传入该变量也不会报错:
prompt_template = PromptTemplate.from_template(
"请写一篇关于{topic}的短文,字数要求:{word_count}字(默认100字)。"
)
# 设置默认值
prompt_template = prompt_template.partial(word_count=100)
# 只传 topic,使用默认的 word_count
prompt_text = prompt_template.format(topic="春天")
print(prompt_text) # 输出:请写一篇关于春天的短文,字数要求:100字(默认100字)。
# 覆盖默认值
prompt_text2 = prompt_template.format(topic="秋天", word_count=200)
print(prompt_text2) # 输出:请写一篇关于秋天的短文,字数要求:200字(默认100字)。
批量渲染模板
一次性渲染多组变量,适合批量调用模型:
prompt_template = PromptTemplate.from_template("计算{num1} + {num2}的结果。")
# 多组变量
variable_sets = [
{"num1": 10, "num2": 20},
{"num1": 5, "num2": 8},
{"num1": 100, "num2": 200}
]
# 批量渲染
batch_prompts = prompt_template.format_batch(variable_sets)
for i, prompt in enumerate(batch_prompts):
print(f"第{i+1}个提示词:{prompt}")
运行结果:
第1个提示词:计算10 + 20的结果。
第2个提示词:计算5 + 8的结果。
第3个提示词:计算100 + 200的结果。
注意事项
- 变量名规范:模板中的变量名要和传入的字典键完全一致(大小写敏感);
- 特殊字符处理:如果模板中需要保留
{}(比如代码示例),需用{{}}转义(例:模板中有{{代码}}块); - 输入校验:显式声明
input_variables可以提前校验变量是否缺失,避免运行时错误; - API 配置:使用第三方模型(如通义千问、OpenAI)时,需先配置对应的 API_KEY(参考模型官方文档)。
总结
- LangChain 的
PromptTemplate是构建结构化提示词的核心工具,核心是「模板定义 + 变量渲染」; - 基础用法:用
from_template()定义模板,format()/invoke()填充变量; - 进阶技巧:支持默认值、批量渲染,能大幅提升提示词复用性和开发效率。