本文使用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工程化)