四. Model I/O 之 Prompt Template

Prompt Template,通过模板管理大模型的输入。

4.1 介绍与分类

Prompt Template 是LangChain中的一个概念,接收用户输入,返回一个传递给LLM的信息(即提示词prompt)。

在应用开发中,固定的提示词限制了模型的灵活性和适用范围。所以,prompt template是一个 模板化的字符串 ,你可以将 变量插入到模板 中,从而创建出不同的提示。调用时:

  • 以 字典 作为输入,其中每个键代表要填充的提示词模板中的变量。
  • 输出一个 PromptValue。这个PromptValue可以传递给LLM或ChatModel,并且还可以转换为字符串或消息列表。

有几种不同类型的提示词模板:

  • PromptTemplate:LLM提示模板,用于 生成字符串提示,它使用Python的字符串来模板提示。
  • ChatPromptTemplate : 聊天提示模板,用于 组合各种角色的消息模板 ,传入聊天模型。
  • XxxMessagePromptTemplate:消息模板词模板,包括:SystemMessagePromptTemplate,HumanMessagePromptTemplate,AIMessagePromptTemplate,ChatMessagePromptTemplate等等
  • FewShotPromptTemplate:样本提示词模板,通过示例来教模型如何回答
  • PipelinePrompt:管道提示词模板,用于把几个提示词组合在一起使用。
  • 自定义模板:允许基于其他模板类来定制自己的提示词模板。

模板导入

4.2 复习: str.format()

Python的 str.format()方法是一种字符串格式化的手段,允许在 字符串中插入变量。使用这种方法,可以创建包含 占位符 的字符串模板,占位符有花括号 {} 标识。

  • 调用format()方法时,可以传入一个或多个参数,这些参数将被顺序替换进占位符中。
  • str.format()提供了灵活的方式来构造字符串,支持多种格式化选项。

在LangChain的默认设置下,PromptTemplate 使用Python的 str.format() 方法进行模板化。这样在模型接收输入前,可以根据需要对数据进行预处理和结构化。

4.3 具体使用:PromptTemplate

4.3.1 使用说明

PromptTemplate类,用于快速构建 包含变量 的提示词模板,并通过 传入不同的参数值 生成自定义的提示词。

主要参数介绍:

  • template :定义提示词模板的字符串,其中包含 文本 和 变量占位符(如 {name} );
  • input_variables :列表,指定了模板中使用的变量名称,在调用模板时被替换;
  • partial_variables : 字典,用于定义模板中一些固定的变量名。这些值不需要在每次调用时被替换。

函数介绍:

  • format():给input_variables变量赋值,并返回提示词。利用format()进行格式化时就一定要赋值,否则会报错。当在template中未设置input_variables,则会自动忽略。

PromptTemplate的使用

1. PromptTemplate 如何获取实例

2. 两种特殊结构的使用(部分提示词模板的使用,组合提示词模板的使用)

3. 给变量赋值的两种方式:format() / invoke()

4. 结合大模型的使用

4.3.2 两种实例化方式

方式1:使用构造函数方法

举例1:

python 复制代码
from langchain_core.prompts import PromptTemplate

## 方式1:使用构造函数的方式
prompt_template = PromptTemplate(
    template="请评价{product}的优缺点,包括{aspect1}和{aspect2}",
    input_variables=["product","aspect1", "aspect2"],
)

# 使用模板生成提示词
prompt_1 = prompt_template.format(product="智能手机", aspect1="电池续航", aspect2="拍照质量")
prompt_2 = prompt_template.format(product="笔记本电脑", aspect1="处理速度", aspect2="便携性")

print("提示词1:", prompt_1)
print("提示词2:", prompt_2)

方式2:from_template(): 推荐!! 更简洁

python 复制代码
from langchain_core.prompts import PromptTemplate

## 方式1:使用构造函数的方式
prompt_template = PromptTemplate.from_template(
    template="请评价{product}的优缺点,包括{aspect1}和{aspect2}"
)

# 使用模板生成提示词
prompt_1 = prompt_template.format(product="智能手机", aspect1="电池续航", aspect2="拍照质量")
prompt_2 = prompt_template.format(product="笔记本电脑", aspect1="处理速度", aspect2="便携性")

print("提示词1:", prompt_1)
print("提示词2:", prompt_2)

4.3.3 两种特殊结构的使用(部分提示词模板的使用,组合提示词的使用)

形式1:部分提示词模板的使用(重点),在生成prompt前就已经提前初始化部分的提示词,实际进一步导入模板的时候只导入除已初始化的变量即可。

举例1:

python 复制代码
from langchain_core.prompts import PromptTemplate

