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

Ragflow技术栈分析及二次开发指南

Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。

1. Ragflow 存在问题

Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow
Ragflow 当前版本: v0.17.0

Ragflow 目前主要存在以下问题:

  1. 登录页开放注册
    当前版本,在login页面,用户可直接进行注册,在小规模私有化部署中,开放注册接口,易对用户产生困扰,甚至存在被频繁调用攻击的风险。

  2. 知识库共享问题
    当前版本,团队成员进行知识库共享需要知识库的创建者邀请其它成员进团队,发出邀请时,需要其它成员点击接受才行,较为繁琐。

  3. 模型设置问题
    当前版本,所有团队成员的模型设置是独立的,如需共用同一套模型配置,需要每个用户单独进行设置,不利于团队化协作。

  4. 可视化管理
    当前版本,未存在超级管理员的后台界面,无法直观的对用户账户进行可视化管理。

本文将围绕以上四点问题,对Ragflow进行二次开发解决。

2. 开源协议

Ragflow采用的是较为宽松的Apache License 2.0 ,这意味着其允许进行二次开发和商用,且修改后可无需开源。

3. 技术栈分析

3.1 容器组件分析

通过docker启动该服务时,docker-compose-base.yml包含了部分基础配置参数,可以看到整个服务共包含5个容器组件:

services:es01:container_name: ragflow-es-01infinity:container_name: ragflow-infinitymysql:container_name: ragflow-mysqlminio:container_name: ragflow-minioredis:container_name: ragflow-redis

各组件功能如下:

  1. Elasticsearch
    主要用作文档引擎,负责存储和检索文本及向量数据,作为系统的知识库存储后端,用以支持向量存储和相似度搜索

  2. ragflow-infinity
    前端系统,包含基本的界面显示、数据交互、路由跳转等功能

  3. MySQL
    关系型数据库,存储系统的结构化数据,包括管理用户账户、权限等基础信息、
    存储知识库的元数据信息等

  4. MinIO
    对象存储服务,用于存储原始文档及文档切片图像信息

  5. Redis
    内存数据库, 采用Valkey版本,缓存大模型的响应结果,处理异步任务,临时保存对话上下文

3.2 前后端框架分析

该系统前端框架使用React+Typescript,代码统一在web文件夹。
后端框架使用Flask+Python,代码分好几部分,具体内容如下:

  • agent:对应前端agent相关模块功能
  • agentic_reasoning:对应前端搜索相关模块功能
  • api:核心后端程序,用来与前端进行数据对接,并提供后端服务和其它各组件连接及数据交互功能
  • deepdoc:提供文件ocr等解析相关功能
  • graphrag:知识图谱相关功能
  • rag:主要用以和大模型相关接口进行交互
  • sdk:拓展型功能,用来提供系统的外部调用,目前不太完善,可忽略。

3.3 前后端可视化分析

3.3.1 前端可视化分析

前端代码全部集成在web文件夹下,因此可直接在web路径下直接启动查看。

先安装依赖:

yarn instsall 

依赖安装完成,生成node_modules
再启动:

yarn start

访问http://localhost:9222 即可进入登录界面。

考虑到登录需要和后端交互,密码验证通过后,才能进入主界面。如需直接进入主界面预览,可修改web/src/utils/request.ts
这里的逻辑是:本来响应结果为504,弹出error,这里直接改成成功响应。

