RAGFlow爬虫组件使用及ragflow vs dify 组件设计对比

ops/2025/3/28 7:43:53/

上周末,两台电脑都失联了,一个是断网了,一个被我不小心关机。导致我两天没环境。只能整理,学点东西。

上周有个有个群友问我ragflow爬虫的没法使用的问题。幸好周六早上的时候实践了下。

使用网络爬虫

我搭建一个最简单的工作流。

我点击执行完以后报无法解析,前端报:

我又看了下后端日志报。说需要安装chrome依赖。

An unexpected error occurred: BrowserType.launch: Executable doesn't exist at /root/.cache/ms-playwright/chromium-1134/chrome-linux/chrome
╔════════════════════════════════════════════════════════════╗
║ Looks like Playwright was just installed or updated.       ║
║ Please run the following command to download new browsers: ║
║                                                            ║
║     playwright install                                     ║
║                                                            ║
║ <3 Playwright Team                                         ║
╚════════════════════════════════════════════════════════════╝

我把问题抛给了deepseek,然后它告诉我的方法。


重新构建可以,但是大家基本上都没有环境,直接进入docker操作吧。


# 进入ragflow服务的docker容器
docker exec -it ragflow-server /bin/bash#安装依赖
apt-get update && \ apt-get install -y \ libnss3 \ libnspr4 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libasound2# pip国内镜像源设置
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple# 安装 Playwright 并自动下载浏览器
pip install playwright && playwright install --with-deps chromium# 设置双重镜像加速
export PLAYWRIGHT_DOWNLOAD_HOST="https://npmmirror.com/mirrors/playwright/"
export PLAYWRIGHT_CDN_MIRROR="https://npmmirror.com/mirrors/playwright/"

如果没法执行,建议参考。ragflow想说爱你不容易,win10环境搭建、常用修改 中添加国内pip镜像源。

在安装的时候,可能会出现502,是因为官方的源不稳定,替换为清华的即可

