Allgemeine Einführung
HtmlRAG ist ein innovatives Open-Source-Projekt, das sich auf die Verbesserung der Abfrage von Enhanced Generation (RAG) Ansatz zur Verarbeitung von HTML-Dokumenten im System. Das Projekt präsentiert einen neuartigen Ansatz, der argumentiert, dass die Verwendung von HTML-Formatierung in RAG-Systemen effizienter ist als reiner Text. Das Projekt umfasst einen kompletten Datenverarbeitungsablauf, vom Rewriting von Anfragen über das Crawling von HTML-Dokumenten bis hin zu einem Bewertungssystem für die Generierung von Antworten. Es unterstützt die Verarbeitung mehrerer gängiger Datensätze, einschließlich ASQA, HotpotQA, NQ usw., und bietet detaillierte Bewertungsmetriken zur Messung der Systemleistung. Das Projekt stellt nicht nur eine Quellcode-Implementierung zur Verfügung, sondern umfasst auch vorverarbeitete Datensätze und Bewertungswerkzeuge, die es Forschern ermöglichen, die Ergebnisse leicht zu reproduzieren und weitere Verbesserungen vorzunehmen.
Adresse des Papiers: https://arxiv.org/pdf/2411.02959
-
Nicht-destruktive HTML-BereinigungDieser Bereinigungsprozess entfernt nur völlig irrelevante Inhalte und komprimiert redundante Strukturen, wobei alle semantischen Informationen im ursprünglichen HTML erhalten bleiben. Verlustfrei bereinigtes, komprimiertes HTML eignet sich für RAG-Systeme mit langen Kontext-LLMs und einer geringen Bereitschaft, vor der Generierung Informationen zu verlieren. -
HTML-Beschneidung auf der Grundlage von zweistufigen BlockbäumenBlockbaum-basiertes HTML Pruning besteht aus zwei Schritten, die beide an der Blockbaumstruktur durchgeführt werden.Im ersten Schritt wird das Einbettungsmodell verwendet, um die Punktzahlen für Blöcke zu berechnenaber (nicht)Der zweite Schritt verwendet den Pfad, um das Modell zu erstellen. Der erste Schritt befasst sich mit den Ergebnissen der verlustfreien HTML-Bereinigung, während der zweite Schritt die Ergebnisse des ersten Bereinigungsschritts behandelt.
Beispielbefehl:
**HTML**: "{HTML}" **Frage**: **{Frage}** Ihre Aufgabe ist es, das Textfragment aus dem HTML-Dokument zu identifizieren, das für die gestellte Frage am relevantesten ist. Das Textfragment kann eine direkte Paraphrase eines Sachverhalts sein oder als Beleg für die Schlussfolgerung dieses Sachverhalts dienen. Die Gesamtlänge des Textfragments sollte mehr als 20 Wörter und weniger als 300 Wörter betragen. Sie müssen den Pfad zu dem Textfragment in dem HTML-Dokument angeben. Beispiel für die Ausgabe: <html1><body><div2><p>Einige Kernaussagen... Ausgabe. <html1><body><div2><p>Shinsuke Nakamura gewann die Men's Battle Royal bei der historischen Battle Royal 2018 . . .
Funktionsliste
- Abfrageverarbeitungs- und Umschreibungsfunktionen zur Unterstützung der Zerlegung komplexer Probleme in Teilabfragen
- System zum Durchsuchen und Verarbeiten von HTML-Dokumenten, das Informationen über die Dokumentstruktur bewahrt
- Unterstützung mehrerer Datensätze (ASQA, HotpotQA, NQ, TriviaQA, MuSiQue, ELI5)
- Vollständiger Bewertungsrahmen mit mehreren Dimensionen, einschließlich Korrektheit der Antworten, Relevanz usw.
- Unterstützung für die Verarbeitung benutzerdefinierter Datensätze, damit die Benutzer mit ihren eigenen Daten arbeiten können
- Integrierte Bing-Suchfunktion zum Auffinden relevanter Webseiten
- Bereitstellung eines detaillierten Bewertungssystems, einschließlich einer Vielzahl von Bewertungsindikatoren wie ROUGE-Bewertungen
- Unterstützt die Integration mit dem LangChain-Framework
- Werkzeuge zur Visualisierung und Analyse der Ergebnisse
Hilfe verwenden
1. ökologische Konfiguration
Zunächst müssen Sie das Projekt-Repository klonen und die erforderlichen Abhängigkeiten installieren:
git clone https://github.com/plageon/HtmlRAG
cd HtmlRAG
pip install -r anforderungen.txt
2. die Vorbereitung des Datensatzes
Das Projekt unterstützt zwei Arten der Datennutzung:
- Verwenden Sie einen vorverarbeiteten Datensatz:
- Der Datensatz wird im Ordner html_data gespeichert
- Der vollständige Testdatensatz kann von huggingface heruntergeladen werden: HtmlRAG-test
- Zu den unterstützten Datensatzformaten gehören ASQA, HotpotQA, NQ, usw.
- Verwenden Sie benutzerdefinierte Daten:
- Bereiten Sie die Abfragedatei im .jsonl-Format vor, wobei jede Zeile die folgenden Felder enthält:
{ "id": "unique_id", "frage": "query_text", "answers": ["answer_text_1", "answer_text_2"] }
- Bereiten Sie die Abfragedatei im .jsonl-Format vor, wobei jede Zeile die folgenden Felder enthält:
3. der Ablauf der Hauptfunktionen
Anfragebearbeitung
- Abfrage umschreiben:
- Das System unterteilt komplexe Fragen automatisch in mehrere Unterabfragen
- Das Rewrite-Ergebnis wird im Feld rewrite_method_result des json-Objekts gespeichert
Verarbeitung von HTML-Dokumenten
- Page Crawl:
- Das System verwendet Bing für die Suche nach relevanten URLs
- Automatisches Crawlen von statischen HTML-Dokumenten
- Informationen über die HTML-Struktur des Dokuments aufbewahren
Bewertungssysteme
- Bewerten Sie Indikatorenkonfigurationen:
- Bewertung der Korrektheit der Antworten
- Bewertung der Relevanz der Antworten
- Berechnung der ROUGE-Punktzahl
- Benutzerdefinierte Einstellungen für Bewertungsindikatoren
- Einsatz von Bewertungsinstrumenten:
from ragas.metrics import AnswerRelevancy
from langchain.embeddings import HuggingFaceEmbeddings
# Initialisieren Sie den Evaluator
Einbettungen = HuggingFaceEmbeddings('BAAI/bge-base-de')
answer_relevancy = AnswerRelevancy(embeddings=embeddings)
# lädt das Modell
antwort_relevanz.init_model()
# Ausführen der Auswertung
results = answer_relevancy.score(dataset)
4. die Analyse und Optimierung der Ergebnisse
- Analysieren Sie die Ergebnisse der Bewertung mit Hilfe der bereitgestellten Visualisierungstools
- Anpassung der Systemparameter auf der Grundlage von Bewertungsindikatoren
- Optimierung von Strategien zum Umschreiben von Abfragen und Methoden zur Verarbeitung von Dokumenten
5. vorsichtsmaßnahmen
- Sicherstellen, dass genügend Speicherplatz für die Verarbeitung von HTML-Daten vorhanden ist
- Einhaltung von API-Nutzungsbeschränkungen und Tarifbeschränkungen
- Regelmäßige Aktualisierung der Abhängigkeitspakete auf die neuesten Funktionen
- Achten Sie auf die Korrektheit des Datenformats
- GPUs werden empfohlen, um die Verarbeitung großer Datenmengen zu beschleunigen
Hinweise zum Bereinigen von HTML-Dokumenten
HTML-Bereinigungsregeln (Clean Patterns)
def clean_html(html: str) -> str. # 1. parsen von HTML mit BeautifulSoup soup = bs4.BeautifulSoup(html, 'html.parser') # 2. simplify_html aufrufen, um es zu vereinfachen html = simplify_html(soup) # 3. clean_xml aufrufen, um das XML-Markup zu bereinigen html = clean_xml(html) Rückgabe html
1. mit HTML-Dokumenten verknüpfte Wörter (der folgende Inhalt ist nicht der Projektcode)
# HTML-Reinigungsaufforderung Wörter
CLEAN_HTML_PROMPT = """
Aufgabe: HTML-Dokument bereinigen, um gültige Informationen beizubehalten
Eingabe: Original-HTML-Dokument
Anforderungen:
1. entfernen.
- JavaScript-Code (<script>标签)
- CSS样式信息 (<style>标签)
- HTML注释
- 空白标签
- 多余属性
2. 保留:
- 主要内容标签(<title>, <p>, <div>, <h1>-<h6>, usw.)
- Inhalt des Textes
- Strukturelle Beziehungen
Ausgabe: bereinigter HTML-Text
"""
# HTML Chunking Aufforderung Wörter
HTML_BLOCK_PROMPT = """
Aufgabe: HTML-Dokument in semantisch vollständige Blöcke aufteilen
Eingabe:
- Bereinigtes HTML-Dokument
- Maximale Blockgröße: {max_words} Wörter
Anforderungen:
1. Beibehaltung der hierarchischen Struktur der HTML-Tags
2. Sicherstellung der semantischen Integrität der einzelnen Blöcke
3. Aufzeichnung des hierarchischen Pfades des Blocks
4. Kontrolle, dass die Größe eines jeden Blocks die Grenze nicht überschreitet
Ausgabe: Liste der Blöcke im JSON-Format, die Folgendes enthält.
{
"Blöcke": [
{
"Inhalt": "Blockinhalt",
"Pfad": "HTML-Pfad",
"depth": "Hierarchietiefe"
}
]
}
"""
2. die Stichworte zur Konstruktion des Blockbaums
# Blockbaumknoten Bewertungsaufforderung Wort
BLOCK_SCORING_PROMPT = """
AUFGABE: Bewerten Sie die Relevanz des HTML-Blocks für die Frage
Eingabe:
- Frage: {Frage}
- HTML-Block: {block_content}
- Blockpfad: {block_path}
Anforderungen:
1. Berechne den semantischen Relevanzwert (0-1)
2. Berücksichtigen Sie die folgenden Faktoren:
- Textähnlichkeit
- Strukturelle Bedeutung
- kontextuelle Relevanz
Ausgabe:
{
"score": Float, # Relevanz-Score
"Grund": "Grund für die Bewertung"
}
"""
# Block Baumbeschneidung Wort
TREE_PRUNING_PROMPT = """
Aufgabe: Entscheidung, ob der HTML-Block beibehalten werden soll
Eingabe:
- {Frage}
- Aktueller Block: {current_block}
- Übergeordneter Block: {parent_block}
- Liste der untergeordneten Blöcke: {child_blocks}
Anforderungen:
1. Analysieren Sie die Bedeutung des Blocks:
- Relevanz für das Problem
- Rolle in der Dokumentstruktur
- Beziehung zu übergeordneten und untergeordneten Blöcken
2. Entscheidungen zur Aufbewahrung/Löschung generieren
Ausgabe:
{
"Aktion": "behalten/entfernen",
"Konfidenz": Float, # Konfidenzniveau der Entscheidung
"reason": "Grund für die Entscheidung"
}
"""
3) Begriffe aus dem Bereich der Wissensabfrage
# Wort zur Aufforderung zur Relevanzberechnung
RELEVANT_PROMPT = """
AUFGABE: Berechnen der Relevanz eines Dokumentfragments für eine Frage
Eingabe:
- Frage: {Frage}
- Dokumentfragment: {text_chunk}
Bewertungskriterien:
1. direkte Relevanz: das Ausmaß, in dem der Inhalt die Frage direkt beantwortet
2. indirekte Relevanz: das Ausmaß, in dem der Inhalt Kontext oder zusätzliche Informationen liefert. 3.
3. Vollständigkeit der Information: ob die Antwort vollständig ist
Ausgabe:
{
"relevance_score": float, # Relevanzwert 0-1
"reason": "Grund für die Wertung".
"key_matches": ["key match 1", "key match 2", ...]
}
"""
# Antwortgenerierung Aufforderungswörter
ANSWER_GENERATION_PROMPT = """
AUFGABE: Generieren einer Antwort auf der Grundlage eines relevanten Dokuments
Eingabe:
- Benutzerfrage: {question}
- Verwandte Dokumente: {relevant_docs}
- Dokument-Bewertungen: {doc_scores}
Anforderungen:
1. Synthese von Informationen aus hochrelevanten Dokumenten
2. die Genauigkeit der Antworten beibehalten
3. sicherstellen, dass die Antworten vollständig und kohärent sind
4. zitiere Quellen wo nötig
Ausgabeformat:
{
"answer": "Generated answer", "sources": ["Documentation sources used"], ["Sources used"], {
"sources": ["Sources of documents used"], { "confidence": float # Answer confidence.
"confidence": float # Antwortkonfidenz
}
"""
4. die Bewertung der relevanten Prompts
# Antwort Bewertungsaufforderung Wörter
EVALUATION_PROMPT = """
TASK: Bewerten Sie die Qualität der generierten Antworten
Eingabe:
- Ursprüngliche Frage: {question}
- Generierte Antwort: {generated_answer}
- Referenzantwort: {reference_answer}
Bewertungsdimensionen:
1. Korrektheit: ob die Informationen korrekt sind
2. die Vollständigkeit: ob die Frage vollständig beantwortet ist
3. die Relevanz: wie relevant der Inhalt für die Frage ist
4. Kohärenz: ob die Darstellung klar und kohärent ist
Ausgabe:
{
"Punkte": {
"Korrektheit": float, "Vollständigkeit": float, {
"Vollständigkeit": float, "Relevanz": float, "Kohärenz": {
"Relevanz": Float, { "Kohärenz": Float
"kohärenz": float
}, "feedback": "Detaillierte Kommentare".
"feedback": "Detaillierte Bewertungskommentare"
}
"""
# Fehleranalyse Aufforderungswörter
ERROR_ANALYSIS_PROMPT = """
Aufgabe: Analysieren Sie mögliche Fehler in Antworten
Eingabe:
- Antwort generieren: {answer}
- Referenz: {reference_docs}
Analysieren Sie die wichtigsten Punkte:
1. Überprüfung der sachlichen Richtigkeit
2. Überprüfung der logischen Argumentation
3. Überprüfung der Quelle
Ausgabe:
{
"Fehler": [
{
"type": "Fehlertyp",
"description": "Beschreibung des Fehlers", "correction".
"correction": "Vorgeschlagene Korrektur"
}
], "reliability_score".
"reliability_score": Float # Reliability Score
}
"""