IAG e IA del futuro

Poder de los Rerankers y la Recuperación de Dos Etapas para la Generación Aumentada de Recuperación

mm
Añade Unite.AI a tus fuentes preferidas en Google

Cuando se trata de procesamiento de lenguaje natural (NLP) y recuperación de información, la capacidad de recuperar información relevante de manera eficiente y precisa es fundamental. A medida que el campo sigue evolucionando, se están desarrollando nuevas técnicas y metodologías para mejorar el rendimiento de los sistemas de recuperación, particularmente en el contexto de la Generación Aumentada de Recuperación (RAG). Una de estas técnicas, conocida como recuperación de dos etapas con rerankers, ha surgido como una solución poderosa para abordar las limitaciones inherentes de los métodos de recuperación tradicionales.

En este artículo, discutimos las complejidades de la recuperación de dos etapas y los rerankers, explorando sus principios subyacentes, estrategias de implementación y los beneficios que ofrecen para mejorar la precisión y la eficiencia de los sistemas RAG. También proporcionaremos ejemplos prácticos y fragmentos de código para ilustrar los conceptos y facilitar una comprensión más profunda de esta técnica de vanguardia.

Entendiendo la Generación Aumentada de Recuperación (RAG)

swe agent LLM

Antes de sumergirnos en los detalles de la recuperación de dos etapas y los rerankers, volvamos a revisar brevemente el concepto de Generación Aumentada de Recuperación (RAG). RAG es una técnica que amplía el conocimiento y las capacidades de los grandes modelos de lenguaje (LLM) al proporcionarles acceso a fuentes de información externas, como bases de datos o colecciones de documentos. Consulte más en el artículo “Una inmersión profunda en la Generación Aumentada de Recuperación en LLM“.

El proceso típico de RAG implica los siguientes pasos:

  1. Consulta: Un usuario formula una pregunta o proporciona una instrucción al sistema.
  2. Recuperación: El sistema consulta una base de datos vectorial o una colección de documentos para encontrar información relevante para la consulta del usuario.
  3. Aumento: La información recuperada se combina con la consulta original del usuario o la instrucción.
  4. Generación: El modelo de lenguaje procesa la entrada aumentada y genera una respuesta, aprovechando la información externa para mejorar la precisión y la exhaustividad de su salida.

Si bien RAG ha demostrado ser una técnica poderosa, no está exenta de desafíos. Uno de los problemas clave radica en la etapa de recuperación, donde los métodos de recuperación tradicionales pueden fallar al identificar los documentos más relevantes, lo que lleva a respuestas subóptimas o inexactas del modelo de lenguaje.

La Necesidad de la Recuperación de Dos Etapas y los Rerankers

Los métodos de recuperación tradicionales, como los basados en la coincidencia de palabras clave o los modelos de espacio vectorial, a menudo luchan por capturar las relaciones semánticas sutiles entre las consultas y los documentos. Esta limitación puede resultar en la recuperación de documentos que son solo superficialmente relevantes o que pierden información crucial que podría mejorar significativamente la calidad de la respuesta generada.

Para abordar este desafío, los investigadores y practicantes han recurrido a la recuperación de dos etapas con rerankers. Este enfoque implica un proceso de dos etapas:

  1. Recuperación Inicial: En la primera etapa, se recupera un conjunto relativamente grande de documentos potencialmente relevantes utilizando un método de recuperación rápido y eficiente, como un modelo de espacio vectorial o una búsqueda basada en palabras clave.
  2. Reranking: En la segunda etapa, se emplea un modelo de reranking más sofisticado para reordenar los documentos recuperados inicialmente según su relevancia para la consulta, efectivamente llevando los documentos más relevantes a la parte superior de la lista.

El modelo de reranking, a menudo una red neuronal o una arquitectura basada en transformadores, se entrena específicamente para evaluar la relevancia de un documento para una consulta determinada. Al aprovechar las capacidades avanzadas de comprensión del lenguaje natural, el reranker puede capturar las sutilezas semánticas y las relaciones contextuales entre la consulta y los documentos, lo que resulta en una clasificación más precisa y relevante.

Beneficios de la Recuperación de Dos Etapas y los Rerankers

