首页 前端知识 中国人民大学联合百川智能发布HtmlRAG,有效增强大模型知识获取与处理能力

中国人民大学联合百川智能发布HtmlRAG,有效增强大模型知识获取与处理能力

2025-03-05 18:03:30 前端知识 前端哥 168 927 我要收藏

检索增强生成(RAG)已被证明能够提高知识能力,并缓解大语言模型(LLM)的幻觉问题。网络是RAG系统中主要的外部知识来源之一,许多商业系统,如ChatGPT和Perplexity,使用网络搜索引擎作为其主要的检索系统。通常,这样的RAG系统会检索搜索结果,下载结果的HTML源代码,并从中提取纯文本。纯文本文档或片段被输入到LLM中以增强生成能力。然而,在基于纯文本的RAG过程中,HTML中固有的结构和语义信息,如标题和表格结构,会被丢失

为了缓解这个问题,中国人民大学高瓴人工智能学院联合百川智能提出基于HTML的检索增强生成新范式——HtmlRAG,它使用HTML而不是纯文本作为检索知识的格式。我们认为HTML比纯文本更适合建模外部文档中的知识,而且大多数LLM具有强大的能力来理解HTML。然而,利用HTML也带来了新的挑战。HTML包含额外的内容,如标签、JavaScript和CSS规范等,这些内容会给RAG系统带来额外的输入标记和噪声。为了解决这个问题,我们提出了HTML清理、压缩和修剪策略,以缩短HTML代码的同时尽量减少信息的损失。具体来说,我们设计了一种基于块树的两步修剪方法,该方法修剪无用的HTML块并仅保留HTML的相关部分在六个问答数据集上的实验验证了在RAG系统中使用HTML的优越性

图片

一、研究背景

1.1 大语言模型(LLMs)的现状与问题

大语言模型(LLMs)在多种自然语言处理任务中展现出强大能力,但也存在诸如遗忘长尾知识、提供过时知识和产生幻觉等缺陷。

1.2 检索增强生成(RAG)的作用与现状

RAG利用检索系统获取外部知识来增强LLMs,已被证明可有效缓解LLMs的幻觉问题,许多RAG系统如Perplexity和SearchGPT等已被开发,且通常使用Web搜索引擎作为底层检索系统。然而,传统RAG管道多使用纯文本作为检索知识的格式,在将HTML转换为纯文本时会丢失结构和语义信息,如表格结构、HTML标签等。

1.3 HTML作为外部知识格式的优势与挑战

以HTML作为外部知识格式具有保留HTML文档固有信息、LLMs在预训练中已接触过HTML(具备理解能力)、长输入窗口的LLMs可处理HTML以及多种文档格式可转换为HTML等优势。但HTML也带来了处理更长输入序列和嘈杂上下文的挑战,如HTML文档平均长度过长,包含大量无意义的CSS、JavaScript、注释等内容,以及噪声可能影响LLMs生成质量。

图片

图1:展示了HTML转换为纯文本时信息的丢失情况,包括表格结构的混乱和重要HTML标签的丢弃,说明了将HTML作为RAG系统外部知识格式的必要性,以保留更多信息。

二、研究方法

2.1 整体思路

提出HtmlRAG,使用HTML替代纯文本作为RAG系统中检索知识的格式,以保留更多语义和结构信息,并通过HTML清洗和HTML修剪来解决HTML带来的问题。

2.2 HTML清洗

  • 内容清洗:去除CSS样式、注释、JavaScript及冗长的HTML标签属性,保留HTML标签提供的结构信息,减少无意义内容。

  • 结构压缩:合并多层单嵌套标签,移除空标签,在不损失语义信息的前提下压缩HTML结构,减少冗余。

2.3 粒度可调的块树构建

将所有检索到的HTML文档连接并解析为DOM树,为解决DOM树粒度过细、计算成本高的问题,提出构建“块树”的方法,通过合并子节点控制块树粒度,以适应不同修剪需求。

