LangChain 中 ChatPromptTemplate 的几种使用方式

0 ChatPromptTemplate作用

ChatPromptTemplate是创建 聊天消息列表 的提示模板。它比普通 PromptTemplate 更适合处理多角 色、多轮次的对话场景。

1 两种实例化方式

ChatPromptTemplate 有两种实例化方式,一个是使用ChatPromptTemplate的构造方法,另一个是使用其from_messages()方法,两种方式实例化效果一样,单纯写法不同。

1.1 构造方法实例化

python 复制代码
from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate([
    ("system", "你是私人助理小贝"),
    ("human", "你是谁?")
])

prompt = prompt_template.invoke({})
print(prompt)

1.2 from_messages()方法实例化

python 复制代码
from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "你是私人助理小贝"),
    ("human", "你是谁?")
])
prompt = prompt_template.invoke({})


print(prompt)

2 模版的调用方式

2.1 调用方式的区别对比

调用ChatPromptTemplate共有四种方式,分别是invoke () 、 format () 、 format_messages () 、 format_prompt(),它们的主要区别是返回的类型不同。

方式 返回类型 参数类型
invoke ChatPromptValue 字典
format str 变量
invoke list 变量
invoke ChatPromptValue 变量

2.2 代码示例

python 复制代码
from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate([
    ("system", "你是私人助理小贝"),
    ("human", "你是谁?")
])

prompt_by_invoke = prompt_template.invoke({})
prompt_by_format = prompt_template.format()
prompt_by_format_messages = prompt_template.format_messages()
prompt_by_format_prompt = prompt_template.format_prompt()

print("---------------prompt_by_invoke")
print(type(prompt_by_invoke))
print(prompt_by_invoke)

print("---------------prompt_by_format")
print(type(prompt_by_format))
print(prompt_by_format)

print("---------------prompt_by_format_messages")
print(type(prompt_by_format_messages))
print(prompt_by_format_messages)

print("---------------prompt_by_format_prompt")
print(type(prompt_by_format_prompt))
print(prompt_by_format_prompt)

2.3 运行结果

2.4 小结和使用建议

ChatPromptValue可以调用to_messages ()和to_string ()将ChatPromptValue转换成消息list类型和字符串类型,所以直接使用invoke()进行调用即可

2 模版的参数类型

上述示例仅使用了元祖的方式构建ChatPromptTemplate列表,实际上ChatPromptTemplate列表的元素可以是多种参数类型,以下将探究tuplestrdictMessageBaseChatPromptTemplate五种类型

2.1 tuple

python 复制代码
prompt_template = ChatPromptTemplate([
    ("system", "你是私人助理小贝"),
    ("human", "你是谁?")
])

2.2 str

注意,此种方式创建的消息,只会默认为是HumanMessage,所以不推荐

python 复制代码
prompt_template = ChatPromptTemplate([
    "你好"
])

2.3 dict

python 复制代码
prompt_template = ChatPromptTemplate([
    {"role":"system", "content": "你是私人助理小贝"},
    {"role":"human", "content": "你是谁?"}
])

2.4 Message

python 复制代码
prompt_template = ChatPromptTemplate([
    SystemMessage("你是私人助理小贝"),
    HumanMessage("你是谁?")
])

2.5 BaseChatPromptTemplate

使用 BaseChatPromptTemplate,可以理解为ChatPromptTemplate里嵌套了 ChatPromptTemplate。

python 复制代码
system_prompt_template = ChatPromptTemplate([("system", "你是私人助理小贝")])
human_prompt_template = ChatPromptTemplate([("human", "你是谁?")])

prompt_template = ChatPromptTemplate([
    system_prompt_template,
    human_prompt_template
])

3 结合大模型使用模板

3.1 代码

python 复制代码
import os
import dotenv
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

os.environ["OPENAI_BASE_URL"] = os.getenv("QWEN_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("QWEN_API_KEY")

# 获取对话模型
chat_model = ChatOpenAI(
    model="qwen-plus",
    streaming=True
)

prompt_template = ChatPromptTemplate([
    ("system", "你是私人助理小贝"),
    ("human", "我是Jevon"),
    ("ai", "你好Jevon"),
    ("human", "我是谁?")
])

prompt = prompt_template.invoke({})
# 调用模型
response = chat_model.stream(prompt)

# 流式输出
for chunk in response:
    print(chunk.content, end='', flush=True)

3.2 运行效果

因为消息模版的存在,使得大模型有了记忆力

4 MessagesPlaceholder

4.1 概念以及应用场景

当你不确定消息提示模板使用什么角色,或者希望在格式化过程中 插入消息列表 时,该怎么办? 这就需 要使用 MessagesPlaceholder,负责在特定位置添加消息列表。即一个占位符,后续调用消息模板时可以将消息列表填充进去。

使用场景:多轮对话系统存储历史消息以及Agent的中间步骤处理此功能非常有用。

4.2 代码示例

python 复制代码
import os
import dotenv
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

os.environ["OPENAI_BASE_URL"] = os.getenv("QWEN_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("QWEN_API_KEY")

# 获取对话模型
chat_model = ChatOpenAI(
    model="qwen-plus",
    streaming=True
)

prompt_template = ChatPromptTemplate([
    ("system", "你是私人助理小贝"),
    MessagesPlaceholder('history'),
    ("human", "{question}")
])

prompt = prompt_template.invoke({
    "history":[("human", "我是Jevon"),
    ("ai", "你好Jevon")],
    "question": "我是谁?"
})
# 调用模型
response = chat_model.stream(prompt)

# 流式输出
for chunk in response:
    print(chunk.content, end='', flush=True)

4.3 运行效果

5 小结

ChatPromptTemplate的写法很多,但是有很多都是得到同一个效果,就显得有点鸡肋,目前唯一感觉有点用的就是MessagesPlaceholder,这个对后续大模型记忆有帮助。感觉ChatPromptTemplate的构造和参数大概有个印象即可,茴字的写法太多了,能看懂他人代码即可。

相关推荐
于是我说1 分钟前
一份Python 面试常见问题清单 覆盖从初级到高级
开发语言·python·面试
BoBoZz191 分钟前
RotationAroundLine 模型的旋转
python·vtk·图形渲染·图形处理
Kurbaneli5 分钟前
Python金融数据分析革命:Mootdx让通达信数据获取变得如此简单
python
吧啦蹦吧15 分钟前
`org.springframework.util.ClassUtils#forName
开发语言·python
倔强的小石头_17 分钟前
Python 从入门到实战(十):Pandas 数据处理(高效搞定表格数据的 “瑞士军刀”)
人工智能·python·pandas
Together_CZ27 分钟前
DarkIR: Robust Low-Light Image Restoration——鲁棒的低光照图像复原
python·image·robust·darkir·鲁棒的低光照图像复原·low-light·restoration
拾贰_C41 分钟前
【python | pytorch | scipy】scipy scikit-learn库相互依赖?
pytorch·python·scipy
BoBoZz191 小时前
PolyDataContourToImageData 3D集合图像转换成等效3D二值图像
python·vtk·图形渲染·图形处理
2401_841495641 小时前
【自然语言处理】关系性形容词的特征
人工智能·python·自然语言处理·自动识别·特征验证·关系性形容词·语言学规则和计算
sulikey1 小时前
Anaconda 无法找到 Anaconda Prompt 的原因
prompt·anaconda·anaconda prompt