IAG e IA del futuro
Poder de los Rerankers y la Recuperación de Dos Etapas para la Generación Aumentada 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("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&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("bert-base-uncased")</p> <p>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</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] 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('all-MiniLM-L6-v2')</p> <p># Crear almacén de vectores de LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexar documentos for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)</p> <p>from sentence_transformers import SentenceTransformer from lancedb import lancedb</p> <p># Cargar modelo de Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Crear almacén de vectores de LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># 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 <p>tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")</p> <p>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</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] 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("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Aumentar la consulta con los documentos reordenados augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># 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)</p> print(response)