La adopción de la recuperación de dos etapas con rerankers ofrece varios beneficios significativos en el contexto de los sistemas RAG:

  1. Mejora de la Precisión: Al reranking los documentos recuperados inicialmente y promover los más relevantes a la parte superior, el sistema puede proporcionar información más precisa y precisa al modelo de lenguaje, lo que conduce a respuestas generadas de mayor calidad.
  2. Mitigación de Problemas Fora del Dominio: Los modelos de embeddings utilizados para la recuperación tradicional a menudo se entrenan en corpus de texto de propósito general, que pueden no capturar adecuadamente el lenguaje y la semántica específicos del dominio. Los modelos de reranking, por otro lado, se pueden entrenar en datos específicos del dominio, mitigando el problema “fora del dominio” y mejorando la relevancia de los documentos recuperados dentro de dominios especializados.
  3. Escalabilidad: El enfoque de dos etapas permite una escalabilidad eficiente al aprovechar métodos de recuperación rápidos y ligeros en la etapa inicial, mientras que se reserva el proceso de reranking más intensivo en términos computacionales para un subconjunto más pequeño de documentos.
  4. Flexibilidad: Los modelos de reranking se pueden intercambiar o actualizar de forma independiente del método de recuperación inicial, proporcionando flexibilidad y adaptabilidad a las necesidades cambiantes del sistema.

ColBERT: Interacción Eficiente y Efectiva en Etapas Tardías

Uno de los modelos destacados en el ámbito de los rerankers es ColBERT (Interacción Contextualizada en Etapas Tardías sobre BERT). ColBERT es un modelo de reranking de documentos que aprovecha las capacidades profundas de comprensión del lenguaje de BERT mientras introduce un mecanismo de interacción novedoso conocido como “interacción en etapas tardías”.

ColBERT: Búsqueda de Pasajes Eficiente y Efectiva a Través de la Interacción Contextualizada en Etapas Tardías sobre BERT

ColBERT: Búsqueda de Pasajes Eficiente y Efectiva a Través de la Interacción Contextualizada en Etapas Tardías sobre BERT

El mecanismo de interacción en etapas tardías en ColBERT permite una recuperación eficiente y precisa al procesar las consultas y los documentos por separado hasta las etapas finales del proceso de recuperación. Específicamente, ColBERT codifica de forma independiente la consulta y el documento utilizando BERT, y luego emplea un paso de interacción ligero pero potente que modela su similitud fina. Al retrasar pero retener esta interacción fina, ColBERT puede aprovechar la expresividad de los modelos de lenguaje profundos mientras gana la capacidad de precomputar las representaciones de los documentos de forma offline, lo que acelera significativamente el procesamiento de las consultas.

La arquitectura de interacción en etapas tardías de ColBERT ofrece varios beneficios, incluyendo una mayor eficiencia computacional, escalabilidad con el tamaño de la colección de documentos y aplicabilidad práctica para escenarios del mundo real. Además, ColBERT ha sido mejorado con técnicas como la supervisión ruidosa y la compresión residual (en ColBERTv2), que refinan el proceso de entrenamiento y reducen la huella espacial del modelo mientras mantienen una alta efectividad de recuperación.

Implementando la Recuperación de Dos Etapas con Rerankers

Ahora que tenemos una comprensión de los principios detrás de la recuperación de dos etapas y los rerankers, exploremos su implementación práctica dentro del contexto de un sistema RAG. Aprovecharemos bibliotecas y marcos populares para demostrar la integración de estas técnicas.

Configuración del Entorno

Antes de sumergirnos en el código, configuremos nuestro entorno de desarrollo. Estaremos utilizando Python y varias bibliotecas de NLP populares, incluyendo Hugging Face Transformers, Sentence Transformers y LanceDB.

# Instalar bibliotecas requeridas
!pip install datasets huggingface_hub sentence_transformers lancedb

Preparación de Datos

Para fines de demostración, utilizaremos el conjunto de datos “ai-arxiv-chunked” de Hugging Face Datasets, que contiene más de 400 artículos de ArXiv sobre aprendizaje automático, procesamiento de lenguaje natural y modelos de lenguaje grandes.

from datasets import load_dataset

<p>dataset = load_dataset(&quot;jamescalam/ai-arxiv-chunked&quot;, split=&quot;train&quot;)</p>

&amp;lt;pre&amp;gt;

A continuación, preprocesaremos los datos y los dividiremos en fragmentos más pequeños para facilitar la recuperación y el procesamiento eficientes.

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)</p>

Para la etapa de recuperación inicial, utilizaremos un modelo de Sentence Transformer para codificar nuestros documentos y consultas en representaciones vectoriales densas, y luego realizaremos una búsqueda de vecinos más cercanos aproximada utilizando una base de datos vectorial como LanceDB.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb

<p># Cargar modelo de Sentence Transformer
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Crear almacén de vectores de LanceDB
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Indexar documentos
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)</p>

<p>from sentence_transformers import SentenceTransformer
from lancedb import lancedb</p>

<p># Cargar modelo de Sentence Transformer
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Crear almacén de vectores de LanceDB
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Indexar documentos
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)

Con nuestros documentos indexados, podemos realizar la recuperación inicial encontrando los vecinos más cercanos a un vector de consulta determinado.

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)

Reranking

