【经验分享】Dify工作流中生成的内容写为文件导出


问题

       最近在研究利用多智能体进行实体关系抽取,所以想到了用Dify的工作流来做,工作流是搭建好了,但是发现这些生成的内容好像无法导出到本地或者线上导出。
在这里插入图片描述

在这里插入图片描述


原因分析

1、沙箱环境的限制

       Dify 的代码执行环境是基于沙箱(Sandbox)的,这种环境是为了确保代码执行的安全性和隔离性。沙箱环境限制了代码对本地文件系统和外部网络的直接访问,因此无法直接将生成的内容导出到本地或线上存储。沙箱环境中代码的执行和资源访问受到严格控制,例如临时文件的创建和删除都在沙箱内部完成。

2、功能设计的侧重点

       Dify 的工作流界面主要是为了方便用户直接查看和使用生成的内容,而不是进行复杂的数据处理。这种设计使得用户可以快速获得所需信息,但同时也限制了数据导出的灵活性。


思路

那么在查了一些博主的方案后,发现是代码在docker部署下的sandbox容器目录中临时运行的,那么有了下面的思路:

  1. 在工作流中添加代码节点,将生成内容写入到sandbox的临时环境下
  2. 在宿主机建立与镜像位置的映射,将沙箱文件映射到宿主机,免于进入docker镜像查看

步骤

操作系统:ubuntu 18.04
dify版本:1.1.3
部署方式:docker compose 部署

1、在sandbox容器和本地中创建存放文件的目录

1.1 sandbox

       在启动dify时候可以看到有一个Container 名字为 docker-sandbox-1 这个就是我们的代码执行节点的运行目录。
在这里插入图片描述
如果容器正在运行,可以使用 docker exec 命令进入容器的 shell 环境。可以运行以下命令:

docker exec -it docker-sandbox-1 /bin/bash

进入容器后找到如下目录,并执行以下操作:

#进入目录
cd /var/sandbox/sandbox-python/tmp/

# 创建一个file的目录 可以自定义 
mkdir file

# 给予此文件夹可写入权限 个人建议给于整个目录权限
cd /var
chmod -R 777 *

在这里插入图片描述

1.2 本地

#进入本地目录
cd /dify/docker/volumes/sandbox/

# 创建一个file的目录 可以自定义 
mkdir file

# 给予此文件夹可写入权限 个人建议给于整个目录权限
chmod -R 777 *

2、建立宿主机映射

在dify的docker目录下,打开docker-compose.yaml文件,找到以下内容,在volumes下加一行

# ./volumes/sandbox/file 是宿主机目录下的地址
# /var/sandbox/sandbox-python/tmp/file:rw 是容器中的地址 赋予读写权限
- ./volumes/sandbox/file:/var/sandbox/sandbox-python/tmp/file:rw
# The DifySandbox
  sandbox:
    image: langgenius/dify-sandbox:0.2.11
    restart: always
    environment:
      # The DifySandbox configurations
      # Make sure you are changing this key for your deployment with a strong key.
      # You can generate a strong key using `openssl rand -base64 42`.
      API_KEY: ${SANDBOX_API_KEY:-dify-sandbox}
      GIN_MODE: ${SANDBOX_GIN_MODE:-release}
      WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15}
      ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true}
      HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128}
      HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128}
      SANDBOX_PORT: ${SANDBOX_PORT:-8194}
    volumes:
      - ./volumes/sandbox/dependencies:/dependencies
      - ./volumes/sandbox/conf:/conf
      - ./volumes/sandbox/file:/var/sandbox/sandbox-python/tmp/file:rw
    healthcheck:
      test: [ 'CMD', 'curl', '-f', 'http://localhost:8194/health' ]
    networks:
      - ssrf_proxy_network

在这里插入图片描述

至此,准备工作已完成,接下来就是在Dify进行操作


3、 在dify中创建工作流

工作室-创建空白应用-选择工作流
在这里插入图片描述

在这里插入图片描述

在这里创建了四个节点,开始、结束、大模型回答节点以及代码执行节点
在这里插入图片描述


4、 各节点设计

       开始、结束节点就不介绍了,简单介绍中间两个节点

LLM节点

       此节点的作用主要是调用大模型生成回答。
