Connect with us

Poder de los reordenadores y recuperación en dos etapas para la generación aumentada de recuperación

AGI

Poder de los reordenadores y recuperación en dos etapas para la generación aumentada de recuperación

mm
Retrieval Augmented Generation

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 continúa 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 Generación Aumentada de Recuperación (RAG). Una de estas técnicas, conocida como recuperación en dos etapas con reordenadores, 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 intricaciones de la recuperación en dos etapas y los reordenadores, 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 en dos etapas y los reordenadores, revisitemos 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 recuperación en dos etapas y reordenadores

Los métodos de recuperación tradicionales, como los basados en la coincidencia de palabras clave o en modelos de espacio vectorial, a menudo luchan por capturar las relaciones semánticas matizadas entre consultas y 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 en dos etapas con reordenadores. Este enfoque implica un proceso de dos pasos:

  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. Reordenamiento: En la segunda etapa, se emplea un modelo de reordenamiento 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 reordenamiento, 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 capacidades avanzadas de comprensión del lenguaje natural, el reordenador puede capturar las nuances semánticas y las relaciones contextuales entre la consulta y los documentos, lo que resulta en un ordenamiento más preciso y relevante.

Beneficios de la recuperación en dos etapas y reordenadores

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

  1. Precisión mejorada: Al reordenar 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 lleva a respuestas generadas de mayor calidad.
  2. Problemas de dominio mitigados: Los modelos de incorporación 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 reordenamiento, por otro lado, se pueden entrenar en datos específicos del dominio, lo que mitiga el problema “fuera del dominio” y mejora 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 reordenamiento más intensivo en términos computacionales para un subconjunto más pequeño de documentos.
  4. Flexibilidad: Los modelos de reordenamiento se pueden intercambiar o actualizar de forma independiente del método de recuperación inicial, lo que proporciona flexibilidad y adaptabilidad a las necesidades evolutivas del sistema.

ColBERT: Interacción tardía eficiente y efectiva

Uno de los modelos destacados en el ámbito de los reordenadores es ColBERT (Interacción tardía contextualizada sobre BERT). ColBERT es un modelo de reordenamiento de documentos que aprovecha las capacidades de comprensión del lenguaje profundo de BERT mientras introduce un mecanismo de interacción novedoso conocido como “interacción tardía”.

ColBERT: Búsqueda de pasajes eficiente y efectiva a través de interacción tardía contextualizada sobre BERT

ColBERT: Búsqueda de pasajes eficiente y efectiva a través de interacción tardía contextualizada sobre BERT

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

La arquitectura de interacción tardía 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 se ha mejorado aún más con técnicas como supervisión ruidosa y compresión residual (en ColBERTv2), que refinan el proceso de entrenamiento y reducen la huella de espacio del modelo mientras mantienen una alta efectividad de recuperación.

Este fragmento de código demuestra cómo configurar y utilizar el modelo jina-colbert-v1-en para indexar una colección de documentos, aprovechando su capacidad para manejar contextos largos de forma eficiente.

Implementación de la recuperación en dos etapas con reordenadores

Ahora que tenemos una comprensión de los principios detrás de la recuperación en dos etapas y los reordenadores, exploremos su implementación práctica dentro del contexto de un sistema RAG. Utilizaremos 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 necesarias
!pip install datasets huggingface_hub sentence_transformers lancedb

Preparación de datos

Con 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 grandes modelos de lenguaje.

from datasets import load_dataset

dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")

<pre>

A continuación, procesaremos los datos y los dividiremos en fragmentos más pequeños para facilitar la recuperación y el procesamiento 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 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

# Cargar modelo de Sentence Transformer
model = SentenceTransformer('all-MiniLM-L6-v2')

# Crear almacén de vectores de LanceDB
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())

# Indexar documentos
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

# Cargar modelo de Sentence Transformer
model = SentenceTransformer('all-MiniLM-L6-v2')

# Crear almacén de vectores de LanceDB
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())

# Indexar documentos
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', 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

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)

Reordenamiento

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

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

# Reordenar 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 lo determina el reordenador ColBERT.

Aumento y generación

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

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")

# Aumentar consulta con documentos reordenados
augmented_query = query + " " + " ".join(reranked_docs[:3])

# Generar respuesta desde el modelo de lenguaje
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)

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 salida 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 en dos etapas y los reordenadores 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 implican aumentar la consulta original con términos o frases relacionadas. Esto puede ayudar a recuperar un conjunto más diverso de documentos potencialmente relevantes.
  2. Reordenamiento ensemble: En lugar de confiar en un solo modelo de reordenamiento, se puede combinar múltiples reordenadores en un ensemble, aprovechando las fortalezas de diferentes modelos para mejorar el rendimiento general.
  3. Ajuste fino de reordenadores: Mientras que los modelos de reordenamiento preentrenados pueden ser efectivos, ajustarlos a datos específicos del dominio puede mejorar aún más su capacidad para capturar la semántica y las señales de relevancia específicas del dominio.
  4. Recuperación y reordenamiento iterativos: En algunos casos, una sola iteración de recuperación y reordenamiento 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 reordenadores 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 sea 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 en dos etapas y reordenamiento, se deben definir métricas de evaluación apropiadas. Estas pueden incluir métricas de recuperación de información tradicionales como precisión, recall y media de rank recíproco (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 en dos etapas con reordenadores ofrece una solución atractiva a este desafío. Al combinar una etapa de recuperación inicial rápida con un modelo de reordenamiento más sofisticado, este enfoque puede mejorar significativamente la precisión y la relevancia de los documentos recuperados, lo que lleva a respuestas generadas de mayor calidad por parte del modelo de lenguaje.

He pasado los últimos cinco años sumergiéndome en el fascinante mundo del Aprendizaje Automático y el Aprendizaje Profundo. 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 continua también me ha llevado hacia el Procesamiento de Lenguaje Natural, un campo que estoy ansioso por explorar más a fondo.