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

HtmlRAG:RAG系统中,HTML比纯文本效果更好

HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法,在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。

方法

其实主要看下围绕html提纯思路,将提纯后的Html内容送入LLM进行增强问答。

1. HTML 清洗

由于原始 HTML 文档过长(每个超过 80K),并且不需要考虑用户查询的语义特征,因此在这个步骤中使用基于规则的方法进行预处理。这个清洗过程移除无关内容并压缩冗余结构,保留原始 HTML 中的所有语义信息。清洗后的 HTML 适合于配备长上下文 LLM 的 RAG 系统,并且不希望在生成前丢失任何信息。清洗后的 HTML 还是后续 HTML 修剪的基础。

1.1 HTML 内容清洗

从网络上检索到的 HTML 文档包含大量对人类用户不可见的额外内容,如 HTML 标签、CSS 和 JavaScript。大多数 HTML 标签提供丰富的结构信息,帮助 LLM 理解 HTML,而 CSS 和 JavaScript 内容提供的帮助有限。具体的清洗步骤几乎是无损的:

  1. 移除 CSS 样式、注释和 JavaScript。
  2. 清理冗长的 HTML 标签属性。
1.2 无损结构压缩

在大多数 HTML 文档中,原始 HTML 结构包含冗余。对 HTML 结构进行以下压缩而不丢失语义信息:

  1. 合并多层单嵌套标签。例如,将 <div<div><p>some text</p></div></div> 简化为 <p>some text</p>
  2. 移除空标签,如 <p></p>
2. 块树构建

为了整体修剪所有检索到的 HTML 文档,我们首先将所有检索到的 HTML 文档连接在一起,并使用 Beautiful Soup 解析为单个 DOM 树。使用 DOM 树修剪 HTML 是最自然的方式,但 DOM 树过于细粒度,导致大量的节点和深树结构带来巨大的计算成本。

考虑到上述问题,我们提出了一种优化的树结构来建模 HTML,这种结构不是那么细粒度。理想情况下,树结构的粒度可以根据不同的修剪需求进行调整。我们称之为“块树”,并设置每个块的最大单词数 m a x W o r d s maxWords maxWords 来控制块树的粒度。在构建块树时,我们从 DOM 树开始,合并碎片化的子节点到它们的父节点,并将其视为一个块。我们可以递归地合并块或子节点到它们的父节点,以形成更大的块,条件是块的单词数不超过 m a x W o r d s maxWords maxWords。合并后,无法合并的原始叶节点也被视为块。

3. 基于块树的 HTML 修剪

块树基础的 HTML 修剪包括两个步骤,这两个步骤都在块树结构上进行。第一个修剪步骤使用嵌入模型来修剪 HTML 清洗模块输出的结果,而第二个步骤使用生成模型来修剪第一个修剪步骤输出的结果。

3.1 基于文本嵌入的块修剪

该步骤的目标是在保持关键信息的同时,缩短检索结果的 HTML 文档长度。通过删除与用户查询相关性较低的块,可以减少输入到LLM中的冗余信息,从而提高生成效率和质量。

步骤
  1. 从每个块中提取纯文本内容。使用文本嵌入模型计算这些文本内容与用户查询的相似性得分。通常,嵌入模型会将文本转换为向量表示,并计算这些向量之间的相似性。

  2. 贪心算法修剪:使用贪心算法来选择要删除的块。算法会从相似性得分最低的块开始删除,直到 HTML 文档的总长度满足设定的上下文窗口要求。删除块时,可能会重新出现冗余的 HTML 结构(如多层嵌套标签或空标签),因此需要重新调整 HTML 结构,以确保其简洁性和正确性。

  3. 重新调整 HTML 结构:在删除块后,检查并合并多层单嵌套标签(例如,将 <div<div><p>...</p></div></div> 简化为 <p>...</p>)。移除空标签(如 <p></p>),以进一步简化 HTML 结构。

