当前位置: 首页 > ds >正文

Dify工作流(三)

参数提取器节点

参数提取器节点可以利用 LLM 从自然语言推理并提取结构化参数,用于后置的工具调用或 HTTP 请求。

参数提取器节点设置页如下:

  模型:参数提取器的提取依靠的是 LLM 的推理和结构化生成能力,这里指定使用的模型。

  输入变量:一般为用于提取参数的变量输入,一般为上游节点输出内容。如上游节点为开始 节点,这里可以是sys.query。

  视觉:开启视觉功能允许模型输入图片,并根据图像内容的理解回答用户问题。

  提取参数:可以手动添加需要提取的参数,也可以从已有工具中快捷导入。

  高级设置:可以设置推理模式和记忆。关于推理模式,部分模型同时支持两种推理模式,通

过函数/工具调用(Function/Tool Calling)或是纯提示词(Prompt)的方式实现参数提   取,在指令遵循能力上有所差别。例如某些模型在函数调用效果欠佳的情况下可以切换成提 示词推理。关于记忆,开启记忆后问题分类器的每次输入将包含对话中的聊天历史,以帮助 LLM 理解上文,提高对话交互中的问题理解能力。

案例七:创建chatflow,对用户输入内容进行参数提取并输出。

1) 创建开始及参数提取器节点

以上第4步骤中,参数设置为Array类型因为用户输入的内容包含多个人员的工资信息。 指定内容可以帮助参数提取器理解如何提取参数,内容如下:

从用户输入/sys.query的信息中,提取每个员工对应的薪资及薪资明细查询地址

2) 创建直接回复节点输出结果

3) 测试并发布chatflow

预览测试:

输入内容:

根据公司最新薪酬方案:

李明的月薪为人民币15,000元,详情请查阅: https://salary.example.com/view/liming9823

王芳的月薪为人民币18,000元,详情请查阅: https://salary.example.com/view/wangfang7045 张伟的月薪为人民币12,000元,详情请查阅: https://salary.example.com/view/zhangwei5617

发布使用:

迭代节点

迭代节点可以对数组中的元素依次执行相同的操作,直至输出所有结果,可以理解为任务批处理 器。迭代节点通常配合数组变量使用。

例如在长文翻译迭代节点内,如果将所有内容输入至 LLM 节点,有可能会达到单次对话限制。上 游节点可以先将长文拆分为了多个片段,配合迭代节点对各个片段执行批量翻译,以避免达到

LLM 单次对话的消息限制。

迭代节点的设置页如下:

迭代节点的结构通常包含输入变量、迭代工作流、输出变量三个功能单元。

  输入变量: 仅接受 Array 数组变量类型数据。

  迭代工作流: 你可以在迭代节点中使用多个工作流节点,编排不同的任务步骤。

  输出变量: 仅支持输出数组变量 Array[List]。

迭代节点原理图如下:

案例八:创建chatflow,根据用户输入的技术完成该技术3章节内容输出。

1) 创建开始及LLM节点

开始节点后创建LLM节点,该LLM节点实现根据用户输入的技术标题,给出3个子标题。 LLM节点 命名为“标题生成子标题”。

SYSTEM提示词内容如下:

你对AI技术非常了解,根据用户输入的技术标题/sys.query给我生成关于该技术内容相关的3个子标题,不需要给出

2) 创建参数提取器节点,实现提取子标题到数组操作

将参数提取器节点改名为“提取子标题到数组”,并设置提取的标题放入subject参数中(Array 类型)。

3) 创建迭代节点并配置

创建迭代节点实现对子标题遍历,在迭代节点中设置LLM节点和直接回复节点,实现对每个子标 题内容的扩写并将结果直接输出。

其中,第11步骤中的内容如下:

请生成关于{{上下文}}技术的/item章节内容,要求不超过100字。 输出格式为:/item加粗,然后给出该子章节内容

4) 测试并发布chatflow

预览测试:

发布使用:

Http请求节点