2.4 基于块树的HTML修剪

  • 基于文本嵌入的修剪:使用嵌入模型计算块与用户查询的相似度得分,采用贪心算法删除低相似度块,保留关键信息,但该方法存在上下文窗口有限、对细粒度块处理能力不足的局限。

  • 生成式细粒度块修剪:扩展经嵌入模型修剪后的块树叶子节点得到更细粒度块树,利用生成式模型计算块得分,通过设计路径感知生成模型、收集监督数据进行微调、高效树推理(包括构建令牌树、计算令牌概率、转换为块树得分)及贪心块修剪操作,进一步优化HTML。

图片

图2:展示了生成式模型的输入和输出格式,包括HTML、查询、指令以及生成的块路径和块内容,体现了模型如何识别和输出最相关的文本块。

图片

图3:呈现了HtmlRAG管道的概述,包括HTML清洗、块树构建、基于文本嵌入的块修剪和生成式细粒度块修剪等步骤,清晰展示了整个处理流程。

图片

图4:说明了块分数计算的过程,通过将块树转换为令牌树,展示了令牌的生成概率计算和块分数的推导,解释了生成式模型如何为块计算得分。

三、实验分析

3.1 实验设置

  • 数据集:选用ASQA、HotPotQA、NQ、Trivia - QA、MuSiQue、ELI5六个QA数据集,通过Bing搜索API获取HTML格式的真实网页作为检索文档。

  • 评估指标:根据数据集的问答格式选择不同指标,如Exact Match、Hit@1、ROUGE - L和BLEU等。

  • 基线方法:与基于纯文本或Markdown格式的多种后检索处理基线方法对比,包括不同的分块精炼器和抽象精炼器,并使用不同的重排模型。

  • 实验环境:使用Llama - 3.1 - 70B - Instruct和Llama - 3.1 - 8B - Instruct进行实验,设置4K上下文窗口,并详细介绍了HtmlRAG的实现细节,如块树构建的粒度、使用的嵌入模型和生成模型及其训练数据等。

3.2 实验结果

  • 与基线方法对比HtmlRAG在六个数据集的所有指标上达到或超过基线方法,证明了HTML修剪的有效性。在分块精炼器中,基于HTML标签标题的分块策略未充分利用HTML结构信息,且转换为纯文本会丢失信息;在重排模型中,稀疏检索器BM25表现不如两个密集检索器,且编码器 - 基于的BGE优于解码器 - 基于的E5 - Mistral。抽象精炼器中,LongLLMLingua未针对HTML优化,提取能力受影响,JinaAI - Reader虽将HTML转换为Markdown,但存在计算成本高和解码困难的问题。

图片

表1:呈现了HtmlRAG与基线方法在短上下文设置(4K)下的实验结果,包括不同数据集上的评估指标(如ASQA的Hit@1和EM、HotPotQA的EM等),对比了各种方法的性能,证明了HtmlRAG的有效性。

  • HTML清洗的有效性:通过对比HTML清洗模块(未修剪的HtmlRAG)与其他规则 - 基于的清洗策略(如Vanilla HTML、纯文本、Markdown),在长上下文设置(128K)下的实验表明,以HTML为格式时,HtmlRAG在多数数据集上表现优于纯文本和Markdown,且未处理的HTML文档经清洗后有性能提升,更强大的LLM(70B)在处理HTML格式知识时表现更好

图片

表2:展示了HtmlRAG在不修剪(w/o Prune)和其他规则 - 基于的清洗策略(如Vanilla HTML、Plain Text、Markdown)在长上下文设置(128K)下的实验结果,比较了它们在不同数据集上的表现,验证了HTML作为格式的优势和清洗算法的有效性。

  • 消融实验:分别对块树构建、HTML修剪(嵌入模型和生成模型)进行消融实验,结果表明块树构建若使用DOM树会因碎片化导致嵌入模型捕获语义特征不足,影响性能;仅用生成模型修剪(不使用嵌入模型预修剪)会使输入过长,计算成本高且性能差;仅用嵌入模型修剪(不使用生成模型进一步修剪)效果不如完整的两阶段修剪方法,证明了各组件在HtmlRAG中的有效性

图片

表3:给出了HtmlRAG的消融研究结果,对比了去除块树构建(w/o Block Tree)、基于嵌入模型的修剪(w/o Prune - Embed)和基于生成模型的修剪(w/o Prune - Gen)后的性能变化,分析了各组件对整体方法的贡献。

  • 块树粒度的影响实验发现生成式模型比嵌入模型适应更细粒度,两阶段修剪方法合理,粗粒度降低修剪灵活性,细粒度虽对嵌入模型提取文本嵌入有挑战,但生成式模型可处理长上下文和细粒度块树,通过在不同粒度下实验,找到了平衡性能和灵活性的点。

图片

图5:展示了块树粒度对实验结果的影响,比较了不同粒度下基于文本嵌入的修剪(Prune - Embed)和生成式修剪(Prune - Gen)与强基线方法(BGE - Chunk - Rerank)的性能,帮助确定合适的块树粒度。

  • 轻量级HTML修剪的效率分析:对比了基于文本嵌入的HTML修剪(Prune - Embed)、生成式模型的HTML修剪(Prune - Gen)与基线方法(如使用BGE的分块精炼器)及LLM聊天的计算成本,表明嵌入模型修剪成本与分块精炼器相似,生成式模型虽成本略高但远低于LLM聊天,且可跳过大量节点,增加成本较小,推荐在典型RAG场景中使用完整HTML修剪,资源有限时可仅使用嵌入模型的基本修剪结果。

图片

表4:分析了在ELI5数据集上不同方法的推理成本,包括基于BGE的分块精炼器、HtmlRAG的两个HTML修剪步骤(Prune - Embed和Prune - Gen)以及LLM聊天,对比了模型参数、存储、平均输入令牌和平均输出令牌等方面的成本,评估了HtmlRAG的计算效率。

四、总结

4.1 研究成果

提出将HTML作为RAG系统外部知识格式,设计HTML清洗和修剪方法缩短HTML并保留关键信息,实验证明HtmlRAG优于现有基于纯文本的后检索处理方法,验证了HTML作为检索知识格式的优势

4.2 未来展望

认为随着LLMs能力增强,HTML将更适合作为外部知识格式,期望未来有更好的处理HTML的解决方案。

4.3 其他问题补充

纯文本似乎更好?

信息损失评估可以先参考上表,显示在有限的上下文窗口下,超文本标记语言格式引用由于额外的超文本标记语言标记占据了标记,因此包含的文档较少,精确匹配得分较低。在这种情况下,超文本标记语言的表现与纯文本相当,甚至更好。这显示了超文本标记语言丰富的结构信息的积极作用。

8B似乎更好?

表2中的实验是在长上下文环境中进行的,其中长引用带来了大量噪音。我们检查了一些例子,其中Llama-3.1-8B战胜Llama-3.1-70B,骆驼-3.1-70B似乎被这些噪音分散了注意力。我们认为这也证明了进行超文本标记语言修剪的必要性。

HtmlRAG值得吗?

只要知识源是超文本标记语言格式或PDF等其他丰富格式,超文本标记语言清理和修剪过程就是值得的。目前,像LangChain和LlamaIndex这样的主要RAG框架共享以下工作流程:检索超文本标记语言->转换为纯文本->细化->生成答案。我们认为,上述工作流程的上限是有限的,因为在早期的超文本标记语言到纯文本转换期间丢失了大量信息。我们提出的工作流程是这样的:检索超文本标记语言->清理和修剪->转换为其他格式(可选)->生成答案。即使LLM更喜欢其他输入格式或您想保存标记,从超文本标记语言到其他格式的转换也是可选的,建议在超文本标记语言清理和修剪之后进行。该工作流具有较高的上限,因为剪枝是在格式转换的信息丢失之前进行的。

五、开源工具包应用实践

HtmlRAG是一个可以应用于自有RAG系统的工具包,以下是其使用方法。

参考文档

