Quando se trata de processamento de linguagem natural (PNL) e recuperação de informações, a capacidade de recuperar informações relevantes com eficiência e precisão é fundamental. À medida que o campo continua a evoluir, novas técnicas e metodologias estão a ser desenvolvidas para melhorar o desempenho dos sistemas de recuperação, particularmente no contexto da Geração Aumentada de Recuperação (RAG). Uma dessas técnicas, conhecida como recuperação em dois estágios com reclassificadores, surgiu como uma solução poderosa para resolver as limitações inerentes aos métodos de recuperação tradicionais.
Neste artigo, discutimos as complexidades da recuperação em dois estágios e dos rerankers, explorando seus princípios subjacentes, estratégias de implementação e os benefícios que oferecem para aumentar a precisão e a eficiência dos sistemas RAG. Também forneceremos exemplos práticos e trechos de código para ilustrar os conceitos e facilitar uma compreensão mais aprofundada dessa técnica de ponta.
Compreendendo a geração aumentada de recuperação (RAG)
Antes de nos aprofundarmos nos detalhes da recuperação em dois estágios e dos rerankers, vamos revisitar brevemente o conceito de Geração Aumentada de Recuperação (RAG). RAG é uma técnica que amplia o conhecimento e as capacidades de modelos de linguagem de grande porte (LLMs), fornecendo-lhes acesso a fontes externas de informação, como bancos de dados ou coleções de documentos. Consulte mais informações no artigo “Um mergulho profundo na geração aumentada de recuperação em LLM".
O processo RAG típico envolve as seguintes etapas:
pergunta: um usuário faz uma pergunta ou fornece uma instrução ao sistema.
Recuperação: O sistema consulta um banco de dados vetorial ou uma coleção de documentos para encontrar informações relevantes à consulta do usuário.
aumentar: As informações recuperadas são combinadas com a consulta ou instrução original do usuário.
Generation: O modelo de linguagem processa a entrada aumentada e gera uma resposta, aproveitando as informações externas para aumentar a precisão e a abrangência de sua saída.
Embora o RAG tenha provado ser uma técnica poderosa, tem seus desafios. Uma das principais questões reside na fase de recuperação, onde os métodos tradicionais de recuperação podem não conseguir identificar os documentos mais relevantes, levando a respostas subótimas ou imprecisas do modelo de linguagem.
A necessidade de recuperação e reclassificação em dois estágios
Os métodos tradicionais de recuperação, como aqueles baseados em correspondência de palavras-chave ou modelos de espaço vetorial, muitas vezes têm dificuldade para capturar as relações semânticas diferenciadas entre consultas e documentos. Esta limitação pode resultar na recuperação de documentos que são apenas superficialmente relevantes ou que perdem informações cruciais que poderiam melhorar significativamente a qualidade da resposta gerada.
Para enfrentar esse desafio, pesquisadores e profissionais recorreram à recuperação em dois estágios com reclassificadores. Esta abordagem envolve um processo de duas etapas:
Recuperação Inicial: No primeiro estágio, um conjunto relativamente grande de documentos potencialmente relevantes é recuperado usando um método de recuperação rápido e eficiente, como um modelo de espaço vetorial ou uma pesquisa baseada em palavras-chave.
Reclassificação: Na segunda etapa, um modelo de reclassificação mais sofisticado é empregado para reordenar os documentos inicialmente recuperados com base na sua relevância para a consulta, trazendo efetivamente os documentos mais relevantes para o topo da lista.
O modelo de reclassificação, muitas vezes uma rede neural ou uma arquitetura baseada em transformador, é treinado especificamente para avaliar a relevância de um documento para uma determinada consulta. Ao aproveitar recursos avançados de compreensão de linguagem natural, o reclassificador pode capturar as nuances semânticas e as relações contextuais entre a consulta e os documentos, resultando em uma classificação mais precisa e relevante.
Benefícios da recuperação e reclassificação em dois estágios
A adoção da recuperação em dois estágios com reclassificadores oferece vários benefícios significativos no contexto dos sistemas RAG:
Precisão Melhorada: Ao reclassificar os documentos inicialmente recuperados e promover os mais relevantes ao topo, o sistema pode fornecer informações mais precisas e precisas ao modelo de linguagem, levando a respostas geradas de maior qualidade.
Problemas mitigados fora do domínio: Os modelos de incorporação usados para recuperação tradicional são frequentemente treinados em corpora de texto de uso geral, que podem não capturar adequadamente a linguagem e a semântica específicas do domínio. Os modelos de reclassificação, por outro lado, podem ser treinados em dados específicos de domínio, mitigando o problema “fora do domínio” e melhorando a relevância dos documentos recuperados em domínios especializados.
Global: A abordagem em dois estágios permite um escalonamento eficiente, aproveitando métodos de recuperação rápidos e leves no estágio inicial, enquanto reserva o processo de reclassificação mais intensivo em termos computacionais para um subconjunto menor de documentos.
Flexibilidade: Os modelos de reclassificação podem ser trocados ou atualizados independentemente do método de recuperação inicial, proporcionando flexibilidade e adaptabilidade às necessidades crescentes do sistema.
ColBERT: Interação Tardia Eficiente e Eficaz
Um dos modelos de destaque no domínio da reclassificação é o ColBERT (Interação tardia contextualizada sobre BERT). ColBERT é um modelo de reclassificação de documentos que aproveita os recursos profundos de compreensão da linguagem do BERT, ao mesmo tempo que introduz um novo mecanismo de interação conhecido como “interação tardia”.
ColBERT: Pesquisa de passagem eficiente e eficaz por meio de interação tardia contextualizada sobre BERT
O mecanismo de interação tardia do ColBERT permite uma recuperação eficiente e precisa, processando consultas e documentos separadamente até os estágios finais do processo de recuperação. Especificamente, ColBERT codifica independentemente a consulta e o documento usando BERT e, em seguida, emprega uma etapa de interação leve, porém poderosa, que modela sua similaridade refinada. Ao atrasar, mas manter esta interação refinada, o ColBERT pode aproveitar a expressividade dos modelos de linguagem profunda e, ao mesmo tempo, obter a capacidade de pré-calcular representações de documentos offline, acelerando consideravelmente o processamento de consultas.
A arquitetura de interação tardia do ColBERT oferece diversos benefícios, incluindo maior eficiência computacional, escalabilidade com o tamanho da coleção de documentos e aplicabilidade prática para cenários do mundo real. Além disso, o ColBERT foi aprimorado com técnicas como supervisão com redução de ruído e compressão residual (no ColBERTv2), que refinam o processo de treinamento e reduzem o espaço ocupado pelo modelo, mantendo alta eficácia de recuperação.
Este trecho de código demonstra como configurar e usar o modelo jina-colbert-v1-en para indexar uma coleção de documentos, aproveitando sua capacidade de lidar com contextos longos de forma eficiente.
Implementando recuperação em dois estágios com reclassificadores
Agora que entendemos os princípios por trás da recuperação em dois estágios e dos rerankers, vamos explorar sua implementação prática no contexto de um sistema RAG. Utilizaremos bibliotecas e frameworks populares para demonstrar a integração dessas técnicas.
Configurando o ambiente
Antes de mergulharmos no código, vamos configurar nosso ambiente de desenvolvimento. Usaremos Python e diversas bibliotecas populares de PNL, incluindo Hugging Face Transformers, Sentence Transformers e LanceDB.
Para fins de demonstração, usaremos o conjunto de dados “ai-arxiv-chunked” do Hugging Face Datasets, que contém mais de 400 artigos do ArXiv sobre aprendizado de máquina, processamento de linguagem natural e grandes modelos de linguagem.
from datasets import load_dataset
dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")
<pre>
Em seguida, pré-processaremos os dados e os dividiremos em pedaços menores para facilitar a recuperação e o processamento eficientes.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Para o estágio inicial de recuperação, usaremos um modelo Sentence Transformer para codificar nossos documentos e consultas em representações vetoriais densas e, em seguida, realizaremos uma pesquisa aproximada do vizinho mais próximo usando um banco de dados vetorial como o LanceDB.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
Com nossos documentos indexados, podemos realizar a recuperação inicial encontrando os vizinhos mais próximos de um determinado vetor de consulta.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Reclassificação
Após a recuperação inicial, empregaremos um modelo de reclassificação para reordenar os documentos recuperados com base em sua relevância para a consulta. Neste exemplo, usaremos o reclassificador ColBERT, um modelo rápido e preciso baseado em transformador, projetado especificamente para classificação de documentos.
A reranked_docs list agora contém os documentos reordenados com base em sua relevância para a consulta, conforme determinado pelo reclassificador ColBERT.
Aumento e Geração
Com os documentos relevantes e reclassificados em mãos, podemos prosseguir para as etapas de aumento e geração do pipeline RAG. Usaremos um modelo de linguagem da biblioteca Hugging Face Transformers para gerar a resposta final.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
# Augment query with reranked documents
augmented_query = query + " " + " ".join(reranked_docs[:3])
# Generate response from language model
input_ids = tokenizer.encode(augmented_query, return_tensors="pt")
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)
print(response)
No trecho de código acima, aumentamos a consulta original com os três principais documentos reclassificados, criando um augmented_query. Em seguida, passamos essa consulta aumentada para um modelo de linguagem T5, que gera uma resposta com base no contexto fornecido.
A response A variável conterá o resultado final, aproveitando as informações externas dos documentos recuperados e reclassificados para fornecer uma resposta mais precisa e abrangente à consulta original.
Técnicas e considerações avançadas
Embora a implementação que abordamos forneça uma base sólida para integrar recuperação de dois estágios e reordenadores em um sistema RAG, há diversas técnicas e considerações avançadas que podem melhorar ainda mais o desempenho e a robustez da abordagem.
Expansão de consulta: para melhorar o estágio inicial de recuperação, você pode empregar técnicas de expansão de consulta, que envolvem aumentar a consulta original com termos ou frases relacionadas. Isto pode ajudar a recuperar um conjunto mais diversificado de documentos potencialmente relevantes.
Reclassificação do Conjunto: em vez de depender de um único modelo de reclassificação, você pode combinar vários reclassificadores em um conjunto, aproveitando os pontos fortes de diferentes modelos para melhorar o desempenho geral.
Reclassificadores de ajuste fino: Embora modelos de reclassificação pré-treinados possam ser eficazes, ajustá-los em dados específicos de domínio pode aumentar ainda mais sua capacidade de capturar semântica específica de domínio e sinais de relevância.
Recuperação iterativa e reclassificação: Em alguns casos, uma única iteração de recuperação e reclassificação pode não ser suficiente. Você pode explorar abordagens iterativas, onde a saída do modelo de linguagem é usada para refinar o processo de consulta e recuperação, levando a um sistema mais interativo e dinâmico.
Equilibrando Relevância e Diversidade: Embora os rerankers visem promover os documentos mais relevantes, é essencial encontrar um equilíbrio entre relevância e diversidade. Incorporar técnicas que promovam a diversidade pode ajudar a evitar que o sistema seja excessivamente restrito ou tendencioso em suas fontes de informação.
Métricas de AvaliaçãoPara avaliar a eficácia da sua abordagem de recuperação e reclassificação em duas etapas, você precisará definir métricas de avaliação apropriadas. Essas métricas podem incluir métricas tradicionais de recuperação de informações, como precisão, recall e classificação recíproca média (MRR), bem como métricas específicas para cada tarefa, adaptadas ao seu caso de uso.
Conclusão
A Geração Aumentada de Recuperação (RAG) emergiu como uma técnica poderosa para aprimorar as capacidades de grandes modelos de linguagem, aproveitando fontes externas de informação. No entanto, os métodos tradicionais de recuperação muitas vezes têm dificuldades para identificar os documentos mais relevantes, levando a um desempenho abaixo do ideal.
A recuperação em dois estágios com reclassificadores oferece uma solução atraente para esse desafio. Ao combinar um estágio inicial de recuperação rápida com um modelo de reclassificação mais sofisticado, esta abordagem pode melhorar significativamente a precisão e a relevância dos documentos recuperados, levando, em última análise, a respostas geradas de maior qualidade a partir do modelo de linguagem.
Passei os últimos cinco anos mergulhando no fascinante mundo do Machine Learning e Deep Learning. Minha paixão e experiência me levaram a contribuir para mais de 50 projetos diversos de engenharia de software, com foco particular em AI/ML. Minha curiosidade contínua também me atraiu para o Processamento de Linguagem Natural, um campo que estou ansioso para explorar mais.