3.2 生成模型的细粒度块修剪

生成模型的细粒度块修剪提示词

如下图,为了进一步细粒度地修剪块,扩展了修剪后块树的叶节点,构建了一个更细粒度的块树。由于生成模型具有较长的上下文窗口,可以全局建模块树。生成模型计算每个块的得分,得分由唯一序列的生成概率给出,序列由从根标签到块标签和文本的HTML标签路径表示。最后,根据块得分,应用类似的贪心算法获得最终的修剪HTML。

块得分计算。使用分词器将块树转换为标记树,相应的HTML标签和标记用相同的颜色标记。标记生成概率位于右上角,虚线框中的标记不需要推理。块树的右上角显示块概率,可以从相应的标记概率推导出来。

实验效果

  • HtmlRAG的消融研究及块树粒度影响的实验结果

相关文章:

HtmlRAG:RAG系统中,HTML比纯文本效果更好

HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法&#xff0c;在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。 方法 其实主要看下围绕html提纯思路&#xff0c;将提纯后的…...

TypeScript 中的 reduce计算统计之和

1、计算字符串数组中最大的一项&#xff0c;比如数组&#xff1a;list ["家长会,柘城,喝士大夫","模压,手动阀,阿斯蒂"]&#xff0c;求出list中字符串长度之和最大的那项&#xff1a; // 初始化变量来存储字数之和最多的项及其字数之和let maxWord ;let…...

HTTP/2 由来及特性

HTTP/2 的由来 HTTP/1.x 的局限性 性能瓶颈 队头阻塞问题&#xff1a;在HTTP/1.x中&#xff0c;一个TCP连接在同一时间只能处理一个请求&#xff0c;后续请求必须等待前面的请求处理完成并收到响应后才能被处理。例如&#xff0c;当一个页面有多个资源&#xff08;如图片、脚…...

android 安装第三方apk自动赋予运行时权限

摘要&#xff1a;行业机使用场景点击运行时权限很麻烦&#xff0c;而随着android的演进&#xff0c;对于权限的管控越发严格。故本文通过对系统的修改实现第三方app在运行时直接获取全部权限。 通过属性ro.perms.force_grant控制功能开关。 Index: frameworks/base/services/…...

PyTorch Lightning LightningDataModule 介绍

LightningDataModule 是 PyTorch Lightning 提供的数据模块,用于统一管理数据加载流程(包括数据准备、预处理、拆分、批量加载等)。它的核心作用是将数据处理逻辑与模型解耦,提高代码的可复用性和可读性。 1. LightningDataModule 的作用 ✅ 封装数据预处理:数据下载、清…...

windows平台上 oracle简单操作手册

一 环境描述 Oracle 11g单机环境 二 基本操作 2.1 数据库的启动与停止 启动: C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期五 7月 31 12:19:51 2020 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到:…...

【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR

未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …...

LabVIEW太阳能制冷监控系统

在全球能源需求日益增长的背景下&#xff0c;太阳能作为一种无限再生能源&#xff0c;被广泛应用于各种能源系统中。本基于LabVIEW软件和STM32F105控制器的太阳能制冷监控系统的设计与实现&#xff0c;提供一个高效、经济的太阳能利用方案&#xff0c;以应对能源消耗的挑战。 项…...

10.2 Git 内部原理 - Git 对象

Git 对象 Git 是一个内容寻址文件系统&#xff0c;听起来很酷。但这是什么意思呢&#xff1f; 这意味着&#xff0c;Git 的核心部分是一个简单的键值对数据库&#xff08;key-value data store&#xff09;。 你可以向 Git 仓库中插入任意类型的内容&#xff0c;它会返回一个唯…...

作业。。。。。

顺序表按元素删除 参数&#xff1a;删除元素&#xff0c;顺序表 1.调用元素查找的函数 4.根据下表删除 delete_sub(list,sub); //删除元素 void delete_element(int element, Sqlist *list) …...

