AI个人学习
和实操指南

HtmlRAG:构建高效HTML检索增强生成系统,优化RAG系统中的HTML文档检索与处理

综合介绍

HtmlRAG是一个创新的开源项目,专注于改进检索增强生成(RAG)系统中的HTML文档处理方法。该项目提出了一种新颖的方法,认为在RAG系统中使用HTML格式比纯文本更有效。项目包含了完整的数据处理流程,从查询重写到HTML文档抓取,再到答案生成的评估体系。它支持多个主流数据集的处理,包括ASQA、HotpotQA、NQ等,并提供了详细的评估指标来衡量系统性能。该项目不仅提供了源代码实现,还包括了预处理数据集和评估工具,使研究人员能够轻松复现结果并进行进一步的改进。

论文地址:https://arxiv.org/pdf/2411.02959


HtmlRAG:构建高效HTML检索增强生成系统,优化RAG系统中的HTML文档检索与处理-1

提出 HtmlRAG ,它使用HTML而不是纯文本作为RAG系统中外部知识的格式。为了应对HTML带来的长上下文,提出了无损HTML清理和基于两步块树的HTML修剪(Two-Step Block-Tree-Based)。

 

  • 无损HTML清理:这个清理过程仅移除完全不相关的内容,并压缩冗余结构,保留原始HTML中的所有语义信息。无损HTML清理压缩后的HTML适用于具有长上下文LLMs的RAG系统,并且不愿意在生成之前丢失任何信息。
  • 基于两步块树的HTML修剪:基于块树的HTML修剪包括两个步骤,这两个步骤都在块树结构上进行。第一步修剪使用嵌入模型为块计算分数,而第二步使用路径生成模型。第一步处理无损HTML清理的结果,而第二步处理第一步修剪的结果。

 

HtmlRAG:构建高效HTML检索增强生成系统,优化RAG系统中的HTML文档检索与处理-1

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

 

指令示例:

**HTML**: “{HTML}” 
**问题**: **{Question}**

您的任务是从 HTML 文档中识别与给定问题最相关的文本片段。该文本片段可以是对事实的直接释义,或可用作推断该事实的支持性证据。

文本片段的整体长度应超过 20 个单词且少于 300 个单词。您需要提供该文本片段在 HTML 文档中的路径。

输出示例为: 
<html1><body><div2><p>一些关键信息...

输出: 
<html1><body><div2><p>在历史性的 2018 年皇家大战中,Shinsuke Nakamura 赢得了男子皇家大战. . .

 

 

HtmlRAG:构建高效HTML检索增强生成系统,优化RAG系统中的HTML文档检索与处理-1

HTML转换为纯文本时的信息丢失

 

功能列表

  • 查询处理和重写功能,支持将复杂问题分解为子查询
  • HTML文档抓取和处理系统,保留文档结构信息
  • 多数据集支持(ASQA、HotpotQA、NQ、TriviaQA、MuSiQue、ELI5)
  • 完整的评估框架,包括答案正确性、相关性等多个维度
  • 自定义数据集处理支持,允许用户使用自己的数据
  • 集成Bing搜索功能,用于检索相关网页
  • 提供详细的评分系统,包括ROUGE评分等多种评估指标
  • 支持与LangChain框架的集成
  • 结果可视化和分析工具

 

使用帮助

1. 环境配置

首先需要克隆项目仓库并安装必要的依赖:

git clone https://github.com/plageon/HtmlRAG
cd HtmlRAG
pip install -r requirements.txt

2. 数据集准备

项目支持两种数据使用方式:

  1. 使用预处理好的数据集:
    • 数据集存储在html_data文件夹中
    • 可以从huggingface下载完整的测试数据集:HtmlRAG-test
    • 支持的数据集格式包括ASQA、HotpotQA、NQ等
  2. 使用自定义数据:
    • 准备.jsonl格式的查询文件,每行包含以下字段:
      {
      "id": "unique_id",
      "question": "query_text",
      "answers": ["answer_text_1", "answer_text_2"]
      }
      

3. 主要功能使用流程

查询处理

  1. 查询重写:
    • 系统会自动将复杂问题分解为多个子查询
    • 重写结果存储在json对象的rewrite_method_result字段中

HTML文档处理

  1. 网页抓取:
    • 系统使用Bing搜索获取相关URL
    • 自动抓取静态HTML文档
    • 保留文档的HTML结构信息

评估系统

  1. 评估指标配置:
    • 答案正确性评估
    • 答案相关性评估
    • ROUGE评分计算
    • 自定义评估指标设置
  2. 使用评估工具:
from ragas.metrics import AnswerRelevancy
from langchain.embeddings import HuggingFaceEmbeddings
# 初始化评估器
embeddings = HuggingFaceEmbeddings('BAAI/bge-base-en')
answer_relevancy = AnswerRelevancy(embeddings=embeddings)
# 加载模型
answer_relevancy.init_model()
# 运行评估
results = answer_relevancy.score(dataset)

4. 结果分析与优化

  • 使用提供的可视化工具分析评估结果
  • 根据评估指标调整系统参数
  • 优化查询重写策略和文档处理方法

5. 注意事项

  • 确保有足够的存储空间处理HTML数据
  • 遵循API使用限制和速率限制
  • 定期更新依赖包以获取最新功能
  • 注意数据格式的正确性
  • 建议使用GPU加速大规模数据处理

 

