알고 있었나요? 영화 Ragatouille에서 Dish Remy Makes는 실제로 Ratatouille이 아니라 "Confit Byaldi"라는 요리의 세련된 버전입니다.

Byaldi는 Ragatouille의 미니 자매 프로젝트입니다. Colpali 저장소 주변의 간단한 래퍼로, 친숙한 API와 함께 Colpali와 같은 후기 간중 멀티 모달 모델을 쉽게 사용할 수 있습니다.
첫째, 경고 : 이것은 압축되지 않은 인덱스를 사용하고 다른 종류의 개선이 부족한 사전 방출 라이브러리입니다.
현재 vidore/colqwen2-v1.0 과 같은 최신 및 더 나은 Colqwen2 검문소를 포함하여 기본 콜 팔리 엔진이 지원하는 모든 모델을 지원합니다. 대체로, Byaldi가 모든 Colvlm 모델을 지원하는 것입니다.
향후 업데이트에서 추가 백엔드가 지원됩니다. Byaldi가 다중 모달 리트리버의 채택을 용이하게하기 위해 존재하므로 Visrag와 같은 모델에 대한 지원을 추가하려고합니다.
결국, 우리는 HNSW 인덱싱 메커니즘, 풀링 및 누가 2 비트 양자화를 추가할까요?
다중 모달 생태계가 더 발전함에 따라 업데이트됩니다!
친절한 라이센스가있는 PDF를 이미지로 변환하려면 pdf2image 라이브러리를 사용합니다. 이 라이브러리는 시스템에 poppler 설치해야합니다. Poppler는 웹 사이트의 지침에 따라 설치가 매우 쉽습니다. tl; dr은 다음과 같습니다.
홈브류와 마코
brew install poppler데비안/우분투
sudo apt-get install -y poppler-utilsGemma는 최근 버전의 플래시주의를 사용합니다. 가능한 한 원활하게 실행하려면 라이브러리를 설치 한 후 설치하는 것이 좋습니다.
pip install --upgrade byaldi
pip install flash-attnColpali는 수십억 개의 매개 변수 모델을 사용하여 문서를 인코딩합니다. 약/오래된 GPU는 완벽하게 괜찮지 만 원활한 작업을 위해 GPU를 사용하는 것이 좋습니다! 컬렉션을 인코딩하면 CPU 또는 MP의 성능이 저하됩니다.
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-Indexed입니다. 이는 다른 PDF 조작 도구와 함께 더 간단하게 작동하는 것이며, 여기서 첫 번째 페이지는 일반적으로 1 페이지입니다. page_num 이미지 및 단일 페이지 PDF는 항상 1이므로 PDF가 더 긴 PDF에만 유용합니다.
메타 데이터를 전달하거나 플래그로 인코딩하여 Base64 버전을 저장하면이 필드가 채워집니다. 결과는 점수별로 정렬되므로 목록의 항목 0은 항상 가장 관련성이 높은 문서 등입니다 ...
인덱스는 메모리 내이므로 추가 친숙합니다! 새로운 PDF를 수집 해야하는 경우 from_index 로 색인을로드 한 다음 Original index() 메소드와 유사한 매개 변수로 add_to_index 호출하십시오.
RAG . add_to_index ( "path_to_new_docs" ,
store_collection_with_index : bool = False ,
...
)