知っていましたか?映画Ragatouilleでは、レミーが作る料理は実際にはラタトゥイユではなく、「Confit Byaldi」と呼ばれる料理の洗練されたバージョンです。

ByaldiはRagatouilleのミニ姉妹プロジェクトです。これは、Colpaliリポジトリの周りのシンプルなラッパーであり、馴染みのあるAPIを備えたColpaliなどの後期インタラクションマルチモーダルモデルを簡単に使用できるようにします。
まず、警告:これは、圧縮されていないインデックスを使用して、他の種類の改良を欠いているリリース前ライブラリです。
現在、 vidore/colqwen2-v1.0などの、より新しい、より良いColqwen2チェックポイントを含む、基礎となるColpaliエンジンによってサポートされるすべてのモデルをサポートしています。概して、目的は、バイアルディがすべてのCOLVLMモデルをサポートすることです。
追加のバックエンドは、将来の更新でサポートされます。 Byaldiは、マルチモーダルレトリバーの採用を促進するために存在するため、Visragなどのモデルのサポートも追加するつもりです。
最終的には、HNSWのインデックス作成メカニズム、プーリング、そして誰が知っているのか、おそらく2ビットの量子化を追加しますか?
マルチモーダルエコシステムがさらに発展するにつれて、更新されます!
PDFをフレンドリーなライセンスで画像に変換するには、 pdf2imageライブラリを使用します。このライブラリでは、システムにpopplerをインストールする必要があります。 Popplerは、ウェブサイトの指示に従うことで、インストールが非常に簡単です。 tl; dr is:
自家製のマコー
brew install popplerDebian/Ubuntu
sudo apt-get install -y poppler-utilsGemmaは、Flash Anterestionの最近のバージョンを使用しています。物事を可能な限りスムーズに実行するには、ライブラリをインストールした後にインストールすることをお勧めします。
pip install --upgrade byaldi
pip install flash-attnColpaliは、数十億パラメーターモデルを使用してドキュメントをエンコードします。弱い/古いGPUはまったく問題ありませんが、滑らかな操作にGPUを使用することをお勧めします!コレクションをエンコードすると、CPUまたはMPSのパフォーマンスが低下します。
byaldiの使用ByaldiはRagatouilleを主にモデル化しているため、すべてが可能な限り少ないコードを使用するように設計されているため、検索パイプラインの作成方法を考え出すのに時間を費やすのではなく、非常に迅速に構築できます。
byaldiでモデルをロードすることは非常に簡単です:
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" )既にインデックスがあり、それを照会するのに必要なモデルと一緒にロードしたい場合は、同じように簡単に行うことができます。
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" )byaldiでインデックスを作成するのはシンプルで柔軟です。単一のPDFファイル、単一の画像ファイル、またはそれらの倍数を含むディレクトリをインデックスできます。インデックスの作成方法は次のとおりです。
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.
)そしてそれだけです!モデルはスピンを開始し、インデックスの作成を開始し、必要なすべての情報を完成したときにディスクにエクスポートします。その後、上記のRAGMultiModalModel.from_index("your_index_name")メソッドを使用して、必要なときにいつでもロードすることができます(作成後すぐにこれを行う必要はありません。
ここで行わなければならない主な決定は、 store_collection_with_index trueに設定するかどうかです。 Trueに設定すると、ワークフローが大幅に簡素化されます。関連するドキュメントのBase64エンコードバージョンがクエリ結果の一部として返されるため、すぐにLLMにパイプできます。ただし、インデックスにかなりのメモリとストレージの要件が追加されるため、それらのリソースが不足している場合はfalse(デフォルト設定)に設定し、必要に応じてBase64エンコードされたバージョンを自分で作成することをお勧めします。
インデックスを作成またはロードしたら、関連するドキュメントの検索を開始できます。繰り返しますが、それは単一の非常に簡単なコマンドです:
results = RAG . search ( query , k = 3 )結果はResultオブジェクトのリストであり、通常の辞書としても扱うことができます。各結果はこの形式になります:
[
{
"doc_id" : 0 ,
"page_num" : 10 ,
"score" : 12.875 ,
"metadata" : {},
"base64" : None
},
...
] page_numは1インデックスされ、doc_idsは0インデックス化されています。これは、他のPDF操作ツールで操作できるようにするためです。最初のページは通常1ページです。画像とシングルページPDFのpage_num常に1です。これは、より長いPDFSにのみ役立ちます。
メタデータを通過するか、フラグでエンコードしてbase64バージョンを保存すると、これらのフィールドが入力されます。結果はスコアによってソートされるため、リストのアイテム0は常に最も関連性の高いドキュメントなどになります...
インデックスはメモリであるため、追加に優しいです!いくつかの新しいPDFを摂取する必要がある場合は、 from_indexでインデックスをロードしてから、元のindex()メソッドと同様のパラメーターを使用して、 add_to_index呼び出してください。
RAG . add_to_index ( "path_to_new_docs" ,
store_collection_with_index : bool = False ,
...
)