【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级

news2025/6/10 4:39:57

概述

在历经半个月的间歇性开发后,RagflowPlus再次迎来一轮升级,正式发布v0.4.0

开源地址:https://github.com/zstar1003/ragflow-plus

更新方法

下载仓库最新代码:

git clone https://github.com/zstar1003/ragflow-plus.git

使用docker启动:

# cpu模式
docker compose -f docker/docker-compose.yml up -d
# gpu模式
docker compose -f docker/docker-compose_gpu.yml up -d

首次启动会自动拉取最新版本镜像。

新功能

1. 上传文件支持文件夹

在此版本中,优化了上传文件,目前支持选择文件夹进行上传。

系统会自动识别,将该文件夹及其子文件夹中所有文件提取上传。

新增的选择文件夹按钮

同时,该版本重新调整了文件上传的请求通道,减少上传超时的可能性。

2. 文档撰写模式全新升级

此版本重点重构了文档撰写模块,目前在此版本中,支持自定义模板,可将当前文档内容保存为自定义名称的模板,并可对现有模板进行调整删除。

同时,文档撰写后端采用了独立的响应通道,不再需要依赖助理设置进行输出,响应速度大幅提升。

左下角增加配置选项,可以自由选择一个或多个知识库信息,同时可调节较为常用的三个搜索及模型参数。

考虑到过多的文档内容输入,有超过模型输入上限的风险。本版本对输入模型的文本范围进行重新优化,会自动选取光标位置上下文最多共4000个字符输入到问答模型中。

功能优化

1. 解析逻辑调整

本版本重新调整了解析逻辑,在解析时增加了和搜索一致的分词器,解决了上一版本中,做知识库检索时,关键词相似度为0的情况。

具体细节可参考本系列第24篇文章:【Ragflow】24.Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题

2. 知识库创建人权限问题

在上一版本中,知识库创建时,创建人选择非初始用户,问答时会出现报错。
本版本修复了这一问题。

3. excel解析优化

本版本对excel类型的文件采用了单独的解析管线,速度更快,效果更好。

具体细节可参考本系列第25篇文章:【Ragflow】25.Ragflow-plus开发日志:excel文件解析新思路/公式解析适配

4. Ollama解析接口调整