request.interceptors.response.use(async (response: Response, options) => {if (response?.status === 413 || response?.status === 504) {// 原代码// message.error(RetcodeMessage[response?.status as ResultCode]);// 修改return new Response(JSON.stringify({code: 0,message: 'Success',data: {}}));}

3.3.2 mysql可视化分析

下面再可视化查看其它组件信息,在docker/.env文件中,包含了各组件的密码。

启动docker服务,首先查看mysql数据库信息。

使用DBeaver进行连接,连接参数如下,默认用户名为root,密码为infini_rag_flow

在这里插入图片描述

可以看到,该数据库中包含多张数据表,后续在解决实际问题时,会进一步分析。

在这里插入图片描述

3.3.3 Elasticsearch可视化分析

Elasticsearch需要通过Kibana进行可视化分析。虽然.env文件中写了Kibana的初始用户名和密码,但实际服务中,并未启用Kibana。看到仓库中有人提出过该问题,具体可参考该pr:https://github.com/infiniflow/ragflow/pull/548/files

3.3.4 MinIO可视化分析

MinIO自带了可视化管理的控制台,访问http://localhost:9001/即可进入,默认用户名为rag_flow,默认密码为infini_rag_flow

进入可看见,里面的容器包含了原始上传的pdf文件和切块分页的图像数据。

在这里插入图片描述

3.3.5 Redis可视化分析

使用Rdis insight连接Redis数据库,默认地址为127.0.0.1:6379,默认用户名为default,默认密码为infini_rag_flow

在这里插入图片描述
进入可看见,里面存储了一些缓存数据。

在这里插入图片描述

4. 问题解决方法

分析完了,开始解决开头提到的一些具体问题。

4.1 关闭注册通道

关闭注册通道,可直接将前端界面上的注册元素注释掉。

在这里插入图片描述

具体方法是修改src\pages\login\index.tsx文件,注释掉以下内容:

{ <div>{title === 'login' && (<div>{t('signInTip')}<Button type="link" onClick={changeTitle}>{t('signUp')}</Button></div>)}{title === 'register' && (<div>{t('signUpTip')}<Button type="link" onClick={changeTitle}>{t('login')}</Button></div>)}
</div>}

这样修改,用户直接通过浏览器访问/register也是无法注册的,因为注册功能并不是一个单独界面,而是在login中,post到后端进行处理。

4.2 后台添加用户

阻止用户自己注册之后,管理员还需要为用户进行注册。可直接采用修改数据库内容的方式进行实现。

连接mysql数据库,用户信息存储在user表中。该表包含以下字段,核心字段是emailpassword

在这里插入图片描述

email比较容易理解,存储的就是登陆明文邮箱,但密码是哈希字符串,为了防止被人攻击泄露,不能存储明文密码,因此,要解决注册问题,首先需要理清楚密码的加密逻辑。

通过仔细阅读源代码,我理清楚了注册阶段,密码的加密存储过程:
首先,前端获取到用户原始输入密码后,先进行Base64编码,防止特殊字符造成解析失败,编码后利用公钥进行RSA加密;
后端接收到加密密码后,利用私钥进行RSA解密,最后通过Hash处理,存储到数据库。

A[原始密码] --> B[前端Base64编码] --> C[RSA加密] --> D[后端RSA解密] --> E[hash存储]

为了让这个过程更容易理解,我写了个python代码,模拟了该过程,其中,私钥数据可以在文件中找到,路径为 conf/private.pem

import base64
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5
from werkzeug.security import generate_password_hash, check_password_hashdef rsa_decrypt(encrypted_password: str, private_key_path: str, passphrase: str) -> str:# 从文件中读取私钥with open(private_key_path, "r") as key_file:private_key = key_file.read()# 导入私钥rsa_key = RSA

相关文章:

Ragflow技术栈分析及二次开发指南

Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …...

vue上传文件的请求头携带token校验、和携带另外的参数请求

拿element plus UI库举例&#xff0c;&#xff08;不使用element plus的话js方法通用&#xff09;&#xff1a; <template><el-upload class"upload-demo":http-request"myUploadHttp" action"https://run.mocky.io/v3/9d059bf9-4660-45f2-…...

MySQL的 where 1=1会不会影响性能?

在MySQL中&#xff0c;WHERE 11 是一种常见的SQL编写技巧&#xff0c;通常用于动态生成SQL语句时简化条件拼接。虽然它看起来多余&#xff0c;但在实际使用中&#xff0c;WHERE 11 对性能的影响可以忽略不计。以下是详细分析&#xff1a; 1. WHERE 11 的作用 WHERE 11 是一个恒…...

MyBatis 中SQL 映射文件是如何与 Mapper 接口关联起来的? MyBatis 如何知道应该调用哪个 SQL 语句?

1. 命名空间 (Namespace): SQL 映射文件 (XML): 在 SQL 映射文件的 <mapper> 根元素中&#xff0c;有一个 namespace 属性。这个 namespace 属性的值必须是 Mapper 接口的全限定名&#xff08;包名 接口名&#xff09;。 <mapper namespace"com.example.mapper.…...

SICK Ranger3源码分析——断线重连

前言 本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读&#xff0c;体验更佳 简单分析一下SICK Ranger3源码中断线重连的实现&#xff0c;这一块算是比较容易的&#xff0c;先择出来分析一下。 代码示例仅贴出关键部分以便分析 使用SDK版本为…...

1.7 双指针专题:三数之和(medium)

1.题目链接 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/3sum/submissions/609626561/ 2.题目描述 给你⼀个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满⾜ i ! j、i ! k 且 j ! k &#xff0c;同时…...

【JavaEE】Spring Boot配置文件

目录 一、Spring Boot配置文件简介二、properties 配置⽂件说明2.1 properties 基本语法2.2 value("${}")读取配置⽂件 三、yml 配置文件说明3.1 yml 基本格式3.2 yml 配置数据类型 及 读取3.3 yml配置对象及读取ConfigurationProperties(prefix "")3.4 配…...

行为模式---策略模式

概念 策略模式是一种行为设计摸是&#xff0c;它的核心思想是将一些列的算法封装成独立的对象&#xff0c;并使它们可以相互替换&#xff0c;通过上下文进行调用。 策略模式通过算法抽象为独立的策略类&#xff0c;客户端可以根据自身需求选择不同的策略类来完成任务、这种方…...

Word 小黑第15套

对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 &#xff08;脚注默认位于底部 &#xff09;在脚注插入文档属性&#xff1a; -插入 -文档部件 -域 类别选择文档信息&#xff0c;域…...

OSPF:虚链路

一、虚链路概念 在OSPF中&#xff0c;虚链路&#xff08;Virtual Link&#xff09; 是一种逻辑连接&#xff0c;用于解决因网络设计或扩展导致的区域无法直接连接到骨干区域&#xff08;Area 0&#xff09;的问题。它是通过中间区域&#xff08;Transit Area&#xff09;在两个…...

Ubuntu 22.04 安装配置 FTP服务器 教程

今天搞定在 Ubuntu 22.04 系统上安装和配置 VSFTPD &#xff0c;还会涉及防火墙设置、SSL/TLS 设置&#xff0c;以及创建专门登录 FTP 服务器的账户。开始&#xff01; 一、安装 VSFTPD 首先&#xff0c;咱得让系统知道有啥新软件包可以安装。打开终端&#xff0c;输入下面这…...

基于 Selenium 的软件测试方法研究

一、引言 在软件开发的漫长征程中&#xff0c;软件测试宛如一座坚实的堡垒&#xff0c;守护着软件质量的大门。随着互联网技术的飞速发展&#xff0c;Web 应用程序如雨后春笋般涌现&#xff0c;其功能的复杂性和用户交互的多样性不断增加。在这样的背景下&#xff0c;传统的手动…...

网络安全事件响应--应急响应(windows)

应用系统日志 Windows主要有以下三类日志记录系统事件&#xff1a;应用程序日志、系统日志和安全日志。 系统和应用程序日志存储着故障排除信息&#xff0c;对于系统管理员更为有用。安全日志记录着事件审计信息&#xff0c;包括用户验证&#xff08;登录、远程访问等&#x…...

DataEase:一款国产开源数据可视化分析工具

DataEase 是由飞致云开发的一款基于 Web 的数据可视化 BI 工具&#xff0c;支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表&#xff0c;帮助用户快速分析业务数据并洞察其趋势&#xff0c;为企业的业务改进与优化提供支持。 DataEase 的优势在于&#xff1a;…...

RTK与RTD基础原理

(文中的部分图片是摘自其他博主的文章&#xff0c;由于比较久&#xff0c;忘记原本链接了&#xff0c;侵删) GPS定位原理 卫星自身有自己的星历与原子钟&#xff0c;因此卫星知道自身准确的空间坐标与时间。因为每个卫星都有原子钟&#xff0c;因此每颗卫星的时间基本上都是相…...

关于MCP SSE 服务器的工作原理

模型上下文协议&#xff08;Model Context Protocol&#xff0c;简称MCP&#xff09; 是一种全新的开放协议&#xff0c;专门用于标准化地为大语言模型&#xff08;LLMs&#xff09;提供应用场景和数据背景。 你可以把MCP想象成AI领域的“USB-C接口”&#xff0c;它能让不同的A…...

碳中和小程序:助力用户记录低碳行为,推动环保生活

碳中和小程序:助力用户记录低碳行为,推动环保生活 一、碳中和的全民化挑战与数字化机遇 中国承诺2030年前实现碳达峰,2060年前达成碳中和目标。在这一国家战略下,个人碳减排贡献率需从当前不足5%提升至25%。小程序开发技术正成为破解"公众参与度低"“行为量化难…...

Python读取显示Latex的公式文档,Python加载显示markdown文件。

平时用LLM大语言模型去解释文献里面的公式含义直接复制的格式word看不懂&#xff0c;基于这个web可以正常加载显示。 下面是读取的效果展示&#xff1a;下面程序保存为stl_read.py然后运行下面指令。 streamlit run stl_read.pyimport streamlit as st import base64 import …...

mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体,并添加侧面窗户贴图和楼顶贴图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox extrusion挤出几何体二、🍀…...

mock的定义和使用场景

Python自动化中使用mock的示例 在Python自动化测试中&#xff0c;mock 用于模拟对象、函数或方法的行为&#xff0c;以便在隔离的环境中测试代码。以下是一个简单的示例&#xff1a; 假设你有一个 user.py 模块&#xff0c;其中包含一个 get_user_info 函数&#xff0c;用于从…...

Android Retrofit 请求执行模块执行原理深入源码分析(三)

一、引言 Retrofit 是 Square 公司开发的一款优秀的类型安全的 HTTP 客户端&#xff0c;在 Android 和 Java 开发中被广泛使用。它通过简洁的接口定义和强大的注解功能&#xff0c;使得开发者能够轻松地进行网络请求。请求执行模块是 Retrofit 的核心部分之一&#xff0c;负责…...

封装Axios拦截器实现用户无感刷新AccessToken实践指南

一、背景与需求场景 1.1 单点登录体系中的Token管理 在单点登录&#xff08;SSO&#xff09;体系下&#xff0c;用户登录后系统会颁发两种令牌&#xff1a; AccessToken&#xff1a;短期有效&#xff08;2小时&#xff09;&#xff0c;用于接口鉴权 RefreshToken&#xff1a…...

CSDN博客:Markdown编辑语法教程总结教程(下)

❤个人主页&#xff1a;折枝寄北的博客 Markdown编辑语法教程总结 前言1. LaTex数学公式2. 插入不同类别的图2.1 插入甘特图2.2 插入UML图2.3 插入Mermaid流程图2.4 插入Flowchart流程图2.5 插入classDiagram类图 3. CSDN快捷键4. 字体相关设置4.1 字体样式改变4.2 字体大小改变…...

【Python】06、流程控制语句

文章目录 1.条件判断语句1.1 if 语句2. input 函数3.if-else 语句4.if-elif-else 语句 2.循环语句2.1 while语句2.2 while语句练习&#xff1a;2.3 循环嵌套2.4 break和continue 通过流程控制语句&#xff0c;可以改变程序的执行顺序&#xff0c;也可以让指定程序反复执行多次。…...

《python》—— threading库(线程和多线程)

文章目录 threading简介threading基本概念常用类和方法线程同步线程池实例 threading简介 threading 是 Python 标准库中用于实现多线程编程的模块。多线程编程允许程序同时执行多个任务&#xff0c;提高程序的并发性能&#xff0c;尤其适用于 I/O 密集型任务&#xff0c;例如…...

【数据分享】2000-2024年全国逐年归一化植被指数(NDVI)栅格数据(年最大值)

NDVI&#xff0c;全名为Normalized Difference Vegetation Index&#xff0c;中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力&#xff0c;我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享了来源于MOD13A3数…...

【项目】负载均衡式在线OJ

负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍&#xff1a; 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...

前端发布缓存导致白屏解决方案

解决发布H5后因为本地缓存白屏方案 一、 核心配置优化&#xff08;前提是访问网站的请求能抵达服务器&#xff09; 方案一&#xff1a;前端项目设置全局不缓存方案 运行逻辑&#xff1a;在H5服务器配置中增加Cache-Control: no-cache或max-age0响应头&#xff0c;禁用静态资…...

大模型开源的工具包有哪些特殊符号可以使用;SEP 是什么

大模型开源的工具包有哪些特殊符号可以使用 目录 大模型开源的工具包有哪些特殊符号可以使用自定义特殊token:special_tokens=True一、**对话轮次分隔符(必选)**二、**系统提示标记(提升指令理解)**三、**中文特色分隔符(贴合书写习惯)**四、**开源模型专属符号(按文档…...

混沌理论与混沌映射——算法改进初始化创新点之一

混沌理论与混沌映射 混沌理论研究混沌系统的动力学&#xff0c;其特征是非线性和对初始条件的极端敏感性。即使在这些条件下的微小变化也可能导致系统结果的显著变化。尽管看起来是随机的&#xff0c;混沌系统可以在不依赖随机性的情况下表现出不规则的行为&#xff0c;因为确…...