本文使用Dify v1.4.0版本,使用qwen-vl-max-latest作为多模态大模型。主要介绍了Dify工作流中的LLM节点的_transform_chat_messages方法的执行流程。该函数的主要目的是确保使用 Jinja2 模板格式的消息内容能被正确处理。通过将 jinja2_text 内容复制到 text 属性中,使后续处理逻辑可以统一使用 text 属性,而不需要关心消息的模板类型。
一.Chatflow流程示例

SYSTEM:
执行指令{{#sys.query#}}。
USER:
{{#sys.query#}}
{{#sys.files#}}
比如,用户在对话的时候,上传了一张图像,并且配上文字:一句话描述图像

二._transform_chat_messages函数
1.被_run调用
该函数在 _run 方法中的初始化阶段被调用,为后续的消息处理准备好正确的文本内容。

2._transform_chat_messages源码
这个函数主要负责转换聊天消息模板,确保 Jinja2 模板内容被正确处理。
def_transform_chat_messages(
self, messages: Sequence[LLMNodeChatModelMessage] | LLMNodeCompletionModelPromptTemplate, /
) -> Sequence[LLMNodeChatModelMessage] | LLMNodeCompletionModelPromptTemplate:
if isinstance(messages, LLMNodeCompletionModelPromptTemplate):
if messages.edition_type == "jinja2"and messages.jinja2_text:
messages.text = messages.jinja2_text
return messages
for message in messages:
if message.edition_type == "jinja2"and message.jinja2_text:
message.text = message.jinja2_text
return messages

三.函数参数和返回值
1.参数
messages – 可以是两种类型之一:
-
Sequence[LLMNodeChatModelMessage]:聊天消息序列 -
LLMNodeCompletionModelPromptTemplate:补全模型提示模板

2.返回值
与输入参数类型相同。

四.处理流程
1.判断输入类型
-
首先检查 messages是否为LLMNodeCompletionModelPromptTemplate类型
2.处理补全模型提示模板
如果是 LLMNodeCompletionModelPromptTemplate 类型:
-
检查
edition_type是否为"jinja2"且jinja2_text存在 -
如果条件满足,将
jinja2_text赋值给text属性 -
返回处理后的对象
3.处理聊天消息序列
如果是 Sequence[LLMNodeChatModelMessage] 类型:
-
遍历序列中的每个消息对象
-
对于每个消息,检查
edition_type是否为"jinja2"且jinja2_text存在 -
如果条件满足,将消息的
jinja2_text赋值给text属性 -
返回处理后的消息序列
参考文献
[1] Dify工作流中的LLM节点:_transform_chat_messages方法:https://z0yrmerhgi8.feishu.cn/wiki/D4w3wqxaqidUMokeTcYcCfTunig
[2] LLMNode类:https://github.com/langgenius/dify/blob/1.4.0/api/core/workflow/nodes/llm/node.py
知识星球服务内容:Dify源码剖析及答疑,Dify对话系统源码,NLP电子书籍报告下载,公众号所有付费资料。加微信buxingtianxia21进NLP工程化资料群。
(文:NLP工程化)