ChatPromptTemplate创建方式比较
代码1:
prompt = ChatPromptTemplate.from_messages([SystemMessage(content="You are a helpful assistant."),MessagesPlaceholder(variable_name="history"),("human", "{input}")
])
代码2:
prompt = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant."),MessagesPlaceholder("history"),("human", "{question}")]
)
1. SystemMessage和 (“system”, “You are a helpful assistant.”)是一样的效果吗?这两种写法都可以吗?
-
SystemMessage(content="You are a helpful assistant.")
:- 这是直接使用了
SystemMessage
类来创建一个系统消息对象。 SystemMessage
是BaseMessage
的一个子类,专门用于表示系统级别的提示或指令。
- 这是直接使用了
-
("system", "You are a helpful assistant.")
:- 这种形式使用了一个元组
(role, content)
来定义一条消息,其中"system"
表示这条消息的角色是系统消息,第二个元素是内容。 - 在内部,LangChain 会将这种格式的元组转换为相应的
BaseMessage
子类对象(例如SystemMessage
)。
- 这种形式使用了一个元组
这两种写法在功能上是等价的,但推荐根据具体情况和个人偏好选择合适的写法。
有什么区别?
- 类型安全性:使用
SystemMessage
提供了更强的类型检查,因为它明确地指定了这是一个系统消息。 - 灵活性:使用元组
(role, content)
更加灵活,适用于快速编写或当角色不固定时。 - 一致性:如果你在整个项目中都使用
BaseMessage
类(如SystemMessage
,HumanMessage
,AIMessage
),那么保持一致的风格可能会使代码更清晰易读。
2. MessagesPlaceholder(variable_name="history")
vs MessagesPlaceholder("history")
-
MessagesPlaceholder(variable_name="history")
:- 明确指定了变量名为
"history"
,这种方式更加显式,有助于提高代码的可读性和维护性。
- 明确指定了变量名为
-
MessagesPlaceholder("history")
:- 直接传入字符串
"history"
作为参数,这种方式更为简洁,但在复杂情况下可能不如前一种方法直观。
- 直接传入字符串
区别和选择:
- 参数名明确性:使用
variable_name="history"
更加清晰地表明这个占位符的作用,特别是在处理多个占位符时。 - 简洁性:对于简单的场景,直接传入字符串
"history"
足够了,并且减少了不必要的冗余。 - API 设计意图:通常,如果 API 设计允许同时接受这两种形式,那么选择哪种取决于你的编码习惯和项目的具体需求。不过,为了保持代码的一致性和可读性,建议始终使用带有明确参数名的形式,除非有特别的理由不这样做。
总结
-
SystemMessage(content="...")
和("system", "...")
:- 功能相同,都可以用来指定系统消息。
- 推荐根据项目的一致性和个人偏好选择。
-
MessagesPlaceholder(variable_name="history")
和MessagesPlaceholder("history")
:- 基本上可以互换使用,但在复杂或多占位符的情况下,使用
variable_name="..."
更加清晰。 - 出于代码清晰度考虑,推荐使用带有明确参数名的形式。
- 基本上可以互换使用,但在复杂或多占位符的情况下,使用