使用Mixpeek多模态嵌入实现视频搜索
通过Mixpeek多模态嵌入API和Supabase Vector实现视频搜索功能
Mixpeek Embed API 允许您为各类内容生成嵌入向量,包括视频和文本。这些嵌入向量可用于:
- 文本到视频/视频到文本/视频到视频/文本到文本搜索
- 基于自有视频和文本数据的微调
本指南演示如何结合使用 Mixpeek Embed(用于视频处理和嵌入生成)与 Supabase Vector(用于存储和查询嵌入向量)来实现视频搜索功能。
完整应用代码可在 GitHub 上获取,这是一个基于 Python Poetry 的项目。
使用 Poetry 创建 Python 项目
Poetry 为 Python 提供包管理和依赖管理功能。如未安装,请通过 pip 安装:
1pip install poetry
然后初始化新项目:
1poetry new video-search
配置 Supabase 项目
如未安装,请先安装 Supabase CLI,然后在新创建的 poetry 项目根目录中初始化 Supabase:
1supabase init
接着启动本地 Supabase 服务栈:
1supabase start
这将启动本地 Supabase 服务栈并输出包括本地 DB URL
在内的环境信息,请记下该 URL 以备后续使用。
安装依赖项
为项目添加以下依赖项:
1poetry add supabase mixpeek
导入必要的依赖项
在您的 Python 主脚本顶部,导入依赖项并存储环境变量:
1234567from supabase import create_client, Clientfrom mixpeek import Mixpeekimport osSUPABASE_URL = os.getenv("SUPABASE_URL")SUPABASE_KEY = os.getenv("SUPABASE_API_KEY")MIXPEEK_API_KEY = os.getenv("MIXPEEK_API_KEY")
为视频创建嵌入向量
接下来,创建一个 seed
方法,该方法将执行以下操作:新建一个 Supabase 表、为视频片段生成嵌入向量,并将这些向量插入到数据库中:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546def seed(): # 初始化 Supabase 和 Mixpeek 客户端 supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY) mixpeek = Mixpeek(MIXPEEK_API_KEY) # 创建用于存储视频片段嵌入向量的表 supabase.table("video_chunks").create({ "id": "text", "start_time": "float8", "end_time": "float8", "embedding": "vector(768)", "metadata": "jsonb" }) # 处理并嵌入视频 video_url = "https://example.com/your_video.mp4" processed_chunks = mixpeek.tools.video.process( video_source=video_url, chunk_interval=1, # 1秒间隔 resolution=[720, 1280] ) for chunk in processed_chunks: print(f"正在处理视频片段: {chunk['start_time']}") # 使用 Mixpeek 生成嵌入向量 embed_response = mixpeek.embed.video( model_id="vuse-generic-v1", input=chunk['base64_chunk'], input_type="base64" ) # 插入到 Supabase supabase.table("video_chunks").insert({ "id": f"chunk_{chunk['start_time']}", "start_time": chunk["start_time"], "end_time": chunk["end_time"], "embedding": embed_response['embedding'], "metadata": {"video_url": video_url} }).execute() print("视频处理完成,嵌入向量已插入") # 创建索引以提升搜索性能 supabase.query("CREATE INDEX ON video_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100)").execute() print("索引创建完成")
将此方法作为脚本添加到 pyproject.toml
文件中:
123[tool.poetry.scripts]seed = "video_search.main:seed"search = "video_search.main:search"
通过 poetry shell
激活虚拟环境后,您现在可以通过 poetry run seed
运行种子脚本。您可以通过访问本地 Supabase 仪表板 localhost:54323 来检查生成的嵌入向量。
通过文本查询执行视频搜索
使用 Supabase Vector,您可以查询您的嵌入向量。您既可以使用视频片段作为搜索输入,也可以从字符串输入生成嵌入向量并将其用作查询输入:
1234567891011121314151617181920212223242526272829303132def search(): # 初始化 Supabase 和 Mixpeek 客户端 supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY) mixpeek = Mixpeek(MIXPEEK_API_KEY) # 为文本查询生成嵌入向量 query_string = "a car chase scene" text_emb = mixpeek.embed.video( model_id="vuse-generic-v1", input=query_string, input_type="text" ) # 查询集合 results = supabase.rpc( 'match_video_chunks', { 'query_embedding': text_emb['embedding'], 'match_threshold': 0.8, 'match_count': 5 } ).execute() # 显示结果 if results.data: for result in results.data: print(f"匹配的片段从 {result['start_time']} 到 {result['end_time']} 秒") print(f"视频URL: {result['metadata']['video_url']}") print(f"相似度: {result['similarity']}") print("---") else: print("未找到匹配的视频片段")
此查询将返回数据库中相似度最高的5个视频片段。
现在您可以通过运行 poetry run search
进行测试,系统将展示与查询"a car chase scene"最相关的视频片段。
结论
仅需几个Python脚本,您就能使用Mixpeek Embed和Supabase Vector实现视频搜索以及反向视频搜索。这种方法提供了强大的语义搜索能力,可以集成到各种应用中,使您能够通过文本和视频查询来搜索视频内容。