How to

【How to】Dify 对话变量:构建简化版 OpenAI 记忆

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 中是否存在符合记忆定义的内容,并要求模型输出 yesno,以便下游的 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)
文章来源: https://dify.ai/blog/dify-conversation-variables-building-a-simplified-openai-memory
← 返回文章列表