Después de la recuperación inicial, emplearemos un modelo de reranking para reordenar los documentos recuperados según su relevancia para la consulta. En este ejemplo, utilizaremos el modelo de reranking ColBERT, un modelo de transformadores rápido y preciso diseñado específicamente para el ranking de documentos.

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

<p># Reranking de documentos iniciales
reranked_docs = reranker.rerank(query, initial_docs)

La lista reranked_docs ahora contiene los documentos reordenados según su relevancia para la consulta, como determinado por el modelo de reranking ColBERT.

Aumento y Generación

Con los documentos reordenados y relevantes en mano, podemos proceder a las etapas de aumento y generación del pipeline RAG. Utilizaremos un modelo de lenguaje de la biblioteca Hugging Face Transformers para generar la respuesta final.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;t5-base&quot;)
model = AutoModelForSeq2SeqLM.from_pretrained(&quot;t5-base&quot;)</p>

<p># Aumentar la consulta con los documentos reordenados
augmented_query = query + &quot; &quot; + &quot; &quot;.join(reranked_docs[:3])</p>

<p># Generar respuesta desde el modelo de lenguaje
input_ids = tokenizer.encode(augmented_query, return_tensors=&quot;pt&quot;)
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)</p>

print(response)

En el fragmento de código anterior, aumentamos la consulta original con los tres documentos reordenados, creando una consulta aumentada. Luego, pasamos esta consulta aumentada a un modelo de lenguaje T5, que genera una respuesta basada en el contexto proporcionado.

La variable response contendrá la respuesta final, aprovechando la información externa de los documentos recuperados y reordenados para proporcionar una respuesta más precisa y completa a la consulta original.

Técnicas Avanzadas y Consideraciones

Mientras que la implementación que hemos cubierto proporciona una base sólida para integrar la recuperación de dos etapas y los rerankers en un sistema RAG, hay varias técnicas avanzadas y consideraciones que pueden mejorar aún más el rendimiento y la robustez del enfoque.

  1. Expansión de la Consulta: Para mejorar la etapa de recuperación inicial, se puede emplear técnicas de expansión de la consulta, que involucran el aumento de la consulta original con términos o frases relacionadas. Esto puede ayudar a recuperar un conjunto más diverso de documentos potencialmente relevantes.
  2. Reranking Ensamblado: En lugar de confiar en un solo modelo de reranking, se puede combinar múltiples modelos de reranking en un ensamblado, aprovechando las fortalezas de diferentes modelos para mejorar el rendimiento general.
  3. Ajuste Fino de los Rerankers: Aunque los modelos de reranking preentrenados pueden ser efectivos, ajustarlos en datos específicos del dominio puede mejorar aún más su capacidad para capturar la semántica y los señales de relevancia específicas del dominio.
  4. Recuperación y Reranking Iterativos: En algunos casos, una sola iteración de recuperación y reranking puede no ser suficiente. Se puede explorar enfoques iterativos, donde la salida del modelo de lenguaje se utiliza para refinar la consulta y el proceso de recuperación, lo que lleva a un sistema más interactivo y dinámico.
  5. Equilibrio entre Relevancia y Diversidad: Mientras que los rerankers apuntan a promover los documentos más relevantes, es esencial encontrar un equilibrio entre relevancia y diversidad. Incorporar técnicas que promuevan la diversidad puede ayudar a prevenir que el sistema se vuelva demasiado estrecho o sesgado en sus fuentes de información.
  6. Métricas de Evaluación: Para evaluar la efectividad del enfoque de recuperación de dos etapas y reranking, se deben definir métricas de evaluación adecuadas. Estas pueden incluir métricas de recuperación de información tradicionales como precisión, recuerdo y media recíproca del rango (MRR), así como métricas específicas de la tarea adaptadas a su caso de uso.

Conclusión

La Generación Aumentada de Recuperación (RAG) ha surgido como una técnica poderosa para mejorar las capacidades de los grandes modelos de lenguaje al aprovechar fuentes de información externas. Sin embargo, los métodos de recuperación tradicionales a menudo luchan por identificar los documentos más relevantes, lo que lleva a un rendimiento subóptimo.

La recuperación de dos etapas con rerankers ofrece una solución convincente a este desafío. Al combinar una etapa de recuperación inicial rápida con un modelo de reranking más sofisticado, este enfoque puede mejorar significativamente la precisión y la relevancia de los documentos recuperados, lo que conduce a respuestas generadas de mayor calidad por parte del modelo de lenguaje.

He dedicado los últimos cinco años sumergiéndome en el fascinante mundo de Machine Learning y Deep Learning. Mi pasión y experiencia me han llevado a contribuir a más de 50 proyectos de ingeniería de software diversos, con un enfoque particular en AI/ML. Mi curiosidad en curso también me ha llevado hacia el Procesamiento de Lenguaje Natural, un campo que estoy ansioso por explorar más a fondo.