Você sabia? No filme Ragatouille, o prato Remy faz na verdade não é um Ratatouille, mas uma versão refinada do prato chamada "confit byaldi".

Byaldi é o Mini Sister Project de Ragatouille. É um invólucro simples em torno do repositório Colpali para facilitar o uso de modelos multimodais de interação tardia, como Colpali, com uma API familiar.
Primeiro, um aviso: esta é uma biblioteca de pré-lançamento, usando índices não compactados e sem outros tipos de refinamentos.
Atualmente, apoiamos todos os modelos suportados pelo motor colpali subjacente, incluindo os pontos de verificação de Colqwen2 mais recentes e melhores, como vidore/colqwen2-v1.0 . Em termos gerais, o objetivo é que Byaldi apoie todos os modelos Colvlm.
Os back -ends adicionais serão suportados em atualizações futuras. Como Byaldi existe para facilitar a adoção de retrievers multimodais, pretendemos também adicionar suporte a modelos como Visrag.
Eventualmente, adicionaremos um mecanismo de indexação HNSW, agrupamento e, quem sabe, talvez quantização de 2 bits?
Ele será atualizado à medida que o ecossistema multimodal se desenvolve mais!
Para converter PDF em imagens com uma licença amigável, usamos a Biblioteca pdf2image . Esta biblioteca exige que poppler seja instalado no seu sistema. O Poppler é muito fácil de instalar seguindo as instruções em seu site. O tl; dr é:
MacOS com homebrew
brew install popplerDebian/Ubuntu
sudo apt-get install -y poppler-utilsGemma usa uma versão recente do Flash Atenhe. Para fazer as coisas funcionarem o mais suave possível, recomendamos que você o instale após a instalação da biblioteca:
pip install --upgrade byaldi
pip install flash-attnColpali usa modelos de parâmetros de bilhões de bilhões para codificar documentos. Recomendamos o uso de uma GPU para operações suaves, embora as GPUs fracas/mais antigas estejam perfeitamente bem! A codificação de sua coleção sofria de baixo desempenho na CPU ou MPS.
byaldiByaldi é amplamente modelado após Ragatouille, o que significa que tudo é projetado para obter o menor número de linhas de código possível, para que você possa construir rapidamente rapidamente, em vez de gastar tempo para descobrir como criar um pipeline de recuperação.
Carregar um modelo com byaldi é extremamente simples:
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" )Se você já tem um índice e deseja carregá -lo junto com o modelo necessário para consultá -lo, você pode fazê -lo com a mesma facilidade:
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" ) Criar um índice com byaldi é simples e flexível. Você pode indexar um único arquivo PDF, um único arquivo de imagem ou um diretório contendo vários deles . Veja como criar um í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.
) E é isso! O modelo começará a girar e criará seu índice, exportando todas as informações necessárias para o disco quando estiver concluído. Você pode usar o método RAGMultiModalModel.from_index("your_index_name") apresentado acima para carregá -lo sempre que necessário (você não precisa fazer isso logo após criá -lo - ele já está carregado na memória e pronto para ir!).
A principal decisão que você deve tomar aqui é se deseja definir store_collection_with_index como true ou não. Se definido como true, simplifica muito o seu fluxo de trabalho: a versão codificada por Base64 dos documentos relevantes será retornada como parte dos resultados da consulta, para que você possa transmiti-lo imediatamente ao seu LLM. No entanto, ele adiciona consideráveis requisitos de memória e armazenamento ao seu índice; portanto, você pode defini -lo como False (a configuração padrão) se você estiver com pouca desses recursos e criar as versões codificadas BASE64 sempre que necessário.
Depois de criar ou carregar um índice, você pode começar a pesquisar documentos relevantes. Novamente, é um comando único e muito direto:
results = RAG . search ( query , k = 3 ) Os resultados serão uma lista de objetos Result , que você também pode tratar como dicionários normais. Cada resultado estará neste formato:
[
{
"doc_id" : 0 ,
"page_num" : 10 ,
"score" : 12.875 ,
"metadata" : {},
"base64" : None
},
...
] page_num são 1 indexado, enquanto o DOC_IDS é indexado em 0. Isso é para simplificar operar com outras ferramentas de manipulação em PDF, onde a primeira página é geralmente página 1 page_num
Se você passou por metadados ou codificado com o sinalizador para armazenar as versões Base64, esses campos serão preenchidos. Os resultados são classificados por pontuação, então o item 0 da lista sempre será o documento mais relevante, etc ...
Como os índices estão na memória, eles são favoráveis! Se você precisar ingerir alguns novos PDFs, basta carregar seu índice com from_index e, em seguida, ligue para add_to_index , com parâmetros semelhantes ao método Original index() :
RAG . add_to_index ( "path_to_new_docs" ,
store_collection_with_index : bool = False ,
...
)