Cuando se proxenetismo del procesamiento del verbo natural (PNL) y la recuperación de la información, la capacidad de recuperar la información relevante de guisa capaz y precisa es primordial. 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 la vivientes aumentada de recuperación (RAG). Una de esas técnicas, conocida como recuperación de dos etapas con los reanicadores, se ha convertido en una alternativa poderosa para encarar 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 reanicadores, explorando sus principios subyacentes, estrategias de implementación y los beneficios que ofrecen para mejorar la precisión y eficiencia de los sistemas RAG. Asimismo proporcionaremos ejemplos prácticos y fragmentos de código para ilustrar los conceptos y proporcionar una comprensión más profunda de esta técnica de vanguardia.
Comprensión de la vivientes aumentada de recuperación (trapo)
Antaño de sumergirnos en los detalles de la recuperación de dos etapas y los vuelos a los vuelos, revisemos brevemente el concepto de vivientes aumentada de recuperación (RAG). RAG es una técnica que extiende el conocimiento y las capacidades de los modelos de idiomas grandes (LLM) al proporcionarles ataque a fuentes de información externas, como bases de datos o colecciones de documentos. Consulte más del artículo «Una inmersión profunda en la vivientes aumentada de recuperación en LLM».
El proceso de trapo peculiar implica los siguientes pasos:
- Consulta: Un favorecido plantea una pregunta o proporciona una instrucción al sistema.
- Recuperación: El sistema consulta una saco de datos vectorial o una sumario de documentos para encontrar información relevante para la consulta del favorecido.
- Aumento: La información recuperada se combina con la consulta o instrucción flamante del favorecido.
- Vivientes: El maniquí de verbo procesa la entrada aumentada y genera una respuesta, aprovechando la información externa para mejorar la precisión y la integridad de su salida.
Si perfectamente Rag ha demostrado ser una técnica poderosa, no está exenta de desafíos. Uno de los temas secreto radica en la etapa de recuperación, donde los métodos de recuperación tradicionales pueden no identificar los documentos más relevantes, lo que lleva a respuestas subóptimas o inexactas del maniquí de idioma.
La penuria de recuperación de dos etapas y vueltas
Los métodos de recuperación tradicionales, como los basados en modelos de coincidencia de palabras secreto o espacios vectoriales, a menudo luchan por capturar las relaciones semánticas matizadas entre consultas y documentos. Esta restricción puede dar área a la recuperación de documentos que solo son de forma superficial o se pierden información crucial que podría mejorar significativamente la calidad de la respuesta generada.
Para encarar este desafío, los investigadores y los profesionales han recurrido a la recuperación de dos etapas con Rerankers. Este enfoque implica un proceso de dos pasos:
- Recuperación original: En la primera etapa, se recupera un conjunto relativamente egregio de documentos potencialmente relevantes utilizando un método de recuperación rápido y capaz, como un maniquí de espacio vectorial o una búsqueda basada en palabras secreto.
- Reestructuración: En la segunda etapa, se emplea un maniquí de reordenamiento más sofisticado para reordenar los documentos inicialmente recuperados en función de su relevancia para la consulta, llevando efectivamente los documentos más relevantes a la parte superior de la índice.
El maniquí Reranking, a menudo una red neuronal o una bloque basada en transformadores, está específicamente capacitado para evaluar la relevancia de un documento para una consulta dada. Al servirse las capacidades avanzadas de comprensión del verbo natural, el Reranker puede capturar los matices semánticos 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 vueltas
La asimilación de la recuperación de dos etapas con Rerankers ofrece varios beneficios significativos en el contexto de los sistemas RAG:
- Precisión mejorada: Al retornar a ser los documentos inicialmente recuperados y promover los más relevantes en la parte superior, el sistema puede proporcionar información más precisa y precisa al maniquí de verbo, lo que lleva a respuestas generadas de viejo calidad.
- Problemas fuera de dominio mitigados: Los modelos de incrustación utilizados para la recuperación tradicional a menudo se entrenan en corpus de texto de uso militar, que pueden no capturar adecuadamente el verbo y la semántica específicos de dominio. Los modelos de remodelación, por otro costado, pueden ser entrenados en datos específicos del dominio, mitigando el problema del «fuera del dominio» y mejorando la relevancia de los documentos recuperados en el interior de dominios especializados.
- Escalabilidad: El enfoque de dos etapas permite una escalera capaz al servirse los métodos de recuperación rápidos y livianos en la etapa original, al tiempo que reserva el proceso de rehabilitación más intensivo computacionalmente para un subconjunto más pequeño de documentos.
- Flexibilidad: Los modelos de rehabilitación se pueden cambiar o poner al día independientemente del método de recuperación original, proporcionando flexibilidad y adaptabilidad a las evacuación en desarrollo del sistema.
Colbert: interacción tardía capaz y efectiva
Uno de los modelos más destacados en el ámbito de la reranking es Colbert (interacción tardía contextualizada sobre Bert). Colbert es un maniquí de Reranker de documento que aprovecha las capacidades de comprensión del verbo profundo de Bert al tiempo que introduce un mecanismo de interacción novedoso conocido como «interacción tardía».
Colbert: búsqueda capaz y efectiva de pasaje a través de la interacción tardía contextualizada sobre Bert
El mecanismo de interacción tardía en Colbert permite una recuperación capaz y precisa mediante el procesamiento de consultas y documentos por separado hasta las etapas finales del proceso de recuperación. Específicamente, Colbert codifica independientemente la consulta y el documento usando Bert, y luego emplea un paso de interacción rijoso pero poderoso que modela su similitud de gramínea fino. Al retrasar pero retener esta interacción de gramínea fino, Colbert puede servirse la viveza de los modelos de verbo profundo y al mismo tiempo obtener la capacidad de precomputar representaciones de documentos fuera de confín, acelerando considerablemente el procesamiento de consultas.
La bloque de interacción tardía de Colbert ofrece varios beneficios, incluida la eficiencia computacional mejorada, la escalabilidad con el tamaño de la sumario de documentos y la aplicabilidad experiencia para los escenarios del mundo vivo. Adicionalmente, Colbert se ha mejorado aún más con técnicas como la supervisión desolada y la compresión residual (en Colbertv2), que refinan el proceso de entrenamiento y reducen la huella espacial del maniquí mientras mantienen una incorporación efectividad de recuperación.
Este fragmento de código demuestra cómo configurar y usar el maniquí Jina-Colbert-V1-EN para indexar una colección de documentos, aprovechando su capacidad para manejar contextos largos de guisa capaz.
Implementación de 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 vuelvos, exploremos su implementación experiencia en el contexto de un sistema de trapo. Aprovecharemos bibliotecas y marcos populares para demostrar la integración de estas técnicas.
Configuración del medio hábitat
Antaño de sumergirnos en el código, establezcamos nuestro entorno de expansión. Usaremos Python y varias bibliotecas populares de la PNL, incluidos abrazos de los transformadores faciales, transformadores de oraciones y LancedB.
# Install required libraries
!pip install datasets huggingface_hub sentence_transformers lancedb
Preparación de datos
Para fines de demostración, utilizaremos el conjunto de datos «A-Ai-ARXIV» de los conjuntos de datos de abrazos de estrujón, que contiene más de 400 artículos ARXIV en formación obligatorio, procesamiento de verbo natural y modelos de idiomas grandes.
from datasets import load_dataset
dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")
Next, we'll preprocess the data and split it into smaller chunks to facilitate efficient retrieval and processing.
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)
For the initial retrieval stage, we'll use a Sentence Transformer model to encode our documents and queries into dense vector representations, and then perform approximate nearest neighbor search using a vector database like 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)
Con nuestros documentos indexados, podemos realizar la recuperación original al encontrar a 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)
Reestructuración
Luego de la recuperación original, emplearemos un maniquí de reordenamiento para reordenar los documentos recuperados en función de su relevancia para la consulta. En este ejemplo, utilizaremos el Colbert Reranker, un maniquí basado en transformadores rápido y preciso diseñado específicamente para la clasificación de documentos.
from lancedb.rerankers import ColbertReranker
reranker = ColbertReranker()
# Rerank initial documents
reranked_docs = reranker.rerank(query, initial_docs)
El reranked_docs La índice ahora contiene los documentos reordenados en función de su relevancia para la consulta, según lo determinado por el Colbert Reranker.
Aumento y vivientes
Con los documentos relevantes y relevantes en la mano, podemos proceder a las etapas de aumento y vivientes de la tubería RAG. Usaremos un maniquí de verbo de la biblioteca de transformadores faciales para suscitar la respuesta 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)