关于HTML文档清洗的参考说明

HTML清洗规则(Clean Patterns)

def clean_html(html: str) -> str:
# 1. 使用BeautifulSoup解析HTML
soup = bs4.BeautifulSoup(html, 'html.parser')

# 2. 调用simplify_html进行简化处理
html = simplify_html(soup)

# 3. 调用clean_xml清理XML标记
html = clean_xml(html)

return html

 

 

1. HTML文档处理相关提示词(以下内容非项目代码)

# HTML清洗提示词
CLEAN_HTML_PROMPT = """
任务:清洗HTML文档,保留有效信息
输入:原始HTML文档
要求:
1. 移除:
- JavaScript代码 (<script>标签)
- CSS样式信息 (<style>标签)
- HTML注释
- 空白标签
- 多余属性
2. 保留:
- 主要内容标签(<title>, <p>, <div>, <h1>-<h6>等)
- 文本内容
- 结构关系
输出:清洗后的HTML文本
"""
# HTML分块提示词
HTML_BLOCK_PROMPT = """
任务:将HTML文档分割成语义完整的块
输入:
- 清洗后的HTML文档
- 最大块大小:{max_words}词
要求:
1. 保持HTML标签的层级结构
2. 确保每个块的语义完整性
3. 记录块的层级路径
4. 控制每个块的大小不超过限制
输出:JSON格式的块列表,包含:
{
"blocks": [
{
"content": "块内容",
"path": "HTML路径",  
"depth": "层级深度"
}
]
}
"""

2. 块树构建相关提示词

# 块树节点评分提示词
BLOCK_SCORING_PROMPT = """
任务:评估HTML块与问题的相关性
输入:
- 问题:{question}
- HTML块:{block_content}
- 块路径:{block_path}
要求:
1. 计算语义相关性分数(0-1)
2. 考虑以下因素:
- 文本相似度
- 结构重要性
- 上下文关联
输出:
{
"score": float,  # 相关性分数
"reason": "评分理由"
}
"""
# 块树剪枝提示词
TREE_PRUNING_PROMPT = """
任务:决定是否保留HTML块
输入:
- 问题:{question}
- 当前块:{current_block}
- 父级块:{parent_block}
- 子块列表:{child_blocks}
要求:
1. 分析块的重要性:
- 与问题的相关性
- 在文档结构中的作用
- 与父子块的关系
2. 生成保留/删除决策
输出:
{
"action": "keep/remove",
"confidence": float,  # 决策置信度
"reason": "决策理由"
}
"""

3. 知识检索相关提示词

# 相关性计算提示词
RELEVANCE_PROMPT = """
任务:计算文档片段与问题的相关性
输入:
- 问题:{question}
- 文档片段:{text_chunk}
评估标准:
1. 直接相关性:内容直接回答问题的程度
2. 间接相关性:提供背景或补充信息的程度
3. 信息完整性:回答是否完整
输出:
{
"relevance_score": float,  # 相关性分数0-1
"reason": "评分理由",
"key_matches": ["关键匹配点1", "关键匹配点2", ...]
}
"""
# 答案生成提示词
ANSWER_GENERATION_PROMPT = """
任务:根据相关文档生成答案
输入:
- 用户问题:{question}
- 相关文档:{relevant_docs}
- 文档评分:{doc_scores}
要求:
1. 综合高相关性文档信息
2. 保持答案的准确性
3. 确保回答完整且连贯
4. 必要时标注信息来源
输出格式:
{
"answer": "生成的答案",
"sources": ["使用的文档来源"],
"confidence": float  # 答案置信度
}
"""

4. 评估相关提示词

# 答案评估提示词
EVALUATION_PROMPT = """
任务:评估生成答案的质量
输入:
- 原始问题:{question}
- 生成答案:{generated_answer}
- 参考答案:{reference_answer}
评估维度:
1. 正确性:信息是否准确
2. 完整性:是否完整回答问题
3. 相关性:内容与问题的相关程度
4. 连贯性:表述是否清晰连贯
输出:
{
"scores": {
"correctness": float,
"completeness": float,
"relevance": float,
"coherence": float
},
"feedback": "详细评估意见"
}
"""
# 错误分析提示词
ERROR_ANALYSIS_PROMPT = """
任务:分析答案中的潜在错误
输入:
- 生成答案:{answer}
- 参考资料:{reference_docs}
分析要点:
1. 事实准确性检查
2. 逻辑推理验证
3. 信息来源核实
输出:
{
"errors": [
{
"type": "错误类型",
"description": "错误描述",
"correction": "建议修正"
}
],
"reliability_score": float  # 可信度评分
}
"""
未经允许不得转载:首席AI分享圈 » HtmlRAG:构建高效HTML检索增强生成系统,优化RAG系统中的HTML文档检索与处理

首席AI分享圈

首席AI分享圈专注于人工智能学习,提供全面的AI学习内容、AI工具和实操指导。我们的目标是通过高质量的内容和实践经验分享,帮助用户掌握AI技术,一起挖掘AI的无限潜能。无论您是AI初学者还是资深专家,这里都是您获取知识、提升技能、实现创新的理想之地。

联系我们
zh_CN简体中文