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的构造和参数大概有个印象即可,茴字的写法太多了,能看懂他人代码即可。

相关推荐
mingo_敏15 分钟前
DeepAgents : 权限(Permissions)
人工智能·深度学习·langchain
浦信仿真大讲堂21 分钟前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study1 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境2 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境2 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1232 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102162 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb003 小时前
一个项目带你入门AI应用开发01
python
0566463 小时前
Python康复训练——常用标准库
开发语言·python·学习
昆曲之源_娄江河畔3 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql