¿Sabías? En la película Ragatouille, el plato que Remy fabrica no es en realidad una ratatouille, sino una versión refinada del plato llamada "confit byaldi".

Byaldi es el mini proyecto hermana de Ragatouille. Es un envoltorio simple alrededor del repositorio colpalí para que sea fácil usar modelos multimodales de interacción tardía como colpalí con una API familiar.
Primero, una advertencia: esta es una biblioteca de prelanzamiento, que usa índices sin comprimir y carece de otros tipos de refinamientos.
Actualmente, apoyamos todos los modelos compatibles con el motor Colpali subyacente, incluidos los puntos de control Colqwen2 más nuevos y mejores, como vidore/colqwen2-v1.0 . En términos generales, el objetivo es que Byaldi apoye todos los modelos COLVLM.
Los backends adicionales serán compatibles con futuras actualizaciones. Como Byaldi existe para facilitar la adopción de retrievers multimodales, tenemos la intención de agregar también soporte para modelos como Visrag.
Finalmente, agregaremos un mecanismo de indexación HNSW, agrupación y, quién sabe, ¿tal vez una cuantización de 2 bits?
¡Se actualizará a medida que el ecosistema multimodal se desarrolle aún más!
Para convertir PDF en imágenes con una licencia amigable, utilizamos la biblioteca pdf2image . Esta biblioteca requiere que poppler se instale en su sistema. Poppler es muy fácil de instalar siguiendo las instrucciones en su sitio web. El tl; dr es:
MacOS con cerveza casera
brew install popplerDebian/Ubuntu
sudo apt-get install -y poppler-utilsGemma usa una versión reciente de Flash Atture. Para que las cosas funcionen de la manera más suave posible, le recomendamos que las instale después de instalar la biblioteca:
pip install --upgrade byaldi
pip install flash-attnColpali utiliza modelos de parámetros multimillonarios para codificar documentos. Recomendamos usar una GPU para operaciones suaves, ¡aunque las GPU débiles/más antiguas están perfectamente bien! Codificar su colección sufriría de bajo rendimiento en CPU o MPS.
byaldiByaldi se modela en gran medida después de Ragatouille, lo que significa que todo está diseñado para tomar la menor cantidad de líneas de código posibles, por lo que puede construir rápidamente sobre él en lugar de pasar tiempo descubriendo cómo crear una tubería de recuperación.
Cargar un modelo con byaldi es extremadamente sencillo:
from byaldi import RAGMultiModalModel
# Optionally, you can specify an `index_root`, which is where it'll save the index. It defaults to ".byaldi/".
RAG = RAGMultiModalModel . from_pretrained ( "vidore/colqwen2-v1.0" )Si ya tiene un índice y desea cargarlo junto con el modelo necesario para consultarlo, puede hacerlo con la misma facilidad:
from byaldi import RAGMultiModalModel
# Optionally, you can specify an `index_root`, which is where it'll look for the index. It defaults to ".byaldi/".
RAG = RAGMultiModalModel . from_index ( "your_index_name" ) Crear un índice con byaldi es simple y flexible. Puede indexar un solo archivo PDF, un solo archivo de imagen o un directorio que contenga múltiples de ellos . Aquí le mostramos cómo crear un índice:
from byaldi import RAGMultiModalModel
# Optionally, you can specify an `index_root`, which is where it'll save the index. It defaults to ".byaldi/".
RAG = RAGMultiModalModel . from_pretrained ( "vidore/colqwen2-v1.0" )
RAG . index (
input_path = "docs/" , # The path to your documents
index_name = index_name , # The name you want to give to your index. It'll be saved at `index_root/index_name/`.
store_collection_with_index = False , # Whether the index should store the base64 encoded documents.
doc_ids = [ 0 , 1 , 2 ], # Optionally, you can specify a list of document IDs. They must be integers and match the number of documents you're passing. Otherwise, doc_ids will be automatically created.
metadata = [{ "author" : "John Doe" , "date" : "2021-01-01" }], # Optionally, you can specify a list of metadata for each document. They must be a list of dictionaries, with the same length as the number of documents you're passing.
overwrite = True # Whether to overwrite an index if it already exists. If False, it'll return None and do nothing if `index_root/index_name` exists.
) ¡Y eso es todo! El modelo comenzará a girar y creará su índice, exportando toda la información necesaria al disco cuando esté listo. Luego puede usar el método RAGMultiModalModel.from_index("your_index_name") presentado anteriormente para cargarlo siempre que sea necesario (no necesita hacer esto correctamente después de crearlo, ¡ya está cargado en la memoria y listo!).
La decisión principal que tendrá que tomar aquí es si desea establecer store_collection_with_index en verdadero o no. Si se establece en verdadero, simplifica enormemente su flujo de trabajo: la versión codificada de documentos relevantes Base64 se devolverá como parte de los resultados de la consulta, por lo que puede llevarla inmediatamente a su LLM. Sin embargo, agrega considerables requisitos de memoria y almacenamiento a su índice, por lo que es posible que desee establecerlo en False (la configuración predeterminada) si tiene cortos en esos recursos y crea las versiones codificadas Base64 usted mismo cuando sea necesario.
Una vez que haya creado o cargado un índice, puede comenzar a buscar documentos relevantes. De nuevo, es un comando único y muy sencillo:
results = RAG . search ( query , k = 3 ) Los resultados serán una lista de objetos Result , que también puede tratar como diccionarios normales. Cada resultado estará en este formato:
[
{
"doc_id" : 0 ,
"page_num" : 10 ,
"score" : 12.875 ,
"metadata" : {},
"base64" : None
},
...
] page_num están indexados por 1, mientras que los DOC_IDS están indexados por 0. Esto es para simplificar con otras herramientas de manipulación de PDF, donde la primera página es generalmente página 1. page_num para imágenes y PDF de una sola página siempre serán 1, solo es útil para PDF más largos.
Si ha pasado metadatos o está codificado con la bandera para almacenar las versiones Base64, estos campos estarán poblados. Los resultados se ordenan por puntaje, por lo que el elemento 0 de la lista siempre será el documento más relevante, etc.
Dado que los índices están en memoria, ¡son amigables con la adición! Si necesita ingerir algunos PDF nuevos, simplemente cargue su índice con from_index y luego, llame add_to_index , con parámetros similares al método original index() original:
RAG . add_to_index ( "path_to_new_docs" ,
store_collection_with_index : bool = False ,
...
)