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 内容提供的帮助有限。具体的清洗步骤几乎是无损的:
- 移除 CSS 样式、注释和 JavaScript。
- 清理冗长的 HTML 标签属性。
1.2 无损结构压缩
在大多数 HTML 文档中,原始 HTML 结构包含冗余。对 HTML 结构进行以下压缩而不丢失语义信息:
- 合并多层单嵌套标签。例如,将
<div<div><p>some text</p></div></div>简化为<p>some text</p>。 - 移除空标签,如
<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中的冗余信息,从而提高生成效率和质量。
步骤
-
从每个块中提取纯文本内容。使用文本嵌入模型计算这些文本内容与用户查询的相似性得分。通常,嵌入模型会将文本转换为向量表示,并计算这些向量之间的相似性。
-
贪心算法修剪:使用贪心算法来选择要删除的块。算法会从相似性得分最低的块开始删除,直到 HTML 文档的总长度满足设定的上下文窗口要求。删除块时,可能会重新出现冗余的 HTML 结构(如多层嵌套标签或空标签),因此需要重新调整 HTML 结构,以确保其简洁性和正确性。
-
重新调整 HTML 结构:在删除块后,检查并合并多层单嵌套标签(例如,将
<div<div><p>...</p></div></div>简化为<p>...</p>)。移除空标签(如<p></p>),以进一步简化 HTML 结构。
3.2 生成模型的细粒度块修剪

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

实验效果


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