Http请求节点允许通过 HTTP 协议发送服务器请求,适用于获取外部数据、webhook、生成图  片、下载文件等情景。它让你能够向指定的网络地址发送定制化的 HTTP 请求,实现与各种外部 服务的互联互通。

该节点支持常见的 HTTP 请求方法:

   GET:用于请求服务器发送某个资源。

   POST:用于向服务器提交数据,通常用于提交表单或上传文件。

   PATCH:用于在请求-响应链上的每个节点获取传输路径。

   PUT:用于向服务器上传资源,通常用于更新已存在的资源或创建新的资源。

   DELETE:用于请求服务器删除指定的资源。

Http请求节点设置页如下:

案例九:创建chatflow,使用Http请求节点进行Get/Post/文件上传/下载操作。

1) 编写Python 代码构建Web服务

这里使用Flask框架构建简单的Web服务,后续可以进行Http Get/Post/文件上传/下载请求服 务。

python_service.py (使用Flask框架构建Web服务),该代码中Get/Post请求都需要对应的 user_id和comment字段内容。

## 安装如下依赖
## pip install Flask==3.1.0
## pip install flask-cors==5.0.1  # 允许跨域请求
from flask import Flask, request, send_file, jsonify
from io import BytesIO
from flask_cors import CORS import os
app = Flask(__name__)
# 启用 CORS 支持,允许所有来源(origin)访问您的 Flask 后端 CORS(app)
# 用于存储上传的文件,键为文件名,值为文件内容 file_storage = {}
@app.route('/feedback', methods=['GET', 'POST'])
def feedback():
if request.method == 'GET':
user_id = request.args.get('user_id')
comment = request.args.get('comment')
if not user_id or not comment:
return jsonify({'error': '缺少 user_id 或 comment 参数'}), 400
return jsonify({'message': '收到 GET 请求', 'user_id': user_id, 'comment': comment})
elif request.method == 'POST':
data = request.json
if not data or 'user_id' not in data or 'comment' not in data:
return jsonify({'error': '缺少 user_id 或 comment 参数'}), 400
user_id = data['user_id']
comment = data['comment']
return jsonify({'message': '收到 POST 请求', 'user_id': user_id, 'comment': comment})
@app.route('/upload', methods=['PUT'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': '未找到文件部分'}), 400
file = request.files['file'] if file.filename == '':
return jsonify({'error': '未选择文件'}), 400
# 保存文件到服务器的指定路径
upload_path = os.path.join('uploads', file.filename)
file.save(upload_path)
file_storage[file.filename] = upload_path
return jsonify({'message': '文件上传成功', 'filename': file.filename})@app.route('/download/<filename>', methods=['GET'])
def download_file(filename):
if filename not in file_storage:
return jsonify({'error': '文件未找到'}), 404
file_path = file_storage[filename]
return send_file(file_path, as_attachment=True)
if __name__ == '__main__':
# 确保上传目录存在
os.makedirs('uploads', exist_ok=True)
app.run(host='0.0.0.0', port=15050, debug=True)

以上代码启动后,通过运行“test_python_service.py”代码进行测试。 test_python_service.py(测试Get/POST/文件上传/下载服务):

## 安装如下依赖
## pip install requests==2.32.3
import requests import os
# 定义服务的基础 URL
BASE_URL = 'http://192.168.1.105:15050'
# 测试 GET 请求
def test_get_feedback(user_id, comment):
params = {'user_id': user_id, 'comment': comment}
response = requests.get(f'{BASE_URL}/feedback', params=params) print('GET /feedback 响应:', response.json())
# 测试 POST 请求
def test_post_feedback(user_id, comment):
data = {'user_id': user_id, 'comment': comment}
response = requests.post(f'{BASE_URL}/feedback', json=data)
print('POST /feedback 响应:', response.json())
# 测试文件上传(使用 PUT 请求)
def test_upload_file(file_path):
with open(file_path, 'rb') as file:
files = {'file': (os.path.basename(file.name), file)}
response = requests.put(f'{BASE_URL}/upload', files=files) print('PUT /upload 响应:', response.json())
return response.json().get('filename')
# 测试文件下载
def test_download_file(filename):
response = requests.get(f'{BASE_URL}/download/{filename}')
if response.status_code == 200:local_filename = f'downloaded_{os.path.basename(filename)}'
with open(local_filename, 'wb') as file:
file.write(response.content)
print(f'文件下载成功,保存为:{local_filename}') else:
try:
print('下载失败:', response.json())
except Exception:
print(f'下载失败(非 JSON 响应),状态码: {response.status_code}')
# 示例调用
if __name__ == '__main__':
test_get_feedback('123', '这是一个测试评价')
test_post_feedback('123', '这是另一个测试评价')
uploaded_filename = test_upload_file('./data/img.jpg')
if uploaded_filename:
test_download_file(uploaded_filename)

此外,这里还可以通过“Flask服务测试.html”(详见资料)在页面中测试Get/POST/文件上传/ 下载服务。

2) 创建开始节点,设置输入字段

输入字段中user_id和comment字段为文本类型,file为单文件类型,文件类型支持本地上传文档 和图片。

3) 创建“问题分类器”节点