## 部分提示词模板
# 举例:在PromptTemplate的构造方法或from_template()方法内,使用partial_variables设置
prompt_template = PromptTemplate.from_template(
    template="请评价{product}的优缺点,包括{aspect1}和{aspect2}",
    partial_variables={"aspect1":"电磁续航"}, # 通过 partial_variables 参数,设定默认值,这样在生成提示词模板的时候,这个变量可以不用赋值
)

# 使用模板生成提示词
prompt_1 = prompt_template.format(product="智能手机", aspect2="拍照质量")
prompt_2 = prompt_template.format(product="笔记本电脑", aspect1="处理速度", aspect2="便携性")

print("提示词1:", prompt_1)
print("提示词2:", prompt_2)

举例2 :调用方法 partial()

python 复制代码
from langchain_core.prompts import PromptTemplate

## 部分提示词模板
prompt_template = PromptTemplate.from_template(
    template="请评价{product}的优缺点,包括{aspect1}和{aspect2}",
)
# 注意 PromptTemplate.partial() 并不会直接改变提示词的值,是返回值有改变
template1 = prompt_template.partial(aspect1="电池续航",aspect2="拍照质量")

# 使用模板生成提示词
prompt_1 = template1.format(product="智能手机")
prompt_2 = template1.format(product="笔记本电脑", aspect1="处理速度", aspect2="便携性")

print("提示词1:", prompt_1)
print("提示词2:", prompt_2)

形式2:组合提示词(了解)

python 复制代码
from langchain_core.prompts import PromptTemplate

template = (
    PromptTemplate.from_template("Tell me a joke about {topic}")
    + ", make it funny" + "\n\nand in {language}"
)
prompt = template.format(topic="sports", language="English")
print(prompt)

4.3.4 给变量赋值的两种方式 format() 与 invoke()

只要对象是RunnableSerializable接口类型,都可以使用invoke(),替换前面使用format()的调用方式。

format(),参数部分是:给变量赋值,返回值为 str 类型;invoke(),参数部分是字典类型,返回值为PromptValue类型,接着调用to_string()返回字符串。 推荐使用invoke()

举例调用format()

python 复制代码
from langchain_core.prompts import PromptTemplate

template = (
    PromptTemplate.from_template("Tell me a joke about {topic}")
    + ", make it funny" + "\n\nand in {language}"
)
prompt = template.format(topic="sports", language="English")
print(prompt)
print(type(prompt))

举例调用invoke()

python 复制代码
from langchain_core.prompts import PromptTemplate

template = (
    PromptTemplate.from_template("Tell me a joke about {topic}")
    + ", make it funny" + "\n\nand in {language}"
)
prompt = template.invoke(input={"topic":"sports", "language":"English"})
print(prompt)
print(type(prompt))

4.3.5 结合大模型使用

python 复制代码
import os

import dotenv
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

os.environ["OPENAI_BASE_URL"]=os.getenv("DASHSCOPE_BASE_URL")
os.environ["OPENAI_API_KEY"]=os.getenv("DASHSCOPE_API_KEY")

# 获取对话模型
chat_model = ChatOpenAI(
    model="qwen-plus",
    max_tokens=300,
)
# 生成提示词模板
template = (
    PromptTemplate.from_template("Tell me a joke about {topic}")
    + ", make it funny" + "\n\nand in {language}"
)
# 给模板的变量赋值
prompt = template.invoke(input={"topic":"sports", "language":"English"})
# 调用大模型,传入提示词即可
result = chat_model.invoke(prompt)

print(result.content)
print(type(result))
相关推荐
Familyism3 小时前
Prompt概述
prompt
加加今天也要加油3 小时前
Oinone × AI Agent 落地指南:元数据即 Prompt、BPM 状态机护栏、SAGA 补偿、GenUI
人工智能·低代码·prompt
问道飞鱼4 小时前
【大模型学习】提示词工程(Prompt Engineering)技术深度报告
学习·prompt·提示词
哆啦code梦5 小时前
Prompt攻防实战演练
prompt·prompt安全
哆啦code梦6 小时前
浅谈Prompt攻击与防御
prompt·大模型安全·prompt安全
梁下轻语的秋缘19 小时前
Prompt工程核心指南:从入门到精通,让AI精准响应你的需求
大数据·人工智能·prompt
正宗咸豆花1 天前
2026年的Prompt Engineering,从技巧到系统化工程
prompt
CCPC不拿奖不改名1 天前
提示词工程(Prompt Engineering)全体系知识手册
大数据·人工智能·python·搜索引擎·prompt
147API2 天前
Prompt Injection 怎么防:攻击面与工程防线(含安全 Checklist)
网络·安全·prompt