相关文章:
HtmlRAG:RAG系统中,HTML比纯文本效果更好
HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法,在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。 方法 其实主要看下围绕html提纯思路,将提纯后的…...
LeetCode题解:2690. 无穷方法对象,Proxy
Problem: 2690. 无穷方法对象 思路 这个问题的核心在于创建一个对象,该对象能够响应对其任何方法的调用,并返回调用的方法名称。为了实现这一点,我们可以利用 JavaScript 中的 Proxy 对象。Proxy 对象允许我们自定义对象的基本操作ÿ…...
在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程
既然我们已经在本地部署了DeepSeek,肯定希望能够利用本地的模型对自己软件开发、办公文档进行优化使用,接下来就先在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档的教程奉上。 前提: (1)已经部署好了DeepSeek,可以看我的文章:个人windows电脑上安装DeepSe…...
2023-arXiv-CoT Prompt 思维链提示提升大型语言模型的推理能力
arXiv | https://arxiv.org/abs/2201.11903 摘要: 我们探讨了如何生成思维链(一系列中间推理步骤)显著提高大型语言模型执行复杂推理的能力。在三个大型语言模型上的实验表明,思维链提示提高了一系列算术、常识和符号推理任务的性…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<10>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 今天我们继续来复习指针… 目录 一、看一段代码二、 一维数组传参的本质三、冒泡排序3.1 基本思想四、二…...
如何在MacOS上查看edge/chrome的扩展源码
步骤 进入管理扩展页面点击详细信息复制对应id在命令行键入 open ~/Library/Application Support/Microsoft Edge/Default/Extensions/${你刚刚复制的id} 即可打开访达中对应的更目录 注意 由于原生命令行无法直接处理空格 ,所以需要加转义符\,即:open ~/Librar…...
C++病毒(^_^|)(2)
第二期 声明: 仅供损害电脑,不得用于非法。损坏电脑,作者一律不负责。此作为作者原创,转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…...
CNN|ResNet-50
导入数据 import matplotlib.pyplot as plt # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号import os,PIL,pathlib import numpy as npfrom tensorflow import keras from tensor…...
Java堆外内存的高效利用与性能优化
在Java开发中,堆外内存(Direct Memory)是除Java堆以外的内存区域。它允许Java程序直接分配和管理非堆内存,这为高性能的数据处理提供了可能。 1、 什么是堆外内存? 堆外内存,也称为直接内存(D…...
吉祥汽车泰国首发,用 Unity 实现行业首创全 3D 座舱虚拟世界
11 月 19 日,均瑶集团吉祥智驱(以下简称“吉祥汽车”)首款纯电动汽车 JY AIR 在泰国首发。延续吉祥航空在飞行体验上的优势,吉祥汽车对 JY AIR 赋予了将航空级服务标准延伸至地面的使命,为用户提供一站式大出行体验。此…...
【OpenCV】双目相机计算深度图和点云
双目相机计算深度图的基本原理是通过两台相机从不同角度拍摄同一场景,然后利用视差来计算物体的距离。本文的Python实现示例,使用OpenCV库来处理图像和计算深度图。 1、数据集介绍 Mobile stereo datasets由Pan Guanghan、Sun Tiansheng、Toby Weed和D…...
Uniapp 原生组件层级过高问题及解决方案
文章目录 一、引言🏅二、问题描述📌三、问题原因❓四、解决方案💯4.1 使用 cover-view 和 cover-image4.2 使用 subNVue 子窗体4.3 动态隐藏原生组件4.4 使用 v-if 或 v-show 控制组件显示4.5 使用 position: fixed 布局 五、总结Ἰ…...
iOS实现生物识别
1. info.plist中添加权限申请 <key>NSFaceIDUsageDescription</key> <string>APP would like to use Face ID</string> <key>NSBiometricUsageDescription</key> <string>APP would like to use Touch ID</string>2. 添加库 …...
React 初级教程
一、React 简介 React 是由 Facebook 开发的开源 JavaScript 库,用于构建用户界面(UI)。特点: 声明式编程:通过描述 UI 应该是什么样子(而不是操作 DOM)来构建界面。组件化:将 UI 拆分为独立可复用的组件。跨平台:支持 Web(React)、移动端(React Native)、VR 等。…...
【数据结构初阶第十节】队列(详解+附源码)
好久不见。。。别不开心了,听听喜欢的歌吧 必须有为成功付出代价的决心,然后想办法付出这个代价。云边有个稻草人-CSDN博客 目录 一、概念和结构 二、队列的实现 Queue.h Queue.c test.c Relaxing Time! ————————————《有没…...
萌新学 Python 之列表 list
list 列表:用中括号定义,元素写在中括号之间,元素之间使用逗号分隔 list1 [] # 空列表 list2 [1] # 元素为1个 list3 [a, b, c] print(type(list1), type(list2), type(list3)) # <class list> <class list> <class …...
250213-RHEL8.8-外接SSD固态硬盘
It seems that the exfat-utils package is still unavailable, even after enabling the RPM Fusion repository. This could happen if the repository metadata hasn’t been updated or if the package isn’t directly available in the RPM Fusion repository for RHEL 8…...
游戏引擎学习第99天
仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板:制作一些光场(Light Field) 当前的目标是为游戏添加光照系统,并已完成了法线映射(normal maps)的管道,但还没有创建可以供这些正常映射采样的光场。为了继续推进&…...
Linux初始化 配置yum源
问题出现:(报错) 1 切换路径 2 备份需要操作的文件夹 3 更改 CentOS 的 YUM 仓库配置文件,以便使用阿里云的镜像源。 4 清除旧的yum缓存 5 关闭防火墙 6 生成新的yum缓存 7 更新系统软件包 8 安装软件包...
【笛卡尔树】
笛卡尔树 笛卡尔树定义构建性质 习题P6453 [COCI 2008/2009 #4] PERIODNICF1913D Array CollapseP4755 Beautiful Pair[ARC186B] Typical Permutation Descriptor 笛卡尔树 定义 笛卡尔树是一种二叉树,每一个节点由一个键值二元组 ( k , w ) (k,w) (k,w) 构成。要…...
Ubuntu启动geteck/jetlinks实战:Docker启动(无法登录)
参考: JetLinks 物联网基础平台 安装Docker Ubuntu下载安装Docker-Desktop-CSDN博客 sudo apt install -y docker-compose 下载源码 git clone https://github.com/jetlinks/jetlinks-community.git cd jetlinks-community 启动 cd docker/run-all sudo dock…...
Java String 类深度解析:内存模型、常量池与核心机制
目录 一、String初识 1. 字符串字面量的处理流程 (1) 编译阶段 (2) 类加载阶段 (3) 运行时阶段 2. 示例验证 示例 1:字面量直接赋值 示例 2:使用 new 创建字符串 示例 3:显式调用 intern() 注意点1: ⑴. String s1 &q…...
不到一个月,SQLite 3.49.0来了
距离 SQLite 3.48.0 发布不到一个月,SQLite 开发团队于 2025 年 2 月 6 日发布了 SQLite 3.49.0 版本。这更新速度的确让人感动,那么这个版本又有哪些更新呢? 查询优化器 新版本改进了自动索引(query-time index)优化…...
探索顶级汽车软件解决方案:驱动行业变革的关键力量
在本文中,将一同探索当今塑造汽车行业的最具影响力的软件解决方案。从设计到制造,软件正彻底改变车辆的制造与维护方式。让我们深入了解这个充满活力领域中的关键技术。 设计软件:创新车型的孕育摇篮 车辆设计软件对于创造创新型汽车模型至…...
ThreadPoolExecutor 详解
一、ThreadPoolExecutor 核心参数 构造函数如下: public ThreadPoolExecutor(int corePoolSize, // 核心线程数int maximumPoolSize, // 最大线程数long keepAliveTime, // 非核心线程空闲存活时间TimeUnit unit, // 存活时间单位BlockingQueue…...
TikTok走红全球:中国短视频平台以全新姿态登陆海外市场
在数字化浪潮中,短视频已经成为全球年轻人表达自我、分享生活的重要方式。TikTok,这个起源于中国的短视频平台,以其独特的魅力和创新的功能在全球范围内迅速走红。本文将探讨TikTok如何以全新姿态登陆海外市场,并分析其成功的关键…...
Qt的QTableWidget样式设置
在 Qt 中,可以通过样式表(QSS)为 QTableWidget 设置各种样式。以下是一些常见的样式设置示例: 1. 基本样式设置 tableWidget->setStyleSheet(// 表格整体样式"QTableWidget {"" background-color: #F0F0F0;…...
计算机毕业设计Python旅游评论情感分析 NLP情感分析 LDA主题分析 bayes分类 旅游爬虫 旅游景点评论爬虫 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
渗透测试扫描器全解析:分类与介绍
目录 前言 操作系统扫描器:系统漏洞的 “侦察兵” 特点 代表性工具 网站 Web 漏洞扫描器:Web 应用的 “安全卫士” 特点 代表性工具 手机漏洞扫描器:移动设备的 “安全护盾” 特点 代表性工具 前言 在数字技术飞速发展的当下&…...
day9手机创意软件
趣味类 in:记录趣味生活(通用) 魔漫相机:真人变漫画(通用) 活照片:让照片活过来(通用) 画中画相机:与众不同的艺术 年龄检测仪:比一比谁更年轻…...