android 的抓包工具

charles 抓包工具 官网地址 nullCharles Web Debugging Proxy - Official Sitehttps://www.charlesproxy.com/使用手册一定记得看官网 SSL Certificates • Charles Web Debugging Proxy http请求&#xff1a; 1.启动代理&#xff1a; 2.设置设备端口 3.手机连接当前代理 …...

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化

著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址&#xff1a;https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次&#xff0c;他将立足于 DeepSeek 技术报告&#xff0c;介绍用于构建推理模型的四种主要方法&#xff0c;也就是…...

linux中top命令详解

linux中top命令详解 top 是 Linux 中用于实时监控系统资源使用情况的命令&#xff0c;显示包括 CPU、内存、进程等信息的动态视图。以下是 top 命令的详细说明&#xff1a; 命令格式 top [选项] 常用选项 -d&#xff1a;设置刷新间隔时间&#xff08;秒&#xff09;。 -n&am…...

前端包管理器的发展以及Npm、Yarn和Pnpm对比

在现代前端开发中&#xff0c;包管理器是不可或缺的核心工具。随着 JavaScript 生态的快速发展&#xff0c;开发者经历了从 npm 一统天下到 Yarn 挑战格局&#xff0c;再到 pnpm 创新突破的技术演进。这里将对三种主流包管理器&#xff08;npm/Yarn/pnpm&#xff09;进行全方位…...

node.js+兰空图床实现随机图

之前博客一直用的公共的随机图API&#xff0c;虽然图片的质量都挺不错的&#xff0c;但是稳定性都比较一般&#xff0c;遂打算使用之前部署的兰空图床&#xff0c;自己弄一个随机图 本文章服务器操作基于雨云——新一代云服务提供商的云服务器进行操作&#xff0c;有兴趣的话可…...

【MySQL】高频 SQL 50 题(基础版)

高频SQL50题&#xff08;基础版&#xff09; 1.查询 2.连接 MySQL多表查询&#xff08;联合查询、连接查询、子查询&#xff09; left join 左连接 我们首先执行LEFT JOIN操作&#xff0c;将两个表的数据基于 id 列进行组合。同样&#xff0c;我们使用 LEFT JOIN 来确保将所…...

盛铂科技 SMF106 低相位噪声贴片式频率综合器模块

在现代通信和电子设备领域&#xff0c;频率综合器作为关键组件&#xff0c;其性能优劣直接影响系统的整体表现。盛铂科技的 SMF106 低相位噪声贴片式频率综合器&#xff0c;以其卓越的性能和独特设计&#xff0c;成为众多高性能系统的选择。 一、频率覆盖范围广&#xff0c;步进…...

C语言如何实现面向对象?——从结构体到自由函数的思考

1. 问题的背景 面向对象编程&#xff08;OOP&#xff09;是一种广泛使用的编程范式&#xff0c;其核心思想包括封装、继承和多态。C、Java等语言原生支持OOP&#xff0c;但C语言作为一门面向过程的语言&#xff0c;是否也能实现面向对象&#xff1f;如果可以&#xff0c;如何实…...

深入探索C语言中的字符串处理函数:strstr与strtok

在C语言的字符串处理领域&#xff0c; strstr 和 strtok 是两个非常重要的函数&#xff0c;它们各自承担着独特的功能&#xff0c;为开发者处理字符串提供了强大的支持。 一、strstr函数&#xff1a;字符串查找的利器 strstr 函数用于在一个字符串中查找另一个字符串的首次出现…...

浅聊Docker使用、部署

在Java面试中&#xff0c;当被问到关于Docker中间件的使用、部署及在实际项目中的考虑时&#xff0c;可以按照以下结构和内容来详细回答&#xff1a; 一、Docker中间件的使用 1. Docker是什么&#xff1f; Docker是一个开源平台&#xff0c;允许开发者将应用程序及其依赖项打…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...