https://github.com/plageon/HtmlRAG/blob/main/toolkit/README_zh.md

1、安装

a)使用pip安装:pip install htmlrag。

b)从源代码安装:克隆仓库git clone https://github.com/plageon/HtmlRAG.git,进入目录cd HtmlRAG,然后运行pip install -e.。

2、HTML清理

a)导入clean_html函数:from htmlrag import clean_html。

b)提供HTML内容(可以是字符串形式的HTML代码,或者读取多个HTML文件并合并)。

c)调用clean_html函数进行清理,例如:simplified_html = clean_html(html)。

3、配置剪枝参数(可选)

根据需求调整以下参数(这些参数用于处理较长和复杂的HTML文档):

a)MAX_NODE_WORDS_EMBED:使用嵌入模型构建剪枝块树时节点的最大单词数,示例中默认值为10,推荐值为256;

b)MAX_CONTEXT_WINDOW_EMBED:使用嵌入模型剪枝后的输出HTML文档的最大令牌数,示例中默认值为60,推荐值为6144;

c)MAX_NODE_WORDS_GEN:使用生成模型构建剪枝块树时节点的最大单词数,示例中默认值为5,推荐值为128;

d)MAX_CONTEXT_WINDOW_GEN:使用生成模型剪枝后的输出HTML文档的最大令牌数,示例中默认值为32,推荐值为4096。

4、构建块树

a)导入build_block_tree函数:from htmlrag import build_block_tree。

b)调用build_block_tree函数,传入清理后的HTML和最大节点单词数等参数,例如:block_tree, simplified_html = build_block_tree(simplified_html, max_node_words=MAX_NODE_WORDS_EMBED)(如果处理中文文本,可以添加zh_char=True参数)。

5、使用嵌入模型剪枝HTML块

a)导入EmbedHTMLPruner和BM25HTMLPruner(可选,用于对比)。

b)初始化EmbedHTMLPruner,指定嵌入模型路径、本地推理等参数,例如:embed_html_pruner = EmbedHTMLPruner(embed_model="BAAI/bge-large-en", local_inference=True, query_instruction_for_retrieval = query_instruction_for_retrieval)(也可以使用远程TEI模型,参考相关文档进行初始化)。

c)计算块排名:block_rankings=embed_html_pruner.calculate_block_rankings(question, simplified_html, block_tree)(也可以使用BM25HTMLPruner计算块排名,对比效果)。

d)进行HTML剪枝:pruned_html = embed_html_pruner.prune_HTML(simplified_html, block_tree, block_rankings, chat_tokenizer, MAX_CONTEXT_WINDOW_EMBED)。

6、使用生成模型剪枝HTML块(可选)

a)导入GenHTMLPruner。

b)构建更精细的块树(如果需要):block_tree, pruned_html=build_block_tree(pruned_html, max_node_words=MAX_NODE_WORDS_GEN)(处理中文文本可添加zh_char=True参数)。

c)初始化GenHTMLPruner,指定生成模型路径、设备等参数,例如:ckpt_path = "zstanjj/HTML-Pruner-Llama-1B",如果torch.cuda.is_available()则device="cuda",否则device="cpu",然后gen_embed_pruner = GenHTMLPruner(gen_model=ckpt_path, max_node_words=MAX_NODE_WORDS_GEN, device=device)。

d)计算块排名:block_rankings = gen_embed_pruner.calculate_block_rankings(question, pruned_html)。

e)进行HTML剪枝:pruned_html = gen_embed_pruner.prune_HTML(pruned_html, block_tree, block_rankings, chat_tokenizer, MAX_CONTEXT_WINDOW_GEN)。

论文作者:谭杰骏、窦志成、王文、王蟒、陈炜鹏、文继荣

【论文链接】

https://arxiv.org/pdf/2411.02959

转载请注明出处或者链接地址:https://www.qianduange.cn//article/22770.html
标签
评论
发布的文章

Lua与Unity交互

2025-03-08 14:03:36

Pygame介绍与游戏开发

2025-03-08 14:03:36

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!