有群友提到(issue#65),使用ollama构建嵌入模型时,前台接口采用的是api/embeddings,而上版本后端接口采用的是v1/embeddings,不同的接口返回值不一致,会造成向量相似度计算偏差较大。

下面写了一个测试脚本,具体测试了一下这两种接口的具体调用结果:

import requests
import time

# Ollama配置
OLLAMA_HOST = "http://localhost:11434"  # 默认Ollama地址
MODEL_NAME = "bge-m3"  # 使用的embedding模型
TEXT_TO_EMBED = "测试文本"

# 定义接口URL和对应的请求体结构
ENDPOINTS = {
    "api/embeddings": {
        "url": f"{OLLAMA_HOST}/api/embeddings",  # 原生API路径
        "payload": {"model": MODEL_NAME, "prompt": TEXT_TO_EMBED},  # 原生API用prompt字段
    },
    "v1/embeddings": {
        "url": f"{OLLAMA_HOST}/v1/embeddings",  # OpenAI兼容API路径
        "payload": {"model": MODEL_NAME, "input": TEXT_TO_EMBED},  # OpenAI兼容API用input字段
    },
}

headers = {"Content-Type": "application/json"}


def test_endpoint(endpoint_name, endpoint_info):
    """测试单个端点并返回结果"""
    print(f"\n测试接口: {endpoint_name}")
    url = endpoint_info["url"]
    payload = endpoint_info["payload"]

    try:
        start_time = time.time()
        response = requests.post(url, headers=headers, json=payload)
        response_time = time.time() - start_time

        print(f"状态码: {response.status_code}")
        print(f"响应时间: {response_time:.3f}秒")

        try:
            data = response.json()

            # 处理不同接口的响应结构差异
            embedding = None
            if endpoint_name == "api/embeddings":
                embedding = data.get("embedding")  # 原生API返回embedding字段
            elif endpoint_name == "v1/embeddings":
                embedding = data.get("data", [{}])[0].get("embedding")  # OpenAI兼容API返回data数组中的embedding

            if embedding:
                print(f"Embedding向量长度: {len(embedding)}")
                return {
                    "endpoint": endpoint_name,
                    "status_code": response.status_code,
                    "response_time": response_time,
                    "embedding_length": len(embedding),
                    "embedding": embedding[:5],
                }
            else:
                print("响应中未找到'embedding'字段")
                return {"endpoint": endpoint_name, "status_code": response.status_code, "error": "No embedding field in response"}

        except ValueError:
            print("响应不是有效的JSON格式")
            return {"endpoint": endpoint_name, "status_code": response.status_code, "error": "Invalid JSON response"}

    except Exception as e:
        print(f"请求失败: {str(e)}")
        return {"endpoint": endpoint_name, "error": str(e)}


def compare_endpoints():
    """比较两个端点的性能"""
    results = []

    print("=" * 50)
    print(f"开始比较Ollama的embeddings接口,使用模型: {MODEL_NAME}")
    print("=" * 50)

    for endpoint_name, endpoint_info in ENDPOINTS.items():
        results.append(test_endpoint(endpoint_name, endpoint_info))

    print("\n" + "=" * 50)
    print("比较结果摘要:")
    print("=" * 50)

    successful_results = [res for res in results if "embedding_length" in res]

    if len(successful_results) == 2:
        if successful_results[0]["embedding_length"] == successful_results[1]["embedding_length"]:
            print(f"两个接口返回的embedding维度相同: {successful_results[0]['embedding_length']}")
        else:
            print("两个接口返回的embedding维度不同:")
            for result in successful_results:
                print(f"- {result['endpoint']}: {result['embedding_length']}")

        print("\nEmbedding前5个元素示例:")
        for result in successful_results:
            print(f"- {result['endpoint']}: {result['embedding']}")

        faster = min(successful_results, key=lambda x: x["response_time"])
        slower = max(successful_results, key=lambda x: x["response_time"])
        print(f"\n更快的接口: {faster['endpoint']} ({faster['response_time']:.3f}秒 vs {slower['response_time']:.3f}秒)")
    else:
        print("至少有一个接口未返回有效的embedding数据")
        for result in results:
            if "error" in result:
                print(f"- {result['endpoint']} 错误: {result['error']}")


if __name__ == "__main__":
    compare_endpoints()

输出结果如下:

Embedding前5个元素示例:
- api/embeddings: [-1.6793335676193237, 0.28421875834465027, -0.3738324046134949, -0.12534970045089722, 0.22841963171958923]
- v1/embeddings: [-0.0640459, 0.0108394455, -0.014257102, -0.004780547, 0.008711396]

更快的接口: api/embeddings (0.078秒 vs 0.091)

结果显示,两个接口返回维度相同(均为1024),但结果的确存在差异,同时api/embeddings接口的速度更快。

因此,本版本在后台解析时,对于ollama模型,调用接口调整为api/embeddings,修复前后台不一致的问题。

杂项

1. 前台元素精简

此版本在前台移除Agent文件管理,语言仅保留简体中文繁体中文英语,界面更简介清晰。

2. 后端代码清理

实测发现,DeepWiki在解析代码时,会输出不少deepdoc代码的细节,版本对其进行进一步解耦清理。

3. 封面优化

对后台管理的界面图标和前台登陆页的封面进行更换。

下版本计划

下版本将继续围绕文件解析和交互进行优化,计划改进点如下:

1. 聊天文件上传

在聊天时,恢复原本的上传文件交互按钮,重构文件上传处理逻辑。

2. chunk关联图片修改

在前台知识库界面,优化chunk和图片的关联显示,并支持手动编辑调整关联图片信息。

3. 图片输出顺序优化

问答输出图片时,进一步支持图片在回答问题中进行显示,而不是全放到末尾。

4. 关键词显性显示

在知识库预览中,显性显示每一个chunk的自定义关键词。

5. 中翻英适配

ragflow最新版提供了一个中文翻译成英文,然后在知识库中进行检索的功能,但实现逻辑是通过聊天模型转换,效率较低,考虑使用更轻量的方式进行实现。

总结

最近听了好几小时刘强东的采访,当初,马云问刘强东:“四通一达这么便宜,你为什么不用呢?”

出于多种原因,京东走上了自建物流的道路。

RagflowPlus的发展道路也非常相似,当现有的功能实现不够好时,重构是必由选择。

掌控算法细节,才能透过表象觉察到底层的本质原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能照明系统:具备认知能力的“光神经网络”

智能照明系统是物联网技术与传统照明深度融合的产物,其本质是通过感知环境、解析需求、自主决策的闭环控制,重构光与人、空间、环境的关系。这一系统由智能光源、多维传感器、边缘计算单元及云端管理平台构成,形成具备认知能力的“光神经网络…

SpringSecurity+vue通用权限系统

SpringSecurityvue通用权限系统 采用主流的技术栈实现,Mysql数据库,SpringBoot2Mybatis Plus后端,redis缓存,安全框架 SpringSecurity ,Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …

短视频时长预估算法调研

weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp​(1−p)oddsTp(Tpodds…

设计模式域——软件设计模式全集

摘要 软件设计模式是软件工程领域中经过验证的、可复用的解决方案,旨在解决常见的软件设计问题。它们是软件开发经验的总结,能够帮助开发人员在设计阶段快速找到合适的解决方案,提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三…

FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景

一、什么是FTPS? FTPS,英文全称File Transfer Protocol with support for Transport Layer Security (SSL/TLS),安全文件传输协议,是一种对常用的文件传输协议(FTP)添加传输层安全(TLS)和安全套接层(SSL)加密协议支持的扩展协议。…

Python 解释器安装全攻略(适用于 Linux / Windows / macOS)

目录 一、Windows安装Python解释器1.1 下载并安装Python解释1.2 测试安装是否成功1.3 设置pip的国内镜像------永久配置 二、macOS安装Python解释器三、Linux下安装Python解释器3.1 Rocky8.10/Rocky9.5安装Python解释器3.2 Ubuntu2204/Ubuntu2404安装Python解释器3.3 设置pip的…

Java多线程从入门到精通

一、基础概念 1.1 进程与线程 进程是指运行中的程序。 比如我们使用浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。 线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某…

【芯片仿真中的X值:隐藏的陷阱与应对之道】

在芯片设计的世界里,X值(不定态)就像一个潜伏的幽灵。它可能让仿真测试顺利通过,却在芯片流片后引发灾难性后果。本文将揭开X值的本质,探讨其危害,并分享高效调试与预防的实战经验。    一、X值的本质与致…

python3GUI--基于PyQt5+DeepSort+YOLOv8智能人员入侵检测系统(详细图文介绍)

文章目录 一.前言二.技术介绍1.PyQt52.DeepSort3.卡尔曼滤波4.YOLOv85.SQLite36.多线程7.入侵人员检测8.ROI区域 三.核心功能1.登录注册1.登录2.注册 2.主界面1.主界面简介2.数据输入3.参数配置4.告警配置5.操作控制台6.核心内容显示区域7.检…

5. TypeScript 类型缩小

在 TypeScript 中,类型缩小(Narrowing)是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码,确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…

【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)

目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题,描述如下: 我在qtdesigner用界面拖了一个QTableView控件,object name为【tableView_electrode】,然后【提升为】了自定义的类【Steer_Electrode_Table】&…

【Docker 02】Docker 安装

🌈 一、各版本的平台支持情况 ⭐ 1. Server 版本 Server 版本的 Docker 就只有个命令行,没有界面。 Platformx86_64 / amd64arm64 / aarch64arm(32 - bit)s390xCentOs√√Debian√√√Fedora√√Raspbian√RHEL√SLES√Ubuntu√√√√Binaries√√√ …

论文笔记:Large Language Models for Next Point-of-Interest Recommendation

SIGIR 2024 1 intro 传统的基于数值的POI推荐方法在处理上下文信息时存在两个主要限制 需要将异构的LBSN数据转换为数字,这可能导致上下文信息的固有含义丢失仅依赖于统计和人为设计来理解上下文信息,缺乏对上下文信息提供的语义概念的理解 ——>使用…

LeetCode 2894.分类求和并作差

目录 题目: 题目描述: 题目链接: 思路: 思路一详解(遍历 判断): 思路二详解(数学规律/公式): 代码: Java思路一(遍历 判断&a…

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日,CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校(西安交通大学…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基础的消息处理模式,核心思想是 ​​多个消费者竞争消费同一个队列中的消息​​,适用于任务分发和负载均衡场景。同一个消息只会被一个消费者处理。 当一个消息队列绑定了多个消费者,每个消息消费的个数都是平摊的&a…

基于微信小程序的作业管理系统源码数据库文档

作业管理系统 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和微信小程序来完成对系统的…

CSS(2)

文章目录 Emmet语法快速生成HTML结构语法 Snipaste快速生成CSS样式语法快速格式化代码 快捷键(VScode)CSS 的复合选择器什么是复合选择器交集选择器后代选择器(重要)子选择器(重要)并集选择器(重要)**链接伪类选择器**focus伪类选…

【RabbitMQ】- Channel和Delivery Tag机制

在 RabbitMQ 的消费者代码中,Channel 和 tag 参数的存在是为了实现消息确认机制(Acknowledgment)和精细化的消息控制。 Channel 参数 作用 Channel 是 AMQP 协议的核心操作接口,通过它可以直接与 RabbitMQ 交互: 手…

NLP学习路线图(三十四): 命名实体识别(NER)

一、命名实体识别(NER)是什么? 命名实体识别(Named Entity Recognition, NER)是自然语言处理中的一项关键序列标注任务。其核心目标是从非结构化的文本中自动识别出特定类别的名词性短语,并将其归类到预定义的类别中。 核心目标:找到文本中提到的命名实体,并分类。 典…