Saviez-vous? Dans le film Ragatouille, le plat Remy n'est pas en fait un Ratatouille, mais une version raffinée du plat appelé "Confit Byaldi".

Byaldi est le mini-projet sœur de Ragatouille. Il s'agit d'un simple emballage autour du référentiel Colpali pour faciliter l'utilisation de modèles multimodaux à interaction tardive tels que Colpali avec une API familière.
Tout d'abord, un avertissement: il s'agit d'une bibliothèque de pré-libération, en utilisant des index non compressés et en manquant d'autres types de raffinements.
Actuellement, nous prenons en charge tous les modèles pris en charge par le moteur Colpali sous-jacent, y compris les points de contrôle plus récents et meilleurs, tels que vidore/colqwen2-v1.0 . D'une manière générale, l'objectif est pour Byaldi de prendre en charge tous les modèles COLVLM.
Les backends supplémentaires seront pris en charge dans les futures mises à jour. Comme Byaldi existe pour faciliter l'adoption de récupérateurs multimodaux, nous avons l'intention d'ajouter également un support pour des modèles tels que Visrag.
Finalement, nous ajouterons un mécanisme d'indexation HNSW, la mise en commun et, qui sait, peut-être la quantification 2 bits?
Il sera mis à jour à mesure que l'écosystème multimodal se développera plus loin!
Pour convertir PDF en images avec une licence amicale, nous utilisons la bibliothèque pdf2image . Cette bibliothèque nécessite que poppler soit installé sur votre système. Poppler est très facile à installer en suivant les instructions sur leur site Web. Le tl; dr est:
MacOS avec homebrew
brew install popplerDebian / Ubuntu
sudo apt-get install -y poppler-utilsGemma utilise une version récente de l'attention Flash. Pour faire fonctionner les choses aussi bien que possible, nous vous recommandons de l'installer après l'installation de la bibliothèque:
pip install --upgrade byaldi
pip install flash-attnColpali utilise des modèles de paramètres de plusieurs milliards pour coder des documents. Nous vous recommandons d'utiliser un GPU pour des opérations lisses, bien que les GPU faibles / plus anciens soient parfaitement bien! Encoder votre collection souffrirait de mauvaises performances sur le processeur ou les députés.
byaldiByaldi est largement modélisé après Ragatouille, ce qui signifie que tout est conçu pour prendre le moins de lignes de code possible, vous pouvez donc très rapidement construire sur celui-ci plutôt que de passer du temps à trouver comment créer un pipeline de récupération.
Le chargement d'un modèle avec byaldi est extrêmement simple:
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 vous avez déjà un index et que vous souhaitez le charger avec le modèle nécessaire pour l'interroger, vous pouvez le faire tout aussi facilement:
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" ) La création d'un index avec byaldi est simple et flexible. Vous pouvez indexer un seul fichier PDF, un seul fichier image ou un répertoire en contenant plusieurs . Voici comment créer un index:
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.
) Et c'est tout! Le modèle commencera à tourner et créera votre index, en exportant toutes les informations nécessaires au disque lors de sa réalisation. Vous pouvez ensuite utiliser la méthode RAGMultiModalModel.from_index("your_index_name") présentée ci-dessus pour le charger chaque fois que cela est nécessaire (vous n'avez pas besoin de le faire juste après l'avoir créé - il est déjà chargé en mémoire et prêt à partir!).
La principale décision que vous devrez prendre ici est de savoir si vous souhaitez définir ou non store_collection_with_index . S'il est défini sur true, cela simplifie considérablement votre flux de travail: la version codée de base64 des documents pertinents sera retournée dans le cadre des résultats de la requête, vous pouvez donc le tuer immédiatement sur votre LLM. Cependant, il ajoute des exigences de mémoire et de stockage considérables à votre index, vous pouvez donc le définir sur False (le paramètre par défaut) si vous êtes à court de ces ressources et créer vous-même les versions codées Base64 chaque fois que cela est nécessaire.
Une fois que vous avez créé ou chargé un index, vous pouvez commencer à rechercher des documents pertinents. Encore une fois, c'est une commande unique et très simple:
results = RAG . search ( query , k = 3 ) Les résultats seront une liste d'objets Result , que vous pouvez également traiter comme des dictionnaires normaux. Chaque résultat sera dans ce format:
[
{
"doc_id" : 0 ,
"page_num" : 10 ,
"score" : 12.875 ,
"metadata" : {},
"base64" : None
},
...
] page_num est indexé à 1, tandis que DOC_IDS est indexé. Il s'agit de simplifier à fonctionner avec d'autres outils de manipulation PDF, où la première page est généralement la page 1. page_num pour les images et les PDF d'une seule page seront toujours 1, il n'est utile que pour les PDF plus longs.
Si vous avez passé des métadonnées ou encodé avec le drapeau pour stocker les versions Base64, ces champs seront remplis. Les résultats sont triés par score, donc l'article 0 de la liste sera toujours le document le plus pertinent, etc ...
Étant donné que les index sont en mémoire, ils sont adaptés à l'ajout! Si vous avez besoin d'ingérer de nouveaux PDF, chargez simplement votre index avec from_index , puis appelez add_to_index , avec des paramètres similaires à la méthode index() d'origine:
RAG . add_to_index ( "path_to_new_docs" ,
store_collection_with_index : bool = False ,
...
)