ColQwen-Omni:RAG全模态检索来了,支持【文本|图像|视频|音频】四种模态!

技术

picture.image

还记得 ColPali、ColQwen 和 DSE 吗?这些模型开创了视觉文档检索 的新范式:无需费力地从文档中提取文本进行处理,只需将文档页面视为一系列图像(屏幕截图),然后训练视觉语言模型(VLM)直接将其内容表示为向量。ColPali 的实践表明,这种策略通常比其他替代方法更快、更简单,并且能带来更好的检索性能。

自发布一年以来,ColPali 和 ColQwen 系列模型已被下载数百万次,被誉为 “2024 年顶级人工智能创新” 之一,并激发了许多后续研究!这些模型的效果甚至好到vidore最初的基准测试(Vidore v1)现在都“显得过于简单”!picture.image

视觉语言模型(VLM)的快速发展使得顶尖模型能够处理更多模态的数据。例如,令人惊叹的 Qwen-Omni 系列模型就能够处理音频和视频输入,而不仅仅是图像和文本!鉴于此,vidore立即产生了兴趣:是否可以将 ColQwen 系列模型泛化,使其不仅能嵌入和检索文档图像,还能处理音频片段和短视频?继视觉检索增强生成(VisionRAG)之后,音频检索增强生成(AudioRAG)是否也成为可能?

现在,vidore正式推出ColQwen-Omni (3B) —— 它是 ColQwen2 的扩展,基本上可以嵌入你输入的任何模态的数据!

原文HF博客:https://huggingface.co/blog/manu/colqwen-omni-omnimodal-retrieval

示例用法

让vidore一步步演示如何使用 ColQwen-Omni 检索音频片段!你可以在 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")  
  

假设vidore的目标是查询一个长达 30 分钟的播客。vidore可以将播客分割成 30 秒的片段,并将每个片段以 WAV 格式存储到一个 Python 列表中。

  
from pydub import AudioSegment  
  
audio = AudioSegment.from\_wav("<my\_legally\_downloaded\_podcast>.wav")  
# 设置目标采样率  
target\_rate = 16000  
chunk\_length\_ms = 30 * 1000  # 30 秒  
audios = []  
for i in range(0, len(audio), chunk\_length\_ms):  
    chunk = audio[i:i + chunk\_length\_ms]  
    # 将立体声转换为单声道,并以 16k Hz 采样  
    chunk = chunk.set\_channels(1).set\_frame\_rate(target\_rate)  
    # 导出并转换为 numpy 数组  
    buf = io.BytesIO()  
    chunk.export(buf, format="wav")  
    buf.seek(0)  
    rate, data = wavfile.read(buf)  
    audios.append(data)  
  

现在,vidore已经准备好嵌入所有的音频数据。

  
from torch.utils.data import DataLoader  
# 以 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 个音频标记!让vidore进行一个测试:

  
def get\_results(query: str, k=3):  
    batch\_queries = processor.process\_queries([query]).to(model.device)  
    # 前向传播  
    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"最相关的音频片段是: {res}")  
#> 最相关的音频片段是: [102, 96, 35]  

在我的测试中,音频片段 #102 和 #96 完全相关!甚至可以将最相关的音频片段发送给 GPT-4o,以实现端到端的 AudioRAG!

让vidore用一个关于汉尼拔和布匿战争的 30 分钟音频来演示整个流程,下面是基于音频的RAG问答:picture.image

完整的 Notebook 可以在 这里 找到。

https://github.com/ManuelFay/Tutorials/blob/main/Practical\_3\_AudioRAG.ipynb

什么时候需要检索音频?

许多用例可能需要音频检索。例如,你可能想在教育视频、录制的课程或播客中找到特定信息。你可能需要从朋友的几十条语音信息中,找到那条提到生日派对地址的语音。呼叫中心经理可能试图在数百万条录音电话中,找到几例客户大笑或表达愤怒的实例。

尽管可以使用语音转文本(Speech-to-Text, STT)系统将音频转录成文本,然后搜索转录内容,但直接检索音频要快得多,并且直接音频检索能更好地捕捉情感、环境声音和语音语调等信息,从而开启全新的可能性!

视频检索表现如何?

ColQwen-Omni 也适用于视频。但请注意,视频处理对内存开销很大,因此最适合处理短视频片段。

  
batch\_videos = processor.process\_videos(videos).to(model.device)  
# 前向传播  
with torch.no\_grad():  
    video\_embeddings = model(**batch\_videos)  
  

这里有一个关于“龙之母”的有趣演示。 输入查询关键词:

picture.image

模型训练

该模型的首次迭代是科学实验的成果。vidore探索了一个纯粹在视觉文档检索数据集上训练的模型,在未接触音频或视频训练数据的情况下,能否有效地将其嵌入能力迁移到其他模态。结果表明:效果还相当不错!通过严格在 Vidore 训练集上进行训练,该模型在视觉文档检索方面与当前顶尖模型表现相当,而且在音频检索方面也展现出强大的性能,尽管vidore目前还不建议将其用于生产环境。

在未来的迭代中,vidore计划专门将音频剪辑整合到对比训练集中,以进一步优化模型的音频检索能力,这有望显著提升性能。当前模型在理解口语内容方面表现出色,但在理解口音、情感和环境声音方面仍存在一些局限性。vidore相信,通过有针对性的训练可以有效解决这些问题,并欢迎对 v0.1 版本提供任何反馈,以便vidore了解未来运行中应整合哪些数据!同时,ColQwen-Omni 的训练代码已在vidore的 GitHub 上提供,随时可以接收你的定制数据集!vidore的目标还将是改进模型在自然图像和文本检索方面的表现,为实现真正与模态无关的检索器铺平道路!

picture.image

添加微信,备注” LLM “进入大模型技术交流群

picture.image

picture.image

如果你觉得这篇文章对你有帮助,别忘了点个赞、送个喜欢

/ 作者:致Great

/ 作者:欢迎转载,标注来源即可

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生数仓如何构建高性能向量检索技术
火山引擎ByteHouse团队基于社区 ClickHouse 进行技术演进,提出了全新的向量检索功能设计思路,满足业务对向量检索稳定性与性能方面的需求。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论