综合介绍
HtmlRAG是一个创新的开源项目,专注于改进检索增强生成(RAG)系统中的HTML文档处理方法。该项目提出了一种新颖的方法,认为在RAG系统中使用HTML格式比纯文本更有效。项目包含了完整的数据处理流程,从查询重写到HTML文档抓取,再到答案生成的评估体系。它支持多个主流数据集的处理,包括ASQA、HotpotQA、NQ等,并提供了详细的评估指标来衡量系统性能。该项目不仅提供了源代码实现,还包括了预处理数据集和评估工具,使研究人员能够轻松复现结果并进行进一步的改进。
论文地址:https://arxiv.org/pdf/2411.02959
-
无损HTML清理:这个清理过程仅移除完全不相关的内容,并压缩冗余结构,保留原始HTML中的所有语义信息。无损HTML清理压缩后的HTML适用于具有长上下文LLMs的RAG系统,并且不愿意在生成之前丢失任何信息。 -
基于两步块树的HTML修剪:基于块树的HTML修剪包括两个步骤,这两个步骤都在块树结构上进行。第一步修剪使用嵌入模型为块计算分数,而第二步使用路径生成模型。第一步处理无损HTML清理的结果,而第二步处理第一步修剪的结果。
指令示例:
**HTML**: “{HTML}” **问题**: **{Question}** 您的任务是从 HTML 文档中识别与给定问题最相关的文本片段。该文本片段可以是对事实的直接释义,或可用作推断该事实的支持性证据。 文本片段的整体长度应超过 20 个单词且少于 300 个单词。您需要提供该文本片段在 HTML 文档中的路径。 输出示例为: <html1><body><div2><p>一些关键信息... 输出: <html1><body><div2><p>在历史性的 2018 年皇家大战中,Shinsuke Nakamura 赢得了男子皇家大战. . .
功能列表
- 查询处理和重写功能,支持将复杂问题分解为子查询
- 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. 数据集准备
项目支持两种数据使用方式:
- 使用预处理好的数据集:
- 数据集存储在html_data文件夹中
- 可以从huggingface下载完整的测试数据集:HtmlRAG-test
- 支持的数据集格式包括ASQA、HotpotQA、NQ等
- 使用自定义数据:
- 准备.jsonl格式的查询文件,每行包含以下字段:
{ "id": "unique_id", "question": "query_text", "answers": ["answer_text_1", "answer_text_2"] }
- 准备.jsonl格式的查询文件,每行包含以下字段:
3. 主要功能使用流程
查询处理
- 查询重写:
- 系统会自动将复杂问题分解为多个子查询
- 重写结果存储在json对象的rewrite_method_result字段中
HTML文档处理
- 网页抓取:
- 系统使用Bing搜索获取相关URL
- 自动抓取静态HTML文档
- 保留文档的HTML结构信息
评估系统
- 评估指标配置:
- 答案正确性评估
- 答案相关性评估
- ROUGE评分计算
- 自定义评估指标设置
- 使用评估工具:
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 # 可信度评分
}
"""