はじめに
HtmlRAGは革新的なオープンソースプロジェクトで、拡張世代(ラグ)システムにおけるHTML文書処理へのアプローチ。このプロジェクトは、RAGシステムにおいてHTMLフォーマットの使用がプレーンテキストよりも効率的であることを主張する新しいアプローチを提示する。このプロジェクトは、クエリの書き換えからHTML文書のクロール、回答生成のための評価システムまで、完全なデータ処理フローを包含している。ASQA、HotpotQA、NQなど、いくつかの主流データセットの処理をサポートし、システムの性能を測定するための詳細な評価指標を提供する。このプロジェクトはソースコードの実装を提供するだけでなく、処理済みのデータセットと評価ツールも含んでおり、研究者は簡単に結果を再現し、さらなる改良を加えることができる。
論文アドレス:https://arxiv.org/pdf/2411.02959
-
非破壊的HTMLクリーンアップこのクリーンアップ処理では、完全に無関係なコンテンツのみを削除し、冗長な構造を圧縮することで、元のHTMLのすべての意味情報を保持します。ロスレスHTMLクリーンアップ圧縮HTMLは、長いコンテキストのLLMを持ち、生成前に情報を失いたくないRAGシステムに適しています。 -
2段階のブロックツリーに基づくHTMLプルーニングブロック・ツリー・ベースのHTMLプルーニングは、ブロック・ツリー構造に対して実行される2つのステップから構成されます。最初のプルーニングステップでは、埋め込みモデルを用いてブロックのスコアを計算するでも第二段階は、パスを用いてモデルを生成する。.最初のステップはロスレスHTMLクリーンアップの結果を扱い、2番目のステップは最初のプルーニングステップの結果を扱う。
コマンドの例:
**html**: "{html}" **Question**: **{Question}** あなたの仕事は、与えられた問題に最も関連するHTML文書のテキスト断片を特定することです。テキストの断片は、事実を直接言い換えたものでも、その事実を推測するための裏付けとなるものでもかまいません。 文章全体の長さは20ワード以上300ワード未満とします。HTMLドキュメントにテキストフラグメントへのパスを記述する必要があります。 出力例 <html1><body><div2><p>重要なメッセージ アウトプット <html1><body><div2><p>歴史的な2018年のバトルロイヤルで、中村信介が男子バトルロイヤルを制した。 . .
機能一覧
- 複雑な問題のサブクエリへの分解をサポートするクエリ処理と書き換え機能
- 文書構造情報を保持した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"、 「答え": ["answer_text_1", "answer_text_2"]。 }
- 各行に以下のフィールドを含む.jsonl形式のクエリーファイルを用意する:
3.主な機能の流れ
クエリ処理
- クエリーの書き換え
- システムは自動的に複雑な質問を複数のサブクエリに分解します。
- 書き換え結果は、jsonオブジェクトのrewrite_method_resultフィールドに格納される。
HTML文書処理
- ページクロール:
- システムはBingを使って関連するURLを検索する。
- 静的HTMLドキュメントの自動クロール
- ドキュメントのHTML構造に関する情報を保持する
評価システム
- インジケータの構成を評価する:
- 解答の正しさの評価
- 回答の妥当性の評価
- ROUGEスコアの計算
- 評価指標のカスタマイズ設定
- 評価ツールの使用:
from ragas.metrics import 答えの関連性
from langchain.embeddings import HuggingFaceEmbeddings
# 評価器を初期化する
embeddings = HuggingFaceEmbeddings('BAAI/bge-base-ja')
answer_relevancy = AnswerRelevancy(embeddings=embeddings)
#モデルをロードする
answer_relevancy.init_model()
# 評価を実行
結果 = 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) 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ブロックを残すかどうかを決定する
入力
- 質問} 現在のブロック: {current_block
- 現在のブロック:{current_block}
- 親ブロック: {parent_block}
- 子ブロックのリスト: {child_blocks}
要件
1. ブロックの重要性を分析する:
- 問題との関連性
- 文書構造における役割
- 親ブロックや子ブロックとの関係
2.保持/削除の決定を生成する
出力:
{
"action": "keep/remove"、
"confidence": float, # 決定信頼度
"reason": "決定の理由"
}
"""
3.知識検索関連用語
# 関連性計算プロンプトワード
relevance_prompt = """
タスク: 質問に対する文書断片の関連性を計算する
入力
- 質問: {question}
- 文書断片:{text_chunk}
評価基準
1.直接的関連性:コンテンツが質問に直接答える度合い
2.間接的な関連性: コンテキストや追加情報を提供する程度 3.
3.情報の完全性:回答が完全かどうか
出力
{
"relevance_score": float, # 関連性スコア0-1
"reason": "スコア付けの理由".
"key_matches": ["キーマッチ1", "キーマッチ2", ...]。
}
"""
# 解答生成プロンプトの単語
answer_generation_prompt = """
TASK: 関連文書に基づいて答えを生成する
入力
- ユーザの質問: {question}
- 関連文書: {relevant_docs}
- ドキュメントのスコア: {doc_scores}
要件
1. 関連性の高い文書から情報を合成する
2. 回答の正確性を保つ
3. 回答が完全で首尾一貫していること
4. 必要に応じて出典を引用する
出力形式
{
"answer": "Generated answer", "sources": ["Documentation sources used"], ["Sources used"], {
"sources": ["Sources of documents used"], { "confidence": float # 答えの信頼度。
"confidence": float # 答えの信頼度。
}
"""
4.関連するプロンプトの評価
#回答評価プロンプトの言葉
評価プロンプト = """
タスク: 生成された回答の質を評価する
入力
- 元の質問: {question}
- 生成された答え: {generated_answer}
- 参照解答: {reference_answer}
評価の次元
1. 正しさ: 情報が正確かどうか
2.完全性:質問に完全に答えられているかどうか
3.関連性: 内容が質問にどれだけ関連しているか
4.首尾一貫性:プレゼンテーションが明確で首尾一貫しているかどうか
アウトプット
{
「スコア: {
「正しさ(correctness)": float, "完全性(completeness)": float, {
完全性": float、"関連性": float、"一貫性": { "関連性": float、{ "一貫性": float
"relevance": float, { "coherence": float
「一貫性": float
}, "feedback": "詳細コメント".
"フィードバック": "詳細な評価コメント"
}
"""
#エラー分析プロンプトの単語
error_analysis_prompt = """
タスク: 解答の潜在的なエラーを分析する
入力
- 回答の生成: {answer}
- 参照: {reference_docs}.
重要なポイントを分析する
1. 事実の正確さの確認
2. 論理的推論の検証
3.ソースの検証
アウトプット
{
"errors": [
{
"type": "エラーの種類"、
"description": "エラーの説明", "correction".
"correction": "修正案"
}
], "reliability_score".
"reliability_score": float # 信頼性スコア
}
"""