源码运行RagFlow并实现AI搜索(文搜文档、文搜图、视频理解)与自定义智能体(一)

源码运行RagFlow并实现AI搜索(文搜文档、文搜图、视频理解)与自定义智能体(一)

0. RagFlow简介

众所周不知,RagFlow是由国内一家公司开源的一款软件,在AI知识库构建、智能体编排等场景中深受全球开发者的喜爱。

ragflow


快速体验地址为:https://ragflow.io/

RagFlow的版本有开源版商业版,我们在github上看到的RAGFlow就是开源版,如需在本地快速体验RAGFlow的功能,可根据官方提供的docker compose脚本快速启动它。

而如果要在它的基础上进行二次开发,使用RAGFlow的源码启动,则是我们这些开发人员所必须要掌握的。

在本文中,跟着笔者的步骤,我们可以快速了解如何使用源码方式运行RAGFlow,并通过几个示例快速领略一下RAGFlow的功能。

1.RagFlow源码启动(pycharm)

RagFlow的运行需要Linux系统,考虑到许多开发者使用的是Windows系统,这时我们就可以在Windows系统中通过安装wsl的方式来运行它。

1.1 wsl安装

wsl安装详细步骤如下:

重启,再打开powershell,在wsl中安装ubuntu,运行:wsl.exe --install ubuntu

install-wsl


之后,在电脑中就会有一个Linux的图标,通过它就可以直接访问wsl的ubuntu系统目录

windows-show-wsl


至此,wsl就已成功安装ubuntu系统成功了,需要注意的是它会默认安装到C盘。

安装wsl。打开powershell,运行:wsl --install

wsl

1.2 RagFlow源码与依赖安装

在wsl中切换到用户目录,克隆代码。在wsl中输入以下命令:
注:为了避免后续不必要的麻烦,推荐在wsl系统中克隆代码

cd ~
git clone https://github.com/infiniflow/ragflow.git

目前的RagFlow提交非常活跃,为了稳定性,这里使用目前最新的v0.22.1版本

git checkout v0.22.1

如果由于网络克隆不了github的代码,可以尝试给系统配上网络代理。如:

export https_proxy=http://192.168.1.66:7078; export http_proxy=http://192.168.1.66:7078; export all_proxy=socks5://192.168.1.66:7078 

笔者这里使用的IDE为PyCharm 2025.3.1

点击 [文件] 中的 [远程开发],选择WSL实例中的Ubuntu,并指定刚刚clone的项目路径

pycharm-wsl

点击打开

pycharm-show-ragflow

再输入以下命令安装pipx

sudo apt update sudo apt install -y pipx pipx ensurepath source ~/.bashrc pipx --version 
pipx

再安装ux和pre-commit:

pipx install uv pre-commit

再安装编译所需要的依赖库:

sudo apt install -y libicu-dev pkg-config build-essential python3.12-dev

uv安装好了后,再使用uv命令安装项目所需要的依赖:uv sync --python 3.12

uv-sync

等uv的依赖安装完之后,在PyCharm里就会自动对依赖创建源码索引,这个过程根据电脑配置不同可能会花个几分钟。

1.3 RagFlow依赖组件启动

我们知道RagFlow不生产模型,它只是模型的搬运工,且RagFlow的运行还需要一些外部数据库和中间件:mysql、es、redis、MinIO。

上面几个中间件可以提前准备好,或直接使用RagFlow提供的docker compose脚本一键启动:

docker compose -f docker/docker-compose-base.yml up -d

为了不和RagFlow在同一台机器上,这里笔者在其他机器启动上面几个组件。

docker-compose


会占用的端口(tcp)及描述如下:

  • 1200(映射的9200)。ElasticSearch,数据检索、向量存储
  • 9000,9001。 MinIO,文件存储
  • 5455(映射的3306)。Mysql,关系型数据库
  • 6379。valkey(redis),内存KV数据库

我上面部署的节点ip都为192.168.140.110,所在还需要在wsl系统中将对应服务的域名映射都修改为192.168.140.110。(在RagFlow的docker/.env文件中均有体现)

sudo vi /etc/hosts
192.168.140.110 es01 mysql minio redis

1.4 RagFlow源码运行(后端)