问题分类器节点根据用户输入的内容通过LLM理解并分类,执行到下游响应的Http请求。

4) 创建Http请求节点并配置

Get请求( http://192.168.1.105/feedback ),配置PARAMS参数。

Post请求(需要配置Body,内容为:{"user_id": "/user_id","comment": "/comment"}):

上传文件请求( http://192.168.1.105/upload ),配置BODY。

下载文件请求( http://192.168.1.105/download/要下载的文件名):

5) 对GET/POST/上传文件Http请求节点设置LLM节点

GET/POST/上传文件Http请求后返回的数据默认是Unicode 转义序列格式,这里在后面跟上 LLM大模型节点对这种格式转换成对应的字符。

SYSTEM提示词如下:

将 {{xxx}}中Unicode 转义序列转换成对应字符,直接输出转换后的结果即可,不要输出多余内容。

以上xxx 替换为对应的请求输出的body,需要手动一个个设置。

6) 设置直接回复节点

特别注意:下载文件请求中,直接回复节点中获取files字段就是下载的文件。

7) 测试并发布chatflow


启动“python_service.py”代码,将web服务启动起来。 预览测试:

发布使用:

http://www.xdnf.cn/news/20613.html

相关文章:

  • 【系统分析师】第11章-关键技术:软件需求工程(核心总结)
  • 力扣hot100:相交链表与反转链表详细思路讲解(160,206)
  • 【LLIE专题】LYT-Net:一种轻量级 YUV Transformer 低光图像增强网络
  • 消息队列的可靠性、顺序性怎么保证?
  • PaddlePaddle——飞桨深度学习实现手写数字识别任务
  • 从0到1学习Vue框架Day01
  • PNG和JPEG和BMP文件格式转换
  • Ansible题目全解析与答案
  • 棱镜的技术加持:线扫相机如何同时拍RGB和SWIR?
  • 【开题答辩全过程】以 校园二手货物交易平台为例,包含答辩的问题和答案
  • Spring AI Tool 实现自然语言操作MySql数据库操作详解
  • postman接口功能测试
  • 技术演进中的开发沉思-93 Linux系列:启动流程
  • 开放式LLM的崛起:未来已至
  • JavaScript笔记之JS 和 HTML5 的关系
  • 跨域解决方案——CORS学习了解
  • B.20.10.06-高并发系统设计电商应用
  • 五.贪心算法
  • linux内核 - 获取内核日志时间戳的方法
  • 联邦学习常见模型
  • ChatGPT 协作排查:Node.js 内存泄漏的定位与修复
  • JavaScript 结构型模式详解
  • stl--保研机试极限复习
  • 网易UU远程,免费电脑远程控制软件
  • 计算机网络学习(七、网络安全)
  • leetcode 1304. 和为零的 N 个不同整数 简单
  • LeetCode 面试经典 150 题:合并两个有序数组(双指针解法详解)
  • 【如何导出qemu模拟的设备树文件】
  • SC3336 rgb sensor linux
  • 初探 Autogen:用多智能体实现协作对话