在这里插入图片描述


文件导出代码节点

       在这里传入了两个参数,一个是上个节点大模型生成的text回答,一个是方便导出文件辨别加入了user_id(系统自动生成)。
在这里插入图片描述

代码如下:
文件路径为临时代码执行位置,在sandbox的docker容器中,后面展示如何进入该位置

import os
import json

def main(arg1: list, user_id: str) -> dict:
    # 定义文件路径
    file_path = f'/tmp/file/{user_id}_response.json'
    # 获取目录路径
    directory = os.path.dirname(file_path)
    # 如果目录不存在,则创建目录
    if not os.path.exists(directory):
        os.makedirs(directory)
    
    # 将 JSON 对象序列化为字符串
    json_str = json.dumps(arg1, ensure_ascii=False, indent=4)
    
    # 打开文件并写入内容
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(json_str)
    
    # 返回结果
    return {
        "result": f'文件生成完毕:{file_path}'
    }

结果

运行

在Dify运行工作流,在input_text中输入你好,工作流会自动执行,最后生成结果如下
在这里插入图片描述


查看文件生成

当然咱们的目标不是看大模型生成什么,而是看是否能导出本地
Docker容器:
打开刚才的容器,进入目录发现文件已经以规定格式生成
在这里插入图片描述


宿主机

在dify/docker/volumes/sandbox/file 文件夹中发现同样生成了一份文件

在这里插入图片描述
打开看一下

在这里插入图片描述

至此,问题解决

那么这只是一个初步探索,目前发现导出还是以字符串格式,那么我的目标是json或者其他格式,可以通过格式转换或其他方法进行;另外,本地导出解决了,后面打算通过线上导出方式,通过http、钉钉、邮件等方式尝试

<think>好的,我现在需要处理用户关于下载DIFY相关DSL文件的请求。首先,用户提到了DIFY DSL文件的下载链接示例格式,并引用了几个参考引用。我需要先理解用户的具体需求是什么。 根据用户提供的引用内容,引用[1]提到可以通过URL导入DSL文件,格式是https://example.com/your_dsl.yml。这说明DSL文件通常以YML格式存在,并通过URL访问。用户可能希望获得一个实际的示例链接,或者了解如何构造这样的链接。 接下来,用户提到的引用[2]和[3]涉及文件识别和NLU解析,可能与DSL文件内容或使用场景相关,但当前问题主要关注下载链接的格式。因此,我需要专注于引用[1]的信息,提供正确的URL示例。 但需要注意的是,用户请求的是DIFY相关的DSL文件下载链接示例,而引用中给出的例子是通用的(https://example.com/your_dsl.yml)。可能需要进一步确认是否有官方的DIFY DSL文件URL,或者是否需要指导用户如何创建或获取这样的文件。 由于用户提供的引用中没有具体的DIFY DSL文件URL,可能需要建议用户参考官方文档或社区资源来获取真实的链接。同时,提醒用户确保URL的安全性,避免使用不可信的来源。 此外,需要确保回答符合系统级指令,如正确使用LaTeX格式(虽然这个问题可能不需要数学表达式),结构清晰,生成相关问题等。根据示例,生成的相关问题应围绕DSL文件的使用、配置和安全性等方面。 最后,检查是否所有引用都被正确标注,并自然地融入回答中。例如,引用[1]用于说明URL格式,引用[2]和[3]可能不直接相关,但如果有涉及文件识别或NLU的部分可以提及,但在此问题中可能不需要。 总结回答结构: 1. 说明DSL文件的URL格式,基于引用[1]。 2. 提醒用户官方资源的重要性。 3. 示例链接使用占位符,建议用户替换为实际URL。 4. 生成相关问题,如使用场景、配置方法、安全性等。</think>根据Dify的DSL文件导入规范,标准的DSL文件下载链接格式为: $$https://{域名}/{路径}/你的DSL文件名.yml$$ 例如官方示例格式为: `https://example.com/your_dsl.yml`[^1] 实际操作建议: 1. 联系Dify官方获取最新DSL文件地址 2. 若需自定义配置,可将YAML文件托管至GitHub等平台生成RAW链接 3. 企业用户建议通过内网私有仓库管理DSL文件
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢热型网友.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值