Introdução geral
O HtmlRAG é um projeto inovador de código aberto focado em aprimorar a recuperação de geração aprimorada (RAG) para o processamento de documentos HTML no sistema. O projeto apresenta uma nova abordagem que argumenta que o uso da formatação HTML em sistemas RAG é mais eficiente do que o texto simples. O projeto abrange um fluxo completo de processamento de dados, desde a reescrita de consultas até o rastreamento de documentos HTML e um sistema de avaliação para geração de respostas. Ele é compatível com o processamento de vários conjuntos de dados convencionais, incluindo ASQA, HotpotQA, NQ etc., e fornece métricas de avaliação detalhadas para medir o desempenho do sistema. O projeto não apenas fornece uma implementação de código-fonte, mas também inclui conjuntos de dados pré-processados e ferramentas de avaliação, permitindo que os pesquisadores reproduzam facilmente os resultados e façam melhorias adicionais.
Endereço para correspondência: https://arxiv.org/pdf/2411.02959
-
Limpeza não destrutiva de HTMLEsse processo de limpeza remove apenas o conteúdo completamente irrelevante e comprime as estruturas redundantes, preservando todas as informações semânticas do HTML original. O HTML compactado com limpeza de HTML sem perdas é adequado para sistemas RAG com LLMs de contexto longo e uma falta de vontade de perder qualquer informação antes da geração. -
Poda de HTML baseada em árvores de blocos de duas etapasA poda de HTML baseada em árvore de blocos consiste em duas etapas, ambas executadas na estrutura da árvore de blocos.A primeira etapa de poda usa o modelo de incorporação para calcular as pontuações dos blocosmas (não)A segunda etapa usa o caminho para gerar o modelo. A primeira etapa lida com os resultados da limpeza de HTML sem perdas, enquanto a segunda etapa lida com os resultados da primeira etapa de poda.
Exemplo de comando:
**HTML**: "{HTML}" **Question**: **{Question}** Sua tarefa é identificar o fragmento de texto do documento HTML que seja mais relevante para a pergunta dada. O fragmento de texto pode ser uma paráfrase direta de um fato ou pode ser usado como evidência de apoio para inferir esse fato. O comprimento total do fragmento de texto deve ter mais de 20 palavras e menos de 300 palavras. Você precisa fornecer o caminho para o fragmento de texto no documento HTML. Exemplo de saída: <html1><body><div2><p>Algumas mensagens importantes... Saída. <html1><body><div2><p>Shinsuke Nakamura venceu a Battle Royal masculina na histórica Battle Royal de 2018. . .
Lista de funções
- Funcionalidade de processamento e reescrita de consultas para dar suporte à decomposição de problemas complexos em subconsultas
- Sistema de processamento e rastreamento de documentos HTML, com retenção de informações sobre a estrutura do documento
- Suporte a vários conjuntos de dados (ASQA, HotpotQA, NQ, TriviaQA, MuSiQue, ELI5)
- Estrutura de avaliação completa com várias dimensões, incluindo correção de respostas, relevância, etc.
- Suporte ao processamento de conjuntos de dados personalizados, permitindo que os usuários usem seus próprios dados
- Função de pesquisa integrada do Bing para recuperar páginas da Web relevantes
- Fornecer um sistema de pontuação detalhado com várias métricas de avaliação, incluindo a pontuação ROUGE
- Oferece suporte à integração com a estrutura LangChain
- Ferramentas de visualização e análise de resultados
Usando a Ajuda
1. configuração ambiental
Primeiro, você precisa clonar o repositório do projeto e instalar as dependências necessárias:
git clone https://github.com/plageon/HtmlRAG
cd HtmlRAG
pip install -r requirements.txt
2. preparação do conjunto de dados
O projeto oferece suporte a duas maneiras de usar os dados:
- Use um conjunto de dados pré-processado:
- O conjunto de dados é armazenado na pasta html_data
- O conjunto completo de dados de teste pode ser baixado de huggingface: HtmlRAG-test
- Os formatos de conjunto de dados compatíveis incluem ASQA, HotpotQA, NQ, etc.
- Use dados personalizados:
- Prepare o arquivo de consulta no formato .jsonl com cada linha contendo os seguintes campos:
{ "id": "unique_id", "pergunta": "texto_da_consulta", "answers": ["answer_text_1", "answer_text_2"] }
- Prepare o arquivo de consulta no formato .jsonl com cada linha contendo os seguintes campos:
3. fluxo das principais funções
processamento de consultas
- Reescrita de consulta:
- O sistema divide automaticamente as perguntas complexas em várias subconsultas
- O resultado da reescrita é armazenado no campo rewrite_method_result do objeto json
Processamento de documentos HTML
- Rastreamento de páginas:
- O sistema usa o Bing para pesquisar URLs relevantes
- Rastreamento automático de documentos HTML estáticos
- Manter informações sobre a estrutura HTML do documento
Sistemas de avaliação
- Avaliar as configurações dos indicadores:
- Avaliação da exatidão das respostas
- Avaliação da relevância da resposta
- Cálculo da pontuação ROUGE
- Configurações personalizadas do indicador de avaliação
- Uso de ferramentas de avaliação:
from ragas.metrics import AnswerRelevancy
from langchain.embeddings import HuggingFaceEmbeddings
# Inicializar o avaliador
embeddings = HuggingFaceEmbeddings('BAAI/bge-base-en')
answer_relevancy = AnswerRelevancy(embeddings=embeddings)
# carregando o modelo
answer_relevancy.init_model()
# Executar a avaliação
resultados = answer_relevancy.score(dataset)
4. análise e otimização dos resultados
- Analisar os resultados da avaliação usando as ferramentas de visualização fornecidas
- Ajuste dos parâmetros do sistema com base nos indicadores de avaliação
- Otimização de estratégias de reescrita de consultas e métodos de processamento de documentos
5 Cuidados
- Garantir espaço de armazenamento suficiente para lidar com dados HTML
- Conformidade com limites de uso de API e limites de taxa
- Atualize regularmente os pacotes de dependência para obter os recursos mais recentes
- Preste atenção à exatidão do formato dos dados
- As GPUs são recomendadas para acelerar o processamento de dados em grande escala
Nota de referência sobre limpeza de documentos HTML
Regras de limpeza de HTML (Clean Patterns)
def clean_html(html: str) -> str. # 1. analisando HTML com BeautifulSoup soup = bs4.BeautifulSoup(html, 'html.parser') # 2 Chame simplify_html para simplificá-lo html = simplify_html(soup) # 3. chame clean_xml para limpar a marcação XML html = clean_xml(html) retornar html
1. palavras-chave relacionadas ao processamento de documentos HTML (o conteúdo a seguir não é o código do projeto)
Palavras do prompt de limpeza de HTML do #
CLEAN_HTML_PROMPT = """
Tarefa: limpar o documento HTML para manter as informações válidas
Entrada: documento HTML original
Requisitos:
1. remover.
- Código JavaScript (<script>标签)
- CSS样式信息 (<style>标签)
- HTML注释
- 空白标签
- 多余属性
2. 保留:
- 主要内容标签(<title>, <p>, <div>, <h1>-<h6>, etc.)
- Conteúdo do texto
- Relações estruturais
Saída: texto HTML limpo
"""
Palavras do prompt de fragmentação de HTML do #
HTML_BLOCK_PROMPT = """
Tarefa: dividir o documento HTML em blocos semanticamente completos
Entrada:
- Documento HTML limpo
- Tamanho máximo do bloco: {max_words} palavras
Requisitos:
1. manter a estrutura hierárquica das tags HTML
2. garantir a integridade semântica de cada bloco
3. registrar o caminho hierárquico do bloco
4. controlar o tamanho de cada bloco para que não exceda o limite
Saída: lista de blocos no formato JSON contendo.
{
"blocks": [
{
"conteúdo": "conteúdo do bloco",
"caminho": "caminho HTML",
"depth" (profundidade): "Hierarchical depth" (profundidade hierárquica)
}
]
}
"""
2. palavras-chave relacionadas à construção da árvore de blocos
# Palavra do prompt de pontuação do nó da árvore de blocos
BLOCK_SCORING_PROMPT = """
TAREFA: Avaliar a relevância do bloco HTML para a pergunta
Entrada:
- Pergunta: {question}
- Bloco HTML: {block_content}
- Caminho do bloco: {block_path}
Requisitos:
1. calcular a pontuação de relevância semântica (0-1)
2. considerar os seguintes fatores:
- Similaridade de texto
- Importância estrutural
- Relevância contextual
Saída:
{
"score": flutuante, pontuação de relevância #
"reason": "motivo da pontuação"
}
"""
Palavra do prompt de poda da árvore de blocos #
TREE_PRUNING_PROMPT = """
Tarefa: decidir se o bloco HTML deve ser mantido
Entrada:
- {question}
- Bloco atual: {current_block}
- Bloco pai: {parent_block}
- Lista de blocos filhos: {child_blocks}
Requisitos:
1. Analisar a importância do bloco:
- Relevância para o problema
- Função na estrutura do documento
- Relacionamento com os blocos pai e filho
2. gerar decisões de retenção/exclusão
Saída:
{
"ação": "manter/remover",
"confidence": float, nível de confiança da decisão #
"reason": "motivo da decisão"
}
"""
3. termos relacionados à recuperação de conhecimento
# Palavra de solicitação de cálculo de relevância
RELEVANCE_PROMPT = """
TAREFA: Calcular a relevância de um fragmento de documento para uma pergunta
Entrada:
- Pergunta: {question}
- Fragmento de documento: {text_chunk}
Critérios de avaliação:
1. relevância direta: a extensão em que o conteúdo responde diretamente à pergunta
2. relevância indireta: até que ponto ele fornece contexto ou informações adicionais. 3.
3. Integralidade das informações: se a resposta está completa
Saída:
{
"relevance_score": float, # Pontuação de relevância 0-1
"reason": "Motivo da pontuação".
"key_matches": ["key match 1", "key match 2", ...]
}
"""
# Answer Generation Prompt Words (Palavras do prompt de geração de respostas)
ANSWER_GENERATION_PROMPT = """
TAREFA: gerar uma resposta com base em um documento relevante
Entrada:
- Pergunta do usuário: {question}
- Documentos relacionados: {relevant_docs}
- Pontuação do documento: {doc_scores}
Requisitos:
1. sintetizar informações de documentos altamente relevantes
2. manter a precisão das respostas
3. garantir que as respostas sejam completas e coerentes
4. citar fontes quando necessário
Formato de saída:
{
"answer": "Generated answer", "sources": ["Documentation sources used"], ["Sources used"], {
"sources": ["Sources of documents used"], { "confidence": float # Confiança da resposta.
"confidence": nível de confiança da resposta #
}
"""
4. avaliação de prompts relevantes
# Responder ao prompt de avaliação de palavras
EVALUATION_PROMPT = """
TAREFA: Avaliar a qualidade das respostas geradas
Entrada:
- Pergunta original: {question}
- Resposta gerada: {generated_answer}
- Resposta de referência: {reference_answer}
Dimensões da avaliação:
1. exatidão: se as informações são precisas
2. completude: se a pergunta foi respondida por completo
3. relevância: o quanto o conteúdo é relevante para a pergunta
4. coerência: se a apresentação é clara e coerente
Saída:
{
"scores": {
"correção": ponto flutuante, "completude": ponto flutuante, {
"completude": ponto flutuante, "relevância": ponto flutuante, "coerência": {
"relevância": flutuante, { "coerência": flutuante
"coherence": float
}, "feedback": "Comentários detalhados".
"feedback": "Comentários detalhados da avaliação"
}
"""
Palavras do prompt de análise de erros do #
ERROR_ANALYSIS_PROMPT = """
Tarefa: analisar possíveis erros nas respostas
Entrada:
- Gerar resposta: {answer}
- Referência: {reference_docs}
Analisar os pontos principais:
1. verificação da precisão dos fatos
2. verificação do raciocínio lógico
3. verificação da fonte
Output:
{
"errors": [
{
"type": "Tipo de erro",
"description": "Descrição do erro", "correction".
"correction": "Correção sugerida"
}
], "reliability_score".
"reliability_score": pontuação de confiabilidade flutuante do #
}
"""