通过前面的步骤,我们已经完成了RagFlow的依赖安装,之后就可以运行RagFlow了。
RagFlow需要运行的程序有以下3个:

  1. ragflow/api/ragflow_server.py,后端api接口,python运行
  2. ragflow/rag/svr/task_executor.py,后端task任务消费者,python运行
  3. ragflow/web,前端web界面,使用npm运行

后端程序可以参考docker/launch_backend_service.sh脚本启动。

为了后期开发过程中更方便的调试运行RagFlow,建议单独运行每个后端程序。

在PyCharm中运行python项目需要有一个python解释器,这里我们选择ragflow/.venv下的python程序:

python-setting


再打开python程序的运行配置框,在里面手动填入所需要的环境变量信息(ragflow/docker/.env)。

需要注意的是,PyCharm无法直接读取ragflow/docker/.env中的内容,为此我们可以单独写一个文件代替下,如写一个 .env_pycharm文件,内容为:

DOC_ENGINE=elasticsearch NLTK_DATA="./nltk_data" 
run-settings

最后,再确保Working directory为代码根目录,.env文件为我们新创建的 .env_pycharm文件,之后点击运行

ragflow-run


提示9380端口监听成功,就代表ragflow_server.py程序启动成功了。

curl试一下:

curl http://127.0.0.1:9380/

有json信息返回了,就代表测试成功了。

ragflow_server.py在任务提交时,会将所需要执行的任务写入到redis中,之后再由task_executor.py异步拉取待处理的任务并执行。

task_executor.py的启动方式与ragflow_server.py一样,这里不再复述。运行成功时,截图大致长这样:

ragflow_task_executor

另:RagFlow的ragflow_server.pytask_executor.py这两个启动程序均会读取此配置文件ragflow/conf/service_conf.yaml,这里面会配置RagFlow所需要连接的中间件,我这里的配置内容如下:

ragflow: host: 0.0.0.0 http_port: 9380 admin: host: 0.0.0.0 http_port: 9381 mysql: name: 'rag_flow' user: 'root' password: 'infini_rag_flow' host: 'mysql' port: 5455 max_connections: 900 stale_timeout: 300 max_allowed_packet: 1073741824 minio: user: 'rag_flow' password: 'infini_rag_flow' host: 'minio:9000' es: hosts: 'http://es01:1200' username: 'elastic' password: 'infini_rag_flow' redis: db: 1 password: 'infini_rag_flow' host: 'redis:6379' task_executor: message_queue_type: 'redis' user_default_llm: default_models: embedding_model: api_key: 'xxx' base_url: 'http://localhost:6380' 

1.5 RagFlow源码运行(前端)

上面我们运行了RagFlow的后端程序,并成功监听了9380端口,只有http接口没有web界面,接下来我们将web界面也运行起来。

切换到ragflow源码的web目录,依次运行以下命令安装前端项目所需要的依赖:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 20 nvm use 20 node -v npm install 

执行npm run dev启动web项目:

export NODE_OPTIONS=“–max-old-space-size=4096”
npm run dev

执行完后,会有以下输出:

web-run

到这里,我们就可以在浏览器中访问RAGFlow了:http://localhost:9222

ragflow-index

2. RAGFlow示例-文搜文档

如果仅想在本地运行RAGFlow,只需要切换到RAGFlow的docker目录,使用docker compose启动整个服务就可以了。命令为:

cd docker
docker compose -f docker-compose.yml up -d

之后输入对应的ip访问。比如我这里的:http://192.168.140.110/

ragflow-models


注册登录一个账号后,配置好默认的基础模型,我这里使用的是硅基流动平台提供的模型。

有了大模型的配置后,我们就可以体验RagFlow中的常用功能了。这里以先以RAG场景中常见的文档搜索为例,和大家一起体验下。

2.1 DeepDoc解析

deepdoc


在RAGFlow中默认的文档解析器为DeepDoc,是RAGFlow自研的解析器。同时,RAGFlow在启动时,也会自动加载DeepDoc相关的模型到系统中,可以在download_deps.py中看到这样的代码片段:

