Dify工作流中的LLM节点:_transform_chat_messages方法

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

发表评论