今天是2024年4月8日,星期一,北京,天气晴,新的一周。
我们先来看看昨日大模型早报,如下:
主要关注长文本评估、RAG综述性整理openRAGbase、手机端侧agent模型、RAG与长文本争论、文搜视频方案以及大模型和数据分析的结合工作,此外,在开源模型侧,RWKV-6模型发布。
我们再回到技术本上,看看penRAG Base:RAG的开源开放知识库、文搜视频的一些可行的方案以及RAG进展之Gecko-embeddding方案。
供大家一起参考并思考。
一、先从OpenRAG Base:RAG的开源开放知识库说起 OpenRAG Base(https://openrag.notion.site/Open-RAG-c41b2a4dcdea4527a7c1cd998e763595)是OpenRAG开放项目中的一个部分,定位是RAG知识库。
目的是为读者提供前沿的RAG资料汇总,提供多维度的分析,包括:学术论文、前沿资讯和文章、RAG评估与基准、下游任务与数据集、工具与技术栈、研究学者与机构汇总以及专题汇报等专题,由openkg推出(https://mp.weixin.qq.com/s/MZ4jSH1torrEpYGTLTkiEw)
例如,其对当前一些主流学术论文的整理:
又如,评估部分,收录了RAB, RAGA等评估方案:
以RAGAS为例,可以找到对应的论文索引介绍:
又如,其对RAG现有一些数据集的整理:
这些对应RAG入门以及一些从业人员来说,都是一个很好的参考项目,感兴趣的可以多关注。
二、再看关于文搜视频的一些可行的方案 关于文搜视频,也就是文本-视频匹配的任务,其核心在于,如何计算文本和视频的相似度,这个昨天社区有在讨论。
从技术实现路线上,大体可以分成三种:
1、视频转文,转text2text匹配
其思想在于抽帧,转图片,用clip,用这个Video ReCap模型,先生成文本,其作为一种递归视频字幕模型,可处理超长视频(如长达数小时的视频),并输出多层次的视频字幕:短视频片段字幕、中视频段描述和长视频摘要。
在实现思路上,首先,该模型为几秒钟的短视频片段生成字幕。随着层级的上升,模型使用稀疏采样的视频特征和上一层级生成的字幕作为输入,生成当前层级的视频字幕。
开源地址:https://github.com/md-mohaiminul/VideoRecap?tab=readme-ov-file
2、视频切帧转图片,做text2image匹配
可以视频部分是抽取关键帧,然后用CLIPembedding,用户的检索词也用的clip做embedding,存向量库检索相似度。
这块可以采用Chinese-CLIP,其为CLIP模型的中文版本,使用大规模中文数据进行训练(~2亿图文对),可以快速实现中文领域的图文特征&相似度计算、跨模态检索、零样本图片分类等任务,Chinese-CLIP目前开源5个不同规模。可以传入指定图片(示例)和文本,提取图文特征向量并计算相似度:
import torch from PIL import Image import cn_clip.clip as clip from cn_clip.clip import load_from_name, available_modelsprint ("Available models:" , available_models()) # Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50'] device = "cuda" if torch.cuda.is_available() else "cpu" model, preprocess = load_from_name("ViT-B-16" , device=device, download_root='./' ) model.eval() image = preprocess(Image.open("examples/pokemon.jpeg" )).unsqueeze(0).to(device) text = clip.tokenize(["杰尼龟" , "妙蛙种子" , "小火龙" , "皮卡丘" ]).to(device) with torch.no_grad(): image_features = model.encode_image(image) text_features = model.encode_text(text) # 对特征进行归一化,请使用归一化后的图文特征用于下游任务 image_features /= image_features.norm(dim=-1, keepdim=True) text_features /= text_features.norm(dim=-1, keepdim=True) logits_per_image, logits_per_text = model.get_similarity(image, text) probs = logits_per_image.softmax(dim=-1).cpu().numpy()print ("Label probs:" , probs) # [[1.268734e-03 5.436878e-02 6.795761e-04 9.436829e-01]]
地址:https://github.com/OFA-Sys/Chinese-CLIP,https://arxiv.org/abs/2402.13250;
3、直接端到端,做text2video匹配
如果要端到端,可以直接将文本和视频对应的embedding进行对齐,例如用《clip4clip: An empirical study of clip for end to end video clip》 :(https://arxiv.org/abs/2104.08860)
其实现思路很简单:LIP4Clip的框架由三个部分组成,包括两个单模态编码器和一个相似性计算器。该模型将一对视频和文本作为输入。
对于输入视频,首先将输入视频采样为顺序帧(图像)。然后,将这些图像帧重塑为一系列扁平化的二维patch。这些patch通过线性斑块嵌入层映射到一维嵌入序列,然后输入到图像编码器中进行表示。最后,相似性计算器会预测这些帧的文本表示和表示序列之间的相似性得分。
对应的地址:https://github.com/ArrowLuo/CLIP4Clip
或者借鉴《CLIP2Video: Mastering Video-Text Retrieval via Image CLIP》:(https://arxiv.org/abs/2106.11097), 该工作提出CLIP2Video网络,以端到端的方式将图像-语言预训练模型转移到视频-文本检索中。视频语言学习领域的主要方法试图从大规模视频文本数据集中提炼视频的时空特征以及视频与语言之间的多模态交互。
在具体实现上,该工作利用预训练的图像-语言模型,将其简化为图像-语言共同学习的两阶段框架,并分别增强视频帧和视频-语言之间的时间关系,使其能够在相对较小的数据集上进行训练。
在对比语言-图像预训练(CLIP)模型捕捉空间语义的基础上,模型包含一个时差块(TemporalDifferenceBlock)和一个时序对齐块(TemporalAlignmentBlock),前者用于捕捉精细时序视频帧的运动,后者用于重新对齐视频片段和短语的标记,并增强多模态相关性。
而其中最为关键的是,如何进行模型评估,我们也可了解下:
MSR-VTT(《MSR-VTT: A Large Video Description Dataset for Bridging Video and Language 》,https://www.microsoft.com/en-us/research/wp-content/uploads/2016/06/cvpr16.msr-vtt.tmei_-1.pdf)数据集包含10,000个视频,每个视频包含20个字幕。
MSVD(《Masked Video Distillation: Rethinking Masked Feature Modeling for Self-supervised Video Representation Learning》,https://arxiv.org/pdf/2212.04500.pdf)数据集包含1,970个视频和大约80,000个字幕,其中训练、验证和测试视频分别为1200、100和670个。
VATEX(《VATEX: A Large-Scale, High-Quality Multilingual Dataset for Video-and-Language Research》, https://arxiv.org/abs/1904.03493)数据集包含34991个带有多语言注释的视频。训练分割包含25,991个视频。
但是,虽然有这些方案,但在实际应用过程中可以遵循不同的逻辑,例如:视频生文匹配>视频生图匹配>视频文本直接匹配,可控,速度快。
但不想搞太复杂,就搞摘要,切的细一点,分多个summary,然后走text2text匹配,果不想这么搞,那就切细一点帧,然后送clip,拿embedding,做text2image匹配。
接着,新的问题又出现了,也就是,这种如何知识图谱结合 。
实际上,这跟图谱关系不大,但是之前的多模态知识图谱有一定关联,例如把视频生成图谱或将视频里的实体进行识别,连接到图谱里,然后再做图谱匹配,或者图谱推荐,这些都是可以尝试的方案。
三、关于RAG进展之Gecko-embeddding方案 在RAG方面,大家主要集中在新的embedding检索模型上,例如,近期谷歌DeepMind发布Gecko(《Gecko: Versatile Text Embeddings Distilled from Large Language Models》,https://arxiv.org/pdf/2403.20327.pdf ),作为一种从LLM中蒸馏出来的多功能文本嵌入模型,其在LLM生成的合成数据集FRet 上进行训练。
在实现思路上,基于1.2B参数预训练模型的基础上进行预微调和微调,微调阶段使用natural question以及从网页中抓取的title-body text pairs等训练数据。
其中,很关键的是,如何进行微调数据合成,也就是使用LLM生成FRet。
如图所示,其FRet实现思路为:给定网络中的采样段落后,FRet首先利用LLM为该段落生成相关任务和查询(上图)。
在具体实现上,LLM被指示阅读一篇抽样的网络文章,并生成任务描述和任务的相关查询:
其中,𝑝seed是从网络语料库C中随机抽取的段落,PQG是固定提示。提示PQG对于每个示例都是相同的,并且由几个fewshot示例和说明组成。LLM生成任务描述𝑡,描述了检索的类型。
提示词的设计比较有趣,例如,“给定一个查询,找到一段有该查询答案的文章”(‘Given a query, find a passage that has the answer to the query’ )或“给定一条查询,找到允许您检查该查询是否为真的文章”(‘Given a query, find a passage that allows you to check whether the query is true or not’)。
通过对这种自由形式的任务描述进行采样,指导LLM生成广泛的查询,这些对后来被用来训练嵌入模型,使得模型将查询及其相应的指令与目标段落相关联。
然后,将每个查询和任务输入预先训练好的嵌入模型,以获得近邻段落,再由LLM对其进行评分,从而挖掘出正和负段落(下图)。
具体的,使用现有的嵌入模型来检索top𝑁邻居𝑃={𝑝1.𝑝(𝑁)}从语料库中给定生成的查询𝑞,然后,使用用于生成查询的相同LLM,根据它们与查询的相关性对这些检索到的段落进行排序。
具体来说,使用了两个fewshot提示LLM排名函数:查询可能性和相关性分类,查询可能性使用LLM来测量生成的查询的对数可能性;相关性分类使用LLM来测量给定查询的特定相关性标签的对数似然性。
有趣的是,这两种方式在不同的任务中都表现出色,因此将两种不同提示结果的排名与标准的倒数排名融合(RRF)方法进行集成,获得排名函数𝑅(𝑞,𝑝)。
多样性是其中一个很重要的点,FRet的多样性来源于两个方面。首先,网络语料库本质上包含各种主题和写作风格,如博客文章、新闻、类似维基百科的内容和论坛帖子。其次,通过在提示中添加许多不同的任务描述,我们鼓励LLM生成更多样的任务描述和更多样的查询。
最后生成的合成数据如下:
总结 本文主要介绍了三个方面的工作,一个是OpenRAG Base知识库,另一个是文搜视频的方案,最后一个是当前RAG-embedding的进展,这些实现思路都很有趣,尤其是在数据构造上,感兴趣的可以多多关注。
参考文献 1、https://arxiv.org/pdf/2403.20327.pdf
2、https://openrag.notion.site/Open-RAG-c41b2a4dcdea4527a7c1cd998e763595
关于我们 老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。