Dify 中的上下文变量以及它们与 system、user 变量的关系和配合方式
理解 Dify 中的上下文变量以及它们与 system、user 变量的关系和配合方式,对于构建流畅高效的 AI 应用至关重要。由于搜索结果中的详细信息较多,下面我帮你梳理一下核心概念和常见用法。
Dify 中的“上下文变量”并非特指某一种变量,而是所有能在工作流节点间传递信息和维持状态的变量的统称,这主要包括你提到的 System Variables(系统变量)、User Variables(用户变量),此外通常还包括 Session Variables(会话变量) 和 Environment Variables(环境变量)。它们像血液一样在工作流中流动,携带信息,使应用具备情境感知和记忆能力。
为了让你快速了解这些变量如何协同工作,我用一个表格来汇总它们的核心特点:
变量类型 | 前缀/标识 | 作用域与生命周期 | 主要特点与用途 | 常见变量示例或说明 |
---|---|---|---|---|
用户变量 | 自定义命名 | 单次请求内有效 | 存储用户输入的原始数据(文本、数字、文件等),是工作流的起点 | 用户输入的查询文本、上传的文件等 |
系统变量 | sys. | 全局只读 | 由系统自动生成,提供运行时的上下文信息 | sys.query (用户当前查询)sys.dialogue_count (对话轮数)sys.conversation_id (会话ID)sys.files (用户上传的文件列表) |
环境变量 | 自定义命名 | 全局只读 | 存储敏感配置信息(如 API 密钥、数据库连接串),避免硬编码 | API 密钥、数据库连接字符串等 |
会话变量 | 自定义命名 | 在整个 Chatflow 会话期间有效 | 在多轮对话中临时存储特定信息(如用户偏好、历史记录) | 用户语言偏好、对话历史、表单填写进度等 |
🧭 可以看到,上下文变量是一个统称,它涵盖了上述这些在工作流中传递上下文信息的变量。
💡 变量间的配合使用
在实际应用中,这些变量并非孤立存在,而是相互协作,共同构建出智能的应用逻辑。System 变量和 User 变量在其中扮演着基础且重要的角色。
📖 常见场景一:基于知识库的智能问答(RAG)
这是最经典的应用场景之一,涉及系统变量、知识检索输出变量和LLM节点的协作。
用户提问:用户输入问题,如“Dify是什么?”,这会存储在
sys.query
(系统变量)中。知识检索:知识检索节点接收
sys.query
作为查询输入,从知识库中查找相关内容。LLM生成回答:LLM节点会接收到原始问题
{{sys.query}}
和检索到的知识{{knowledge_result}}
(或其他你定义的变量),并基于这些上下文信息生成最终回答。提示词中常会包含类似“根据以下知识库内容:{{context}}
... 请回答用户的问题:{{query}}
...”的指令。
在这个过程中,sys.query
(System变量) 提供了用户的原始意图,而知识检索的结果作为上下文传递给LLM,User变量则可能在更前一步作为工作流的触发起点。
💬 常见场景二:多轮对话与状态维护(Chatflow)
此案例展示了会话变量与系统变量、用户变量的配合。
信息提取:用户首轮消息(
sys.query
)中可能包含部分信息,如“我想预约挂号”(System变量)。参数提取器节点可以从sys.query
中提取出结构化数据,如“意图=挂号”。状态记录:使用变量赋值节点将提取到的信息(如用户后续提供的科室、时间等,这些可能来源于用户的新输入,即新的User变量/System变量)存储到会话变量中(例如
patient_department
,appointment_time
)。信息复用与流程控制:在后续轮次中,通过
sys.dialogue_count
(System变量)判断对话轮次,并读取会话变量中的信息(如已收集的信息、未收集的信息),决定下一步询问什么,逐步补充缺失信息。最终处理:所有必要信息收集完毕后,调用 LLM 或逻辑判断节点完成最终操作(如生成预约确认信息)。
这里,System变量(如 sys.query
, sys.dialogue_count
) 提供了对话的当前状态和进程信息,User变量是用户每一轮的新输入,而Session变量则负责记住在整个对话过程中收集到的关键信息,从而实现了有状态的连贯对话。
⚠️ 使用变量时要注意
变量引用格式:在 Dify 工作流的节点配置中,通过
{{变量名}}
的格式来引用变量。会话变量的写入:会话变量不能直接修改,必须通过“变量赋值”节点来进行写入或更新操作。
清晰命名:为变量起一个易于理解的名字(如
user_query
,retrieved_knowledge
),提高工作流的可读性和可维护性。作用域意识:清楚不同变量的作用域和生命周期,避免在无效范围试图引用变量。
善用调试工具:充分利用 Dify 工作流编辑器的 “预览” 和 “运行日志” 功能,观察变量的实际值和传递路径,是排查问题的利器。
📚 总结
你可以把 Dify 中的上下文变量理解为一个协作团队:
系统变量 (System Variables) 像团队的观察员,自动告诉你当前发生了什么(用户问了什么、第几轮对话、会话ID等)。
用户变量 (User Variables) 是原材料提供者,提供了需要被处理的原始输入。
会话变量 (Session Variables) 是团队的备忘录,在整个对话期间记录关键信息和状态,避免遗忘。
环境变量 (Environment Variables) 是团队的保险柜,安全地存储着各种密钥和配置。
它们各司其职,相互配合,共同保证了你的 Dify 应用能够智能地理解用户意图、维持对话状态并生成准确的回应。
希望这些解释和示例能帮助你更好地理解 Dify 中的上下文变量以及它们与 system、user 变量的配合使用。