# 1. 备份原始源
cp /etc/apt/sources.list /etc/apt/sources.list.bak# 2. 替换为清华源(Ubuntu 22.04)
sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list# 3. 清理缓存并更新
apt-get clean
rm -rf /var/lib/apt/lists/*
apt-get update -o Acquire::CompressionTypes::Order::=gz# 4. 重新安装字体依赖(使用清华源)
apt-get install -y --fix-missing \fonts-noto-color-emoji \fonts-wqy-zenhei \fonts-freefont-ttf \libfreetype6

还有一种情况,安装过程没有明显报错,但是不解析,查看运行结果。

执行成功以后。又用下面的连接进行了尝试,ok。

https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/data_preparation.html

节点设置

网页爬虫的节点设置里,提取类型,可以是markdownhtml文本三种,我们选择markdown即可。


提取完以后,我们可以直接返回对话,也可以使用大模型把进行适当的整理。

需要注意的是:

  • 网页爬虫组件一次只能爬取一个网页,所以要给一个url
  • 不要给爬虫传递上一个节点的信息,要确保只有url

我们可以在这里把所有的页面链接拿到,同提示词特殊处理,把相关的目录链接都拿到,然后再进行迭代处理,整个网页我们就都拿到,对于,然后在用大模型清洗一遍,调用接口保存到ragflow的向量库。是不是就实现了技术文档的采集,以及知识库的整理。

实现原理

然后我就想为什么ragflow的组件不能像dify那样,把输入和输出结构化?我简单的翻了下github上的源码。

ragflowagent/canvas.py文件里实现了一个工作流引擎,通过DSL定义组件及其执行流程。主要功能包括:

  1. DSL解析:加载包含组件配置的JSON结构
  2. 组件管理:动态实例化组件并建立依赖关系
  3. 流程控制:基于路径追踪的顺序执行机制
  4. 状态管理:维护对话历史、执行路径等运行时状态

我让ds帮我整理了下对应的流程,流程如下。

ragflow_dify_129">ragflow 和dify的组件基类对比

我又找到了ragflow和dify的组件基类,然后deepseek帮我对比了下。优缺点

ragflow的组件基类地址agent/component/base.py

dify的组件基类地址api/core/workflow/nodes/base/node.py

维度difyragflow
设计目标工作流节点基类参数化组件基类
核心优势类型安全 + 事件驱动参数管理 + 数据兼容性
性能轻量级(无第三方库依赖)较重(依赖pandas)
扩展性接口扩展配置扩展
适用场景事件驱动型工作流系统数据密集型批处理系统
技术债务泛型学习成本pandas依赖 + 递归风险
dify(BaseNode类)优缺点

优点:

  1. 类型安全完善
    • 使用TypeVarGeneric和严格的类型提示(如NodeRunResult | Generator
  2. 抽象层级清晰
  • 通过@abstractmethod明确定义接口,强制子类实现关键方法(如_run
  • 分离运行逻辑(run)与核心实现(_run),符合模板方法模式
  1. 异常处理健壮
  • 全局捕获异常并封装为NodeRunResult,保证工作流稳定性
  1. 扩展性优秀
  • 提供extract_variable_selector_to_variable_mapping等扩展点
  • 支持Generator生成事件流,适应异步场景
  1. 代码简洁高效
  • 核心方法(如run)仅30行,无冗余逻辑

缺点:

  1. 学习成本较高
    • 依赖泛型编程和复杂类型系统,对新手不友好
  2. 灵活性受限
  • 节点数据强绑定_node_data_cls,动态配置能力弱
  1. 调试难度大
  • 生成器事件流机制增加调试复杂度
ragflowComponentBase_182">ragflow(ComponentBase类)优缺点

优点:

  1. 参数管理强大
    • 完整的参数生命周期管理(更新/验证/序列化)
    • 支持嵌套参数解析(_recursive_update_param
  2. 数据兼容性好
  • 原生支持pd.DataFramepartial对象
  • 自动处理输入输出格式转换
  1. 调试能力完备
  • 内置debug_inputs和详细日志记录
  • 提供get_input_elements等诊断方法
  1. 工作流集成度高
  • 通过canvas管理组件依赖关系
  • 自动追踪message_history_window_size
  1. 验证机制全面
  • 20+种参数检查方法(check_decimal_float等)
  • JSON Schema动态校验支持

缺点:

  1. 性能瓶颈明显
    • 频繁使用pd.concat可能引发内存问题
    • 深度递归方法(_recursive_update_param)存在栈溢出风险
  2. 代码冗余度高
  • 多个相似静态方法(如check_positive_integer
  • 硬编码路径(param_validation_path_prefix
  1. 强耦合依赖
  • 深度绑定pandassettings模块
  • canvas上下文强依赖增加测试难度

知识库检索组件对比

ragflow的的知识库检索组件agent/component/retrieval.py
dify的知识库检索组件
api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py

维度difyragflow
设计范式工作流节点模式(强调状态流转)服务组件模式(强调参数配置)
错误处理多层异常捕获+业务错误分类依赖基础类异常处理,缺少细粒度错误类型
数据访问直接操作SQLAlchemy ORM通过KnowledgebaseService抽象数据访问
性能优化数据库查询优化+结果缓存机制依赖向量计算库(如Faiss)优化
扩展性通过extract_variable_selector_to_variable_mapping支持变量映射通过LLMBundle实现模型热插拔
多租户支持显式传递tenant_id通过canvas.get_tenant_id()隐式获取
结果排序基于分数的手动排序+元数据增强支持重排模型(Rerank Model)自动优化
外部集成仅支持内置数据集集成Tavily API等第三方服务
典型场景对比

场景1:高精度文档检索

# dify实现
results = dataset_retrieval.single_retrieve(planning_strategy=PlanningStrategy.ROUTER,model_config=...  # 精确控制LLM参数
)# ragflow实现
settings.retrievaler.retrieval(rerank_mdl=LLMBundle(...),  # 使用重排模型rank_feature=label_question(...)  # 特征工程
)

对比结论

  • dify更适合需要精细控制大模型行为的场景
  • ragflow在自动化结果优化方面更胜一筹

场景2:多源数据融合

# dify处理外部文档
for item in external_documents:source = {"metadata": {"_source": "external", ...}}# ragflow混合检索
kbinfos["chunks"].extend(tav_res["chunks"])  # 整合网络结果

对比结论

  • dify采用硬编码处理逻辑,扩展性受限
  • ragflow通过参数驱动实现灵活的数据源组合

后记

对于结果的对比,我不做评判,因为个人都有自己的喜好和习惯。大家参考大模型的对比来即可。

相关资料

deepseek相关资料,更新了不少内容,目录如下

https://pan.quark.cn/s/faa9d30fc2bd

https://pan.baidu.com/s/10vnv9jJJCG-KKY8f_e-wLw?pwd=jxxv

系列文档:

DeepSeek本地部署相关

ollama+deepseek本地部署

局域网或断网环境下安装DeepSeek

vlllm部署deepseek基准测试

DeepSeek个人应用

不要浪费deepseek的算力了,DeepSeek提示词库指南

服务器繁忙,电脑配置太低,别急deepseek满血版来了

DeepSeek+本地知识库:真的太香了(修订版)

DeepSeek+本地知识库:真是太香了(企业方案)

deepseek一键生成小红书爆款内容,排版下载全自动!睡后收入不是梦

最轻量级的deepseek应用,支持联网和知识库

当我把公众号作为知识库塞进了智能体后

个人神级知识库DeepSeek+ima 个人学习神器

dify相关

DeepSeek+dify 本地知识库:真的太香了

Deepseek+Dify本地知识库相关问题汇总

dify的sandbox机制,安全隔离限制

DeepSeek+dify 本地知识库:高级应用Agent+工作流

DeepSeek+dify知识库,查询数据库的两种方式(api+直连)

DeepSeek+dify 工作流应用,自然语言查询数据库信息并展示

聊聊dify权限验证的三种方案及实现

dify1.0.0版本升级及新功能预览

ragflow_336">ragflow相关

DeepSeek+ragflow构建企业知识库:突然觉的dify不香了(1)

DeepSeek+ragflow构建企业知识库之工作流,突然觉的dify又香了

DeepSeek+ragflow构建企业知识库:高级应用篇,越折腾越觉得ragflow好玩

模型微调相关

模型微调之基础篇:模型微调概念以及微调框架

📢【三连好运 福利拉满】📢🌟 若本日推送有收获:
👍 点赞 → 小手一抖,bug没有
📌 在看 → 一点扩散,知识璀璨
📥 收藏 → 代码永驻,防止迷路
📤 分享 → 传递战友,功德+999
🔔 关注 → 关注5ycode,追更不迷路,干货永同步💬 若有槽点想输出:
👉 评论区已铺好红毯,等你来战!

http://www.ppmy.cn/ops/167380.html

相关文章

yt-dlp工具下载视频使用方法

使用 yt-dlp 下载有土播视频时&#xff0c;可以很容易地同时下载字幕文件。 下面是详细操作说明&#xff1a; 一、下载视频并同时下载字幕&#xff1a; 基础命令&#xff1a; yt-dlp --write-subs 视频链接示例&#xff1a; yt-dlp --write-subs https://www.youdubo.com/wa…

【Java】Mybatis学习笔记

目录 一.搭建Mybatis 二.Mybatis核心配置文件解析 1.environment标签 2.typeAliases 3.mappers 三.Mybatis获取参数值 四.Mybatis查询功能 五.特殊的SQL执行 1.模糊查询 2.批量删除 3.动态设置表名 4.添加功能获取自增的主键 六.自定义映射ResultMap 1.配置文件处…

自然语言处理|Top-K 采样如何解锁文本生成的多样性?

一、引言 在自然语言处理&#xff08;NLP&#xff09;的文本生成领域&#xff0c;如何从语言模型输出的概率分布中选择下一个词&#xff0c;是决定生成文本质量与多样性的核心问题。语言模型通常会为词汇表中的每个词分配一个概率值&#xff0c;而采样策略则决定了如何基于这些…

OSG简介

OSG OpenSceneGraph (简称 OSG) 是一个开源的高性能3D图形库。 作用 它为开发者提供了一个强大的API&#xff0c;处理和渲染复杂的3D图形。 特点 OSG基于OpenGL构建&#xff0c;提供了对现代图形技术的支持&#xff0c;如着色器、纹理映射、光照模型等高级特性。 跨平台支…

使用 Flask 进行简单服务器改造的详细步骤和代码

以下是一个使用 Flask 进行简单服务器改造的详细步骤和示例代码。Flask 是一个轻量级的 Python Web 框架&#xff0c;非常适合快速搭建 Web 服务器。 1. 安装 Flask 首先&#xff0c;确保你已经安装了 Python&#xff0c;然后使用 pip 来安装 Flask&#xff1a; pip install…

List、Set 和 Map 的区别及常见实现类、线程安全集合(总结图表)

List、Set 和 Map 的区别 特性ListSetMap元素顺序有序无序&#xff08;部分实现有序&#xff09;无序&#xff08;部分实现有序&#xff09;元素唯一性允许重复不允许重复键唯一&#xff0c;值可重复访问方式通过索引通过元素本身通过键常见实现ArrayList, LinkedListHashSet,…

matrix-breakout-2-morpheus 靶机----练习攻略 【仅获取shell】

【此练习仅做到反弹shell】 1.靶机下载地址 https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 2. 打开靶机&#xff0c;kali使用nmap扫描同C段的主机 找到靶机ip 确保靶机和kali网卡均为NAT模式 先查看kali的ip nmap 192.168.182.1/24 …

每日OJ_牛客_DP44兑换零钱_C++_Java

目录 牛客_DP44兑换零钱 题目解析 C代码 Java代码 牛客_DP44兑换零钱 兑换零钱_牛客题霸_牛客网 描述&#xff1a; 给定数组arr&#xff0c;arr中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个a…