Dify 会话变量:构建轻量级 OpenAI 记忆功能
摘要:本文详解如何利用 Dify 会话变量模拟 OpenAI 记忆功能。通过配置变量、判断存储、提取记忆与响应节点,结合自定义代码实现类型转换,助你快速打造具备上下文感知与持久记忆能力的智能对话应用。
大家好!我是 Dify 产品团队的 Evan。很高兴向大家介绍我们的重磅新功能:会话变量(Conversation Variables)。
想象一下,给 AI 配备一个智能的临时记事本,让它能在整个对话过程中记住关键细节。这正是会话变量的作用!这些强大的短期记忆单元正在彻底改变 Chatflow 中的多轮对话体验,让 AI 交互变得前所未有的自然且具备上下文感知能力。
为什么它很重要?
- 提升相关性:通过存储和召回关键信息,AI 能提供更符合上下文的回复。
- 简化开发流程:随时读写变量,轻松管理复杂的对话状态,优化多步 AI 工作流,无需编写繁琐代码。
- 细粒度记忆控制:与宽泛的对话历史不同,会话变量允许精准管理特定信息片段,显著提升 AI 回复的准确性。

模拟 OpenAI 记忆功能
在本指南中,我们将探讨如何利用 Dify 的会话变量来模拟 OpenAI 的高级记忆功能。你将学会:
* 在聊天机器人中实现持久记忆
* 打造更智能、具备上下文感知能力的 AI 助手
* 将对话式 AI 的智能化水平提升至新高度

准备好为你的 Chatflow 提速了吗?让我们开始吧!
记忆机制的工作原理
记忆功能是一个自动化的存储过程。它专注于用户的查询,从中收集事实与偏好,最终将这些信息以特定方式加入对话上下文,使其成为生成回复时的对话记录的一部分。

整个流程主要依赖三个 LLM 节点:
* 判断是否存储为记忆节点:评估当前查询是否包含可推断的事实、偏好或用户记忆。
* 提取记忆节点:从用户查询中提取记忆对象。
* 响应节点:基于相关记忆生成回复。
记忆对象的结构、定义及相关提示词来源于此处。
分步操作指南
前置条件
- 注册或部署 Dify.AI
- 向 OpenAI 等模型提供商申请 API Key
创建会话变量
点击右上角按钮,进入会话变量管理页面。在这里,你可以增删改查会话变量。本例中,我们创建一个 Array[object] 类型的会话变量(因为该类型支持在对话中持续追加由三个属性组成的新记忆)。你可以为会话变量设置默认值,以便更灵活地应对特定场景。

记忆定义:从提供的文本中推断事实、偏好和记忆。推断约束条件如下:
* 事实、偏好和记忆需简洁且信息量大。
* 不要以“该人喜欢披萨”开头,应直接写“喜欢披萨”。
* 不要记录提供的用户/智能体详情,仅记录事实、偏好和记忆。
判断是否存储为记忆节点
我们检查 sys.query 中是否存在符合记忆定义的内容,并要求模型输出 yes 或 no,以便下游的 if-else 节点进行条件判断。若使用多模态模型,可开启视觉功能,允许上传需要记忆的笔记本截图或其他图片。

提取记忆节点
推断约束条件同上(简洁、不写主语、不记详情)。
该节点需使用具备指令遵循/推理能力的模型,如 Claude 3.5 Sonnet 或 GPT-4o。
变量赋值
此处选择追加模式(Append),以便在多轮对话中持续更新记忆。由于此处设置的变量类型为 object,我们需要一个代码节点(Code Node)将大模型的输出转换为正确的数据类型。

响应节点
此处让模型基于提供的记忆回复用户的 sys.query。若记忆中无相关内容,则使用用户查询的默认语言给出通用回答。

代码节点实现说明
为什么需要代码节点?
* 字符串转对象节点:用于将大模型输出的字符串转换为 object 格式,以便直接用于变量赋值。如果会话变量本身是字符串类型,则可直接引用大模型输出。
* 对象转字符串节点:在 Dify 的提示词编排中,变量默认统一视为字符串类型。因此,存储在会话变量中的 Array[object] 无法直接在提示词中引用,需要此类节点进行格式转换。
上图中的节点代码如下:
字符串转对象
import json
def main(arg1: str) -> object:
try:
# 解析输入的 JSON 字符串
input_data = json.loads(arg1)
# 提取记忆对象
memory = input_data.get("memory", {})
# 构建返回对象
result = {
"facts": memory.get("facts", []),
"preferences": memory.get("preferences", []),
"memories": memory.get("memories", [])
}
return {"mem": result}
except json.JSONDecodeError:
return {"result": "Error: Invalid JSON string"}
except Exception as e:
return {"result": f"Error: {str(e)}"}
对象转字符串
import json
def main(arg1: list) -> str:
# 将对象/列表格式转换为 JSON 字符串,以便在提示词中直接引用
return json.dumps(arg1)