はじめに
HtmlRAGは革新的なオープンソースプロジェクトで、拡張世代(ラグ)システムにおけるHTML文書処理へのアプローチ。このプロジェクトは、RAGシステムにおいてHTMLフォーマットの使用がプレーンテキストよりも効率的であることを主張する新しいアプローチを提示する。このプロジェクトは、クエリの書き換えからHTML文書のクロール、回答生成のための評価システムまで、完全なデータ処理フローを包含している。ASQA、HotpotQA、NQなど、いくつかの主流データセットの処理をサポートし、システムの性能を測定するための詳細な評価指標を提供する。このプロジェクトはソースコードの実装を提供するだけでなく、処理済みのデータセットと評価ツールも含んでおり、研究者は簡単に結果を再現し、さらなる改良を加えることができる。
論文アドレス:https://arxiv.org/pdf/2411.02959
RAGシステムにおける外部知識のフォーマットとして、プレーンテキストではなくHTMLを使用するHtmlRAGを提案する。HTMLによってもたらされる長い文脈に対処するために、可逆HTMLクリーンアップと2段階ブロックツリー・ベースのHTML刈り込みを提案する。
-
非破壊的HTMLクリーンアップこのクリーンアップ処理では、完全に無関係なコンテンツのみを削除し、冗長な構造を圧縮することで、元のHTMLのすべての意味情報を保持します。ロスレスHTMLクリーンアップ圧縮HTMLは、長いコンテキストのLLMを持ち、生成前に情報を失いたくないRAGシステムに適しています。 -
2段階のブロックツリーに基づくHTMLプルーニングブロック・ツリー・ベースのHTMLプルーニングは、ブロック・ツリー構造に対して実行される2つのステップから構成されます。最初のプルーニングステップでは、埋め込みモデルを用いてブロックのスコアを計算するでも第二段階は、パスを用いてモデルを生成する。.最初のステップはロスレスHTMLクリーンアップの結果を扱い、2番目のステップは最初のプルーニングステップの結果を扱う。
ブロックスコアの計算。ブロックツリーはスプリッターによってトークンツリーに変換され、対応するHTMLタグとトークンは同じ色でマークされる。トークンの生成確率は右上に表示され、破線枠内のトークンは推論を必要としない。ブロックツリーの右上にはブロックの確率が示されており、確率は対応するトークンの確率から導き出される。
コマンドの例:
**HTML**: “{HTML}” **问题**: **{Question}** 您的任务是从 HTML 文档中识别与给定问题最相关的文本片段。该文本片段可以是对事实的直接释义,或可用作推断该事实的支持性证据。 文本片段的整体长度应超过 20 个单词且少于 300 个单词。您需要提供该文本片段在 HTML 文档中的路径。 输出示例为: <html1><body><div2><p>一些关键信息... 输出: <html1><body><div2><p>在历史性的 2018 年皇家大战中,Shinsuke Nakamura 赢得了男子皇家大战. . .
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.データセットの準備
このプロジェクトは、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クリーニングルール(クリーンパターン)
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 # 可信度评分
}
"""