repos = [ "InfiniFlow/text_concat_xgb_v1.0", # 文本分块拼接决策模型(Chunk 合并/切分优化) "InfiniFlow/deepdoc", # 复杂文档结构理解(Layout-aware 文档解析) "InfiniFlow/huqie", # 胡切,中文文本智能切分(语义级切块) ] 

本文中不对DeepDoc的实现细节详细展开,仅如何快速使用进行了解。

此处以大名鼎鼎的Transformer架构论文《Attention Is All You Need》为例,试一下我们用RAGFlow可以如何检索这篇PDF文档。

首先,我们创建一个Dataset,并在其中上传《Attention Is All You Need》的PDF论文到其中,并点击解析按钮进行解析。

待解析完成后,再次点击文件,会弹出解析后的切片结果,截图如下:

pdf-parser

点击某一个切片(Chunk),RagFlow也允许我们对它进行内容的二次编辑,左边的原文黄色高亮部分也会体现出所对应的解析原文,这种UI界面的操作也正是RAGFlow的强大之处。来个截图:

edit-chunk

当RagFlow完成文档的解析切片后,我们便可以对它进行检索了。RagFlow中提供了多种方式可以让我们对文档搜索,可以直接用的有以下两种方式:

  • Chat(LLM对话方式)
  • Search(AI检索)

我们分别发起一个问题:什么是Transformer?

chat-demo

RagFlow的chat则会根据Transformer的文档切片内容进行LLM汇总概括。点击每一个 【小感叹号】 也会弹出对应的文档片段引用。

再试下将同样的问题发给RagFlow中的Search看一下效果:

search


这部分则更像是文档搜索,它会列出对应的文档,以及搜索出来的top文档片段。

2.2 MinerU解析(api方式接口)

上面使用DeepDoc对文档处理时,对于某些公式提取的还不够完美,比如对于Attention(Q、K、V)的计算公式解析的还不够完善。DeepDoc解析结果截图如下:

attention

这时,我们就可以将RagFlow自带DeepDoc替换为MinerU,在RagFlow的官方文档中也提供了使用http接口的方式调用MinerU解析pdf文档的步骤,这里实践一下:

编译MinerU镜像。笔者这里以docker方式部署它,有gpu更佳(笔者这里没有用gpu仅有cpu,也能跑只是点有慢)

wget https://gcore.jsdelivr.net/gh/opendatalab/[email protected]/docker/china/Dockerfile
#CPU运行,使用FROM docker.m.daocloud.io/vllm/vllm-openai:v0.10.2,不使用v0.10.1.1
docker build -t mineru:latest -f Dockerfile .

上面我所使用的MinerU版本为当前的最新版2.6.8

2.启动MinerU。待上面的docker镜像打包完成,再输入以下命令启动MinerU:

docker run -d --name mineru \ --shm-size 32g \ -p 8000:8000 \ mineru:latest \ mineru-api --host 0.0.0.0 --port 8000 

之后访问映射出来的地址,上面暴露的mineru的api端口是8000端口,我这里就访问对应的IP+Port:http://192.168.31.174:8000/docs

miner-api-swagger

打开它,我们会发现,它其实是一个swagger的接口页面,我们也可以直接在此页面中进行接口验证对pdf文件进行解析。

  1. 集成到MinerU中。确保MinerU的http接口没问题后,接入RagFlow也很简单,仅需在ragflow/docker.evn 环境变量中加入一行配置:
MINERU_APISERVER=http://192.168.31.174:8000

也就是将上面部署的MinerU的api地址,再重启ragflow的docker compose,使其容器内的环境变量生效果,我们就可以使用MinerU来解析文档了。
再来RagFlow使用MinerU解析文档效果图:

latex-result


右边的解析公式结果为LaTeX格式,我们可以找一个在线LaTeX编辑器看效果。

在RagFlow调用MinerU的接口解析文档的时候,在MinerU的docker容器中也会有对应的日志输出。

ragflow-console-log

为了对比MinerUDeepDoc在公式解析的差异,我们也可以访问MinerU官网上传对比一下。以下是我上传同一个PDF对公式解析的结果:

mineru-test

从公式解析的结果来看,MinerU的解析效果与原文相比不能说非常相似,只能说一模一样。

没有对比就没有伤害,强的可怕~。

更多关于MinerU接入RagFlow的详细配置,可参考:how-to-use-mineru-to-parse-pdf-documents

3. RagFlow文搜图/视频/自定义智能体

一不小心,这篇文章就超篇幅了。后续关于文搜图/视频/自定义智能体这部分见我的另一篇文章。

Read more

旧安卓手机别扔!用KSWEB搭个人博客,搭配外网访问超香

旧安卓手机别扔!用KSWEB搭个人博客,搭配外网访问超香

KSWEB 作为安卓端轻量级 Web 服务器,核心功能是提供 PHP、MySQL 运行环境,能轻松部署 Typecho、WordPress 等博客系统,Termux 则可辅助管理内网穿透服务;这类工具特别适合预算有限的学生、个人博主,或是想折腾闲置设备的数码爱好者,优点也很突出 —— 对硬件要求极低,1GB 内存就能运行,旧款红米、华为畅享等机型都能适配,而且内置的运行环境无需手动配置,新手也能快速上手。 使用这套工具时也有不少需要注意的地方,比如手机要长期插电并连接稳定 Wi-Fi,否则服务容易中断;还要给 KSWEB 和 Termux 关闭电池优化、放开存储权限,我用小米手机测试时就因为没关后台限制,导致 Apache 服务频繁被系统杀掉,折腾了好一会儿才排查出问题;另外非 Root 机型也能使用,但部分文件权限操作会稍显繁琐。 不过仅靠 KSWEB 部署完博客后,只能在局域网内访问,这会带来很多不便:比如在家用电脑能连手机看博客,

Clawdbot整合Qwen3-32B保姆级教程:Web网关18789端口调试全记录

Clawdbot整合Qwen3-32B保姆级教程:Web网关18789端口调试全记录 1. 为什么需要这个整合方案 你是不是也遇到过这样的问题:想用本地部署的大模型做聊天机器人,但发现直接调用Ollama的API在Web前端里跨域报错?或者Clawdbot配置完后一直连不上模型,控制台疯狂刷404?又或者好不容易跑起来了,发个消息却卡在“正在思考”半天没反应? 这正是我们搭建这套环境时踩过的坑。Clawdbot本身不直接对接Ollama,它需要一个中间层来处理协议转换、请求转发和端口映射。而18789这个端口,就是整个链路里最关键的“通关密码”——它不是随便选的,而是Clawdbot默认监听的Web网关入口。 整套方案的核心逻辑其实很朴素: * 你在浏览器里访问 http://localhost:18789,看到的是Clawdbot的聊天界面 * Clawdbot收到你的消息后,不自己去算答案,而是把请求转给内部代理 * 代理再把请求发到 http://localhost:8080(Ollama API地址) * Ollama调用本地的Qwen3-32B模型生成回复

前端攻击手段有哪些,该如何预防

前端攻击手段有哪些,该如何预防

* 前端攻击手段有哪些,该如何预防 * 一,xss * Cross Site Script 跨站脚本攻击 * 手段:黑客将JS代码插入到网页内容中,渲染时执行JS代码 * 预防:特殊字符替换(前端或者后端) 这种img的写法可以规避跨域,img图片的加载可以规避跨域 vue和react可以默认屏蔽xss攻击 除了这两种情况 vue v-html的写法 react dangerouslySetInnerHTML (二)CSRF 这也是一个常见的攻击手段 Cross Site Request Forgery跨站请求伪造 手段:黑客诱导用户去访问另一个网站的接口,伪造请求 预防:严格的跨域限制+验证码机制 CSRF详细过程 1,用户登录了A网站,有了cookie 2,黑客诱导用户到B网站,并发起A网站的请求 3,A网站的API发现有了cookie,认为是用户自己操作的 CSRF预防手段 1,严格的跨域请求限制,如判断referrer(请求来源)

什么是移动端 H5 开发?它和 PC 端 Web 开发有什么区别?

移动端 H5 开发与 PC 端 Web 开发的区别 什么是移动端 H5 开发 移动端 H5 开发是指使用 HTML5、CSS3 和 JavaScript 技术栈,专门为移动设备(智能手机、平板电脑)开发网页应用的过程。H5 是 HTML5 的简称,是构建移动端网页的核心技术标准。 H5 开发的特点 ┌─────────────────────────────────────────────────────────┐ │ 移动端 H5 开发 │ ├─────────────────────────────────────────────────────────┤ │ 技术栈: HTML5 + CSS3 + JavaScript │ │ 运行环境: 移动浏览器 (Safari, Chrome, 微信内置浏览器等) │ │ 交互方式: 触摸、手势、传感器 │ │ 屏幕尺寸: 小屏幕、多分辨率 │ │ 网络环境: 移动网络