介紹 ColQwen-Omni:在各種模態中進行檢索

還記得 ColPali、ColQwen、DSE 嗎?這些模型引入了視覺文件檢索的概念:不再需要費力地從文件中提取文字進行處理,而是可以將文件頁面視為一系列影像(螢幕截圖),並訓練視覺語言模型 (VLM) 直接將其內容表示為向量。ColPali 已證明,與替代方法相比,這種策略通常更快、更簡單,並且能提供更好的檢索效能。ColPali 和 ColQwen 模型系列自大約一年前釋出以來,已被下載數百萬次,被提及為2024 年頂級人工智慧創新之一,並啟發了許多後續工作!模型實際上變得如此優秀,以至於我們的第一個基準(Vidore v1)現在過於簡單了!
VLM 的快速發展使得頂級模型能夠處理更多模態。令人驚歎的 Qwen-Omni 系列通常能夠在影像和文字之外處理音訊和影片輸入!看到這一點,我們立刻對是否能將 ColQwen 系列推廣到不僅嵌入和檢索文件影像,還能嵌入和檢索音訊片段和短影片產生了興趣。在 VisionRAG 之後,AudioRAG 是否可能?介紹 ColQwen-Omni (3B),它是 ColQwen2 的擴充套件,基本上可以嵌入你扔給它的任何內容!
使用示例
讓我們逐步瞭解如何使用它來檢索音訊片段!您可以在 Google Colab 中跟著操作。首先,讓我們載入模型
# !pip install git+https://github.com/illuin-tech/colpali
from colpali_engine.models import ColQwen2_5Omni, ColQwen2_5OmniProcessor
model = ColQwen2_5Omni.from_pretrained(
"vidore/colqwen-omni-v0.1",
torch_dtype=torch.bfloat16,
device_map="cuda",
attn_implementation="flash_attention_2").eval()
processor = ColQwen2_5OmniProcessor.from_pretrained("vidore/colqwen-omni-v0.1")
假設我們的目標是能夠查詢一個 30 分鐘長的播客。我們將播客分割成 30 秒的片段,並將每個片段以 WAV 格式儲存在 Python 列表中。
from pydub import AudioSegment
audio = AudioSegment.from_wav("<my_legally_downloaded_podcast>.wav")
# Set target frame rate
target_rate = 16000
chunk_length_ms = 30 * 1000 # 30 seconds
audios = []
for i in range(0, len(audio), chunk_length_ms):
chunk = audio[i:i + chunk_length_ms]
# Convert stereo to mono, sample at 16k Hz
chunk = chunk.set_channels(1).set_frame_rate(target_rate)
# Export and convert to numpy array
buf = io.BytesIO()
chunk.export(buf, format="wav")
buf.seek(0)
rate, data = wavfile.read(buf)
audios.append(data)
現在我們已經準備好嵌入所有音訊了。
from torch.utils.data import DataLoader
# Process the inputs by batches of 4
dataloader = DataLoader(
dataset=audios,
batch_size=4,
shuffle=False,
collate_fn=lambda x: processor.process_audios(x))
ds = []
for batch_doc in tqdm(dataloader):
with torch.no_grad():
batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}
embeddings_doc = model(**batch_doc)
ds.extend(list(torch.unbind(embeddings_doc.to("cpu"))))
在這裡,一個 30 分鐘的音訊可以在 10 秒內嵌入,而 30 秒的音訊我們得到了大約 800 個音訊標記!讓我們測試一下
def get_results(query: str, k=3):
batch_queries = processor.process_queries([query]).to(model.device)
# Forward pass
with torch.no_grad():
query_embeddings = model(**batch_queries)
scores = processor.score_multi_vector(query_embeddings, ds)
return scores[0].topk(k).indices.tolist()
res = get_results("<YOUR QUERY>")
print(f"The best audio chunks are: {res}")
#> The best audio chunks are: [102, 96, 35]
音訊片段 #102 和 96 在我的情況下完美相關!甚至可以將最相關的音訊片段傳送給 GPT-4o 進行端到端 AudioRAG!
讓我們用一段 30 分鐘關於漢尼拔和布匿戰爭的音訊來演示端到端的一切
完整的筆記本可以在這裡找到。
何時適合檢索音訊?
許多用例可能需要音訊檢索。例如,您可能希望在教育影片、錄製課堂或播客中查詢特定資訊。您可能需要從朋友的幾十條語音備忘錄中找到一條提及他們生日派對地址的語音備忘錄。呼叫中心經理可能會嘗試在數百萬條錄音中找到一些客戶笑聲或表達憤怒的例項。存在許多用例,儘管可以透過使用語音轉文字 (STT) 系統將音訊轉錄為文字,然後搜尋轉錄,但直接檢索音訊要快幾個數量級,並且直接音訊檢索能更好地捕捉情感、環境聲音和語調等資訊,從而開闢全新的可能性!
影片又如何?
影片也適用於 ColQwen-Omni。但是,請注意,影片處理非常佔用記憶體,因此它最適合短片段。
batch_videos = processor.process_videos(videos).to(model.device)
# Forward pass
with torch.no_grad():
video_embeddings = model(**batch_videos)
這裡有一個有趣的演示,展示了龍之母。
訓練
該模型的第一代是科學實驗的成果。我們探索了一個純粹在視覺文件檢索上訓練的模型,在訓練期間沒有接觸音訊或影片,是否能有效地將其嵌入能力遷移到其他模態。結果是:相當不錯!透過嚴格在 Vidore 訓練集上訓練,該模型在視覺文件檢索方面與當前頂級模型的效能相匹配,雖然我們暫時不建議在生產中使用該模型,但它在音訊檢索方面也表現出強大的效能。
在未來的迭代中,我們計劃將音訊片段專門納入對比訓練集,以進一步最佳化音訊檢索模型,這可能會顯著提升效能。當前模型在理解口語內容方面表現出色,但在理解口音、情感和環境聲音方面存在一些限制。我們相信,有針對性的訓練可以有效地解決這些問題,並歡迎對 v0.1 的任何反饋,以瞭解未來執行時要整合哪些資料!同時,colqwen-omni 的訓練程式碼可在我們的 Github 上獲取,並已準備好接收您的自定義資料集!我們的目標還將是改進模型在自然影像和文字檢索方面的效能——為真正模態無關的檢索器鋪平道路!
一些連結
📝 論文
🗃️ HF 組織
👀 模型
💻 程式碼
@misc{faysse2024colpaliefficientdocumentretrieval,
title={ColPali: Efficient Document Retrieval with Vision Language Models},
author={Manuel Faysse and Hugues Sibille and Tony Wu and Bilel Omrani and Gautier Viaud and Céline Hudelot and Pierre Colombo},
year={2024},
eprint={2407.01449},
archivePrefix={arXiv},
primaryClass={cs.IR},
url={https://arxiv.org/abs/2407.01449},
}