LangChain教程:PromptTemplate提示词模板类 作者:马育民 • 2026-02-25 10:37 • 阅读:10000 # 提出问题 看下面的代码 ``` 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()` 填充变量: ```python 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 会自动识别模板中的变量: ```python # 简化写法(推荐) 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) ``` # 与模型串联(结合 | 运算符)重要 这是 `PromptTemplate` 最核心的使用场景,直接串联模板和模型,自动完成「渲染→调用模型」 **提示:** 支持 `|` 的实现原理,详见 [链接](https://www.malaoshi.top/show_1GW2qDV2kDsh.html "链接") ### 案例 ```python 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}个适合的健身运动。" ) # 创建模型对象 model = Tongyi(model="qwen-max") # 串联模板和模型(| 运算符) chain = prompt_template | model # 调用链(自动渲染模板 + 调用模型) res = chain.stream({ "age": 25, "gender": "女性", "num": 3 }) for chunk in res: print(chunk, end="", flush=True) ``` # 进阶功能 ### 处理默认值(避免变量缺失) 给变量设置默认值,即使不传入该变量也不会报错: ```python 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字)。 ``` ### 批量渲染模板 一次性渲染多组变量,适合批量调用模型: ```python 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的结果。 ``` # 注意事项 1. **变量名规范**:模板中的变量名要和传入的字典键完全一致(大小写敏感); 2. **特殊字符处理**:如果模板中需要保留 `{}`(比如代码示例),需用 `{{}}` 转义(例:`模板中有{{代码}}块`); 3. **输入校验**:显式声明 `input_variables` 可以提前校验变量是否缺失,避免运行时错误; 4. **API 配置**:使用第三方模型(如通义千问、OpenAI)时,需先配置对应的 API_KEY(参考模型官方文档)。 # 总结 1. LangChain 的 `PromptTemplate` 是构建结构化提示词的核心工具,核心是「模板定义 + 变量渲染」; 2. 基础用法:用 `from_template()` 定义模板,`format()`/`invoke()` 填充变量; 3. 核心场景:通过 `|` 运算符串联模板和模型,实现「渲染→调用」自动化; 4. 进阶技巧:支持默认值、批量渲染,能大幅提升提示词复用性和开发效率。 原文出处:http://malaoshi.top/show_1GW2qEzu7tpx.html