接下来的几篇相关的文章,聊聊使用 Dify 和 AI 大模型理解视频内容。
本篇作为第一篇内容,以昨天出圈的“黑神话悟空制作人采访视频”为例,先来聊聊经常被国外厂商拿来对比的国产模型:千问系列,以及它的内测版。
最近一两周有好几位朋友线下聚的时候,聊起了端侧多模态模型,以及用端侧多模态模型做 RPA 和一些内容识别相关的业务场景。在展开聊这些内容前,我觉得或许可以先从“为个人偷懒”角度,来聊聊模型的使用:用模型替我刷视频,找到我忽略的细节。
黑神话悟空,制作人专题采访
昨天晚上刷知乎的时候,在问题列表中看到了一个有趣的问题“如何看待2024年8月新华社记者采访《黑神话悟空》制作人团队?[1]”,点开问题看到了黑神话悟空制作人的新华社专题采访[2]:“踏上取经路,比抵达灵山更重要”。
这是一个 32 分钟 27 秒的中长视频,借助当前多模态大模型直接进行解析,恐怕是不行的:或受限于显存资源限制、或受限于模型前端程序能够抽取和解析的视频长度。
但是,只要结合一丢丢工程化,写一点篇幅短的小程序,进行一些简单的操作,就能够完成对这类视频的处理啦。
比如,提取所有的视频关键帧。
使用小技巧提取视频的关键帧
再比如,调整合适的 Prompt 提示词,让 Qwen2 VL 72B 模型来解析画面内容。
使用 Dify 和 Qwen2 VL 解析视频画面
以及,用千问大语言模型,再来一些原汤化原食,结合字幕时间轴,来完成对视频的详细的逐帧式介绍,或者任意视频的“对话”。其实,也可以使用千问音频模型,我比较懒(想玩游戏啦),下次再整。
随便和视频进行对话
本文使用的示例代码,我已经开源在了 soulteary/dify-with-qwen-vl[3],有需要可以自取,欢迎一键三连。
好了,让我们开始实战。
关于通义 VL 多模态大模型
考虑到可能有读者还不了解通义 VL 模型,这里做一个简单的介绍,以及为什么本文使用的模型是通义 VL 2(内测版)。
2023 年 8 月 22 日,通义团队开源了 Qwen VL 模型[4],这个基于 Qwen 7B 的多模态模型,2K Token 用一张 24G 卡就能跑起来(8K Token 需要 28G+ 显存)。月底的时候,官方推出了量化版本 Qwen VL Chat Int4[5],在效果只降低了 3% 的情况下,2K Token 只需要 11G+ 的显存,8K Token 也只需要 17G 显存,降低了不少入门门槛。
这款模型的商业版本 Qwen VL Plus 和 Qwen VL Max 版本随后也“上架”了阿里云,并可以使用 API 进行访问。
使用 Dify 和 Qwen2 VL 解析视频画面
当我们在 Dify 中配置了阿里云的 API Key 之后,就能够进行自由的调用啦。
哦豁,魔搭上新了
至于这篇文章中使用的 Qwen2 VL,来自我一边刷上文中提到的视频,一遍刷魔搭社区的时候,出现在我信息流顶部的模型消息。
关于视频帧抽取方案
之前的文章《使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(一)[6]》和《开源软件 FFmpeg 生成模型使用图片数据集[7]》中,提到过使用 ffmpeg 来从视频中抽取关键帧,以供大模型解析使用。
但是,简单粗暴的采样方案,其实并不是最优解,会遗失大量有效信息。所以,选择一个合适的方案就非常关键。我相信很多同学和我一样,并非 CV 或多媒体相关从业背景,那么,如何快速的获得相对靠谱的技术方案选型呢?
之前的文章里,我分享过太多的,使用先进模型(内化知识)获取知识的技巧。最近半年,知乎原本内测的模型(知乎直答[8])也进行了优化(强化了检索能力),能够结合知乎站内大神们的经验,来提供参考的技术方案选型。
使用知乎“直达”快速获取参考方案
是不是看起来还挺全面的,在获取到类似上面的经验之后,接下来的任务就非常简单了,对上面的方案进行正确性判断和进一步理解:你可以继续使用知乎直答,或者将已经得到的知乎站内的大神经验,结合更先进的模型一起用,进行扩展或细节追问。
本文中,我的选择是“基于镜头转换的方法的视频关键帧抽取”,方案名字很长,但其实简单写一些代码,就能够实现这部分功能了(带注释 70 行左右):
上面的代码还比较粗糙,接下来的实战中,我们将一点点进行改进。
本文的准备工作很简单,如果你是我的老读者,已经有顺手就能使用的 Dify,那么只需要准备一个简单的 Python 环境,下载一个想分析的视频即可。
Dify 的安装使用
关于 Dify 的安装和使用,在之前 Dify 相关的文章[9]中有提到过,所以就不再赘述。
考虑到开箱即用,后续或许会单独写一个小工具,来更简单的完成 Dify 的安装和组件选配。
获取要解析的视频文件
上文提到了,我们要对悟空制作人专访视频进行分析,所以,要对视频进行下载,你可以使用任何你喜欢的方式,完成视频的下载。或者,替换视频为你想分析的视频。
随便使用什么方式,完成视频的下载
将视频文件命名为 ,我们稍后使用。
CONDA 环境准备
因为本文主要使用 API 的方式(毕竟内测模型嘛,权重还未开放下载)来进行模型调用,本地并不需要 CUDA 和相关的性能优化组件,对运行环境没有那么大的要求。所以这篇文章就使用更轻量的 CONDA,来完成环境准备。
如果你想进行复现,使用阿里云灵积[10]上的 Qwen VL Plus 或 Max 版本,或者本地运行上文提到的 Qwen VL 模型 1.0 版本,然后将接口配置到 Dify 中即可。
CONDA 的安装,可以参考《用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频[11]》这篇文章来进行安装。
不同的操作系统安装过程,除了下载安装包不同之外,几乎没有差别,先完成安装包的下载:
然后,“双击安装包”,进行安装:
完成安装后,更新配置文件 软件源为清华源,来加速软件包下载:
当我们完成了 的内容修改之后,先重启 Shell,接着使用 命令就可以检查软件源是否配置成功了:
完成上面的操作后,我们执行下面的命令,创建一个干净的环境,能够对视频进行抽帧处理:
好了,准备工作到此结束,开始折腾。
下面我们开一步步了解视频是如何能够被模型理解和处理的,以相对最低的模型调用成本。
完成基础的视频内容解析
让我们先从最简单的方法开始,在使用上文中的 Python 抽取视频关键帧程序前,执行命令,完成必要的依赖安装:
接下来,我们将上文中的代码,保存为 、将准备好的使用命名为 ,然后执行下面的命令,让程序对视频进行处理。
如果命令执行后,没有任何反馈,看起来和进程假死一样,是正常的。默认情况下,我们将对原始视频进行分析,原始视频中的画幅比较大、帧率比较高(每秒画面),程序的计算量是非常大的。
如果你没有使用性能比较强劲、内存也比较大的设备,此时程序先会逐帧剥离视频内容到内存进行缓存(50GB空间使用,空间不足将使用磁盘进行暂存置换),然后再进行大量的画面比对计算。听起来是不是就很花时间?
抽取视频的关键帧
当然,如果你耐心比较好,手头有其他事情在做,大概刷一个长视频后,关键帧就抽取好了。因为使用的是原始视频的画面,清晰度是非常高的,非常利于模型进行画面细节分析。
对视频原始画面进行解析
接下来,我们只需要调用 Dify 的 API,来批量的完成这些图片内容的处理,就能够得到整个视频的画面内容了。
不过,在此之前,这个效率问题得解决解决,不然遇到画幅更大的视频、或者时间更长的视频,解析时间可能比我们刷两遍视频都长,虽然也偷懒了,但是不够高效。
小技巧:适当压缩视频画幅
我们先使用一个小技巧,对视频画幅进行压缩,来同时降低模型和程序的计算量,提升处理效率。这个小技巧在《开源软件 FFmpeg 生成模型使用图片数据集[12]》中有提到过,与此同时,如果你的设备有 GPU,我们还能够进行进一步加速,同样在文章中有提到过,就不再展开。
简单执行命令,我们可以将 压缩到 320 宽幅,保存为 。
执行命令后,稍等片刻(我这里的笔记本是 50x 倍速处理),我们就能够得到小体积的视频文件啦:
如果我们使用命令查看文件体积,能够看到体积有了明显的缩小:
再次执行抽帧程序前,我们对程序进行一点点改造,将程序最下方的 调整为下面的内容:
接着,我们再次执行命令,进行视频的预处理:
在我的笔记本上,大概花了 27 秒多,就完成了这个 30 分钟的视频的处理。和之前的处理结果基本一致,只是画面尺寸缩小了不少。
不过,这样处理出来的图片,并不建议直接喂给大模型进行处理,为什么呢?
小画幅的视频清晰度不够
我们将新抽取的视频帧传给模型,能够看到模型并不能够正确处理画面中的文本,因为:画面太模糊了。
有没有两全齐美的方案,既要画面清晰,又要处理速度相对快呢?
完成高效的视频抽取方案
如果我们先对视频进行画幅缩小处理,以及关键帧抽取,然后将抽取的关键帧替换为原始视频中比较大的视频帧,不就行了嘛。
首先,实现一个简单的程序,来将抽取关键帧能够按照视频中原始帧数序号进行保存(使用六位数字,支持 170 小时 30fps 的视频,你可以调整更大一些)。
接着,写一段简单的程序,从之前的处理结果中,获取要被保存的关键帧,并重新从原始视频中抽取保存:
程序执行后,就是爽快的日志翻滚:
原始画面确实是清晰不少吧
得到了清晰的画面后,我们就可以开始让模型为我们偷懒啦。
使用 Dify 调试合适的解析 Prompt
首先,还是在你的 Dify 首先创建一个 AI 应用:我取了一个稍显活泼的名字,你可以根据自己的需求来。
创建一个 AI 应用
创建完应用后,我们来完成模型的参数配置:
完成模型超参数配置
这里参数配置的考量主要有两部分,我希望模型相对快和相对严谨的处理完我的大几百张视频画面的,所以我要给它一个相对小的 Token 输出限制,和一个比较低的“温度”。
继续进行 AI 应用的配置:
完成应用的配置信息
这里,我们暂时不展开 Dify 好用的变量定义功能,就使用默认的功能,打开“模型视觉支持功能”,让调试界面支持上传图片。以及调试一个你觉得还凑合的 Prompt 即可,我使用的是下面的内容:
因为有大几百张图片,我希望获取的信息中的冗余信息比较少,所以要求模型去掉了水印描述信息,不然几百个水印相关的描述,得浪费不少时间和 Token 数。
挑选一张图片幸运儿进行验证
我随手选了一张图片进行验证。
在聊天窗口输入我们要解析的图片
在聊天窗口中,输入这张图片,和一段还凑合的启动词,等待模型处理图片。
验收模型处理结果
稍等片刻,模型就给出了一个还不错的处理结果。
使用 Dify API 完成整个视频的处理
当我们设置好 AI 应用的模型配置和应用配置之后,我们就可以通过 Dify API 来完成批量化的程序调用了。
使用 Dify API 对视频进行解析
我们使用的是图片多模态模型,所以需要上传图片给模型应用。为了简化处理方式,我们可以在接口调用的时候,设置 并携带一个可被 Dify 程序访问的 URL。
还记得上一篇文章《Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务[13]》中提到的 MinIO 吗?简单几步设置,创建一个本地的可公开访问的“存储空间”,将图片传到 MinIO 中,就能够获得程序可用的视频关键帧 URL 地址了。
下面以 MinIO 为例,使用云服务对象存储也同理:
创建一个文件存储桶
在创建存储桶之后,可以考虑设置权限为公开(或者使用密钥或 SDK 访问):
设置本地的 S3 服务访问权限为公开
因为我的服务是在本地启动,和 Dify 在相同的网络环境,所以我就设置为公开权限了。
将视频关键帧上传
将刚刚获取的视频关键帧上传至 MinIO,大概 1-2s 图片就都上传完毕了。
上传到 MinIO 的视频关键帧
当图片上传结束后,我们可以在 MinIO 的控制台中预览图片内容,确认内容是否正确。以及,使用类似下面的地址,来访问图片:
接下来,就是编写一段简单的程序,将所有的图片都通过模型来跑一遍啦。
在上面的程序里,我们首先允许本地 Python 程序调用 Dify API,因为我使用的本地 Dify 是自签名证书,所以我在程序里设置接受自签名证书。接着,我们将 Dify API 界面生成的 API Key 配置到程序中,使用 Dify 调用方式对图片内容进行逐张的调用,因为我比较懒,采用的是将图片 URL 传递给模型,所以这里,我们需要提供 Dify 能够访问到的图片地址。
模型的接口的处理结果
最后,将模型处理结果保存在本地,以待最终的程序进行整合处理。
对了,因为这段程序使用了异步 IO 库,所以在执行程序之前,我们还需要安装一个 Python 依赖:
使用 Dify 或者 Chat 模型分析视频
当我们得到了包含视频所有不同镜头关键帧的内容后,就可以进行最终模型处理了。
这里有许多种不同的方案,你可以选择使用 Dify 再创建一个新的应用。或者直接将文本内容复制粘贴到各种 Chat 模型里,然后输入一小段简单的提示词:
然后,等待模型输出内容即可:
和我们平时使用模型没什么区别,我们可以进一步进行定制化的请求:
这个请求的输出结果如下:
我们还可以再结合视频模型的独有画面解析能力,再进行追问:
输出结果如下:
上面这些交互过程,我们可以使用 Dify 完整封装为一条自动化的 AI 流水线,然后处理各种不同的视频。当我们看到有意思的视频,但是视频本身比较长的时候,担心被营销内容欺骗,就可以使用类似上面的方法,来快速的扫描下内容是不是符合自己的胃口,或者快速的和“视频画面”进行对话,来获取想要的信息,是不是还蛮有意思的?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。