
LlamaIndex VideoDB Retriever基于 VideoDBRetriever 的视频片段 RAG 检索器 API 参考与实现解析【免费下载链接】llama_indexLlamaIndex is the leading document agent and OCR platform项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index本文以 LlamaIndex 仓库中 VideoDB Retriever 的 API 参考文档为核心系统讲解VideoDBRetriever的完整构造参数、检索执行流程与底层实现细节并结合仓库中的源码、示例 Notebook 与测试用例给出从单视频检索、场景视觉索引检索到多视频合集检索的可复制实战方案。读完后你可以直接基于 VideoDB 托管的视频索引用 LlamaIndex 构建面向视频的 RAG 管线并将检索结果转化为文本回答与可播放的视频片段流。1. 文档定位API 参考页与VideoDBRetriever模块的对应关系仓库中的 API 参考页 videodb.md 使用 mkdocs-autorefs 风格声明了对llama_index.retrievers.videodb模块的文档化范围指定成员为VideoDBRetriever::: llama_index.retrievers.videodb options: members: - VideoDBRetriever这意味着该参考页描述的对象只有一个类VideoDBRetriever其真实定义位于独立集成包中类实现base.py包导出__init__.py其中__all__ [VideoDBRetriever]集成包说明README.md配套示例videodb_retriever.ipynbVideoDBRetriever是 LlamaIndex 核心检索器基类的子类class VideoDBRetriever(BaseRetriever): def __init__(self, api_keyNone, collectiondefault, videoNone, ...)基类BaseRetriever定义在 base_retriever.py第 34 行它负责统一的retrieve()入口、回调管理器CallbackManager与对象映射。集成包的测试用例也验证了这一继承关系# tests/test_retrievers_videdb.py from llama_index.core.base.base_retriever import BaseRetriever from llama_index.retrievers.videodb import VideoDBRetriever def test_class(): names_of_base_classes [b.__name__ for b in VideoDBRetriever.__mro__] assert BaseRetriever.__name__ in names_of_base_classes测试文件路径test_retrievers_videdb.py。2. 安装与依赖前提根据集成包 pyproject.toml 的实际声明当前版本 0.5.0[project] name llama-index-retrievers-videodb version 0.5.0 requires-python 3.10,4.0 dependencies [ videodb0.2.0, llama-index-core0.13.0,0.15, ]安装命令来自集成包 READMEpip install llama-index llama-index-retrievers-videodb videodb运行前提需要一个 VideoDB API Key。VideoDB 是一个面向视频内容的数据库提供视频存储、索引语义索引/场景索引、搜索与流式播放能力API Key 可从 VideoDB 控制台获取若要走 LlamaIndex 的回答合成环节get_response_synthesizer默认使用 OpenAI还需配置OPENAI_API_KEY检索器每次检索都会通过网络连接 VideoDB 服务因此运行环境需要可达其 API 端点支持通过base_url参数自定义端点见下文。3. 构造参数完整参考以下参数表完整来自 base.py 中VideoDBRetriever.__init__的签名第 16–46 行并逐项说明其源码行为参数类型默认值说明api_keyOptional[str]NoneVideoDB API 密钥。传None时自动回退读取环境变量VIDEO_DB_API_KEY两者都缺失时直接抛出Exception提示必须二选一提供collectionOptional[str]defaultVideoDB 集合collection名称或 ID作为检索范围videoOptional[str]None视频 ID。指定后只对单条视频执行video.search()不指定则对整个集合执行coll.search()score_thresholdOptional[float]0.2相似度分数阈值低于该值的片段不会被返回result_thresholdOptional[int]5最多返回的结果数量search_typeOptional[str]SearchType.semantic检索方式来自videodbSDK可选语义检索或关键词检索index_typeOptional[str]IndexType.spoken_word目标索引类型默认“口播/语音内容”索引也可设为IndexType.scene场景/视觉索引scene_index_idOptional[str]None场景索引 ID。仅当index_type IndexType.scene且该值非空时才会作为index_id加入检索参数base_urlOptional[str]None自定义 VideoDB API 端点非None时会传入connect()建立连接callback_managerOptional[CallbackManager]NoneLlamaIndex 回调管理器透传给基类BaseRetriever.__init__API Key 的解析逻辑源码第 31–36 行if api_key is None: api_key os.environ.get(VIDEO_DB_API_KEY) if api_key is None: raise Exception( No API key provided. Set an API key either as an environment variable (VIDEO_DB_API_KEY) or pass it as an argument. )因此两种等价写法# 方式一环境变量 os.environ[VIDEO_DB_API_KEY] your_api_key # 方式二显式传参 retriever VideoDBRetriever(api_keyyour_api_key)4. 检索执行流程_retrieve的实现剖析VideoDBRetriever的核心逻辑全部在_retrieve(query_bundle)方法中base.py。其执行顺序为建立连接每次检索时以api_key及可选base_url调用videodb.connect()建立新连接。从源码结构看连接是逐次请求创建的而非常驻客户端两条检索路径由是否传入video决定单视频路径conn.get_collection(collection)→coll.get_video(video)→video.search(...)。检索参数包含query取自query_bundle.query_str、search_type、index_type、score_threshold、result_threshold集合路径conn.get_collection(collection)→coll.search(query, ...)跨集合内所有视频检索场景索引的特殊分支仅当index_type IndexType.scene且scene_index_id有值时才把index_idscene_index_id加入单视频检索参数。这解释了为什么场景检索必须先通过 VideoDB 的场景索引接口拿到索引 ID 再传给检索器结果到 LlamaIndex 节点的映射遍历search_res.get_shots()每个 shot 转成一个TextNode并包裹进NodeWithScoretextnode TextNode( textshot.text, metadata{ collection_id: collection_id, video_id: shot.video_id, length: shot.video_length, title: shot.video_title, start: shot.start, end: shot.end, type: self.index_type, }, ) nodes.append(NodeWithScore(nodetextnode, scorescore))这套 metadata 是整个视频 RAG 的关键text是片段的转写/描述文本供 LLM 合成回答start/end是该片段在视频中的时间区间供生成可播放的视频剪辑流video_id标识片段来源视频跨视频检索时用于拼接 Timeline。5. 实战一单视频视频 RAG语音索引 场景索引以下流程对应官方示例 videodb_retriever.ipynb可直接按步骤复制执行。5.1 连接 VideoDB 并上传视频from videodb import connect conn connect() coll conn.create_collection( nameVideoDB Retrievers, descriptionVideoDB Retrievers ) # 支持公有 URL、YouTube 链接或本地文件 video coll.upload(urlhttps://www.youtube.com/watch?vaRgP3n0XiMc) print(fVideo uploaded with ID: {video.id})5.2 口播spoken content检索先对视频做语音索引再用index_typeIndexType.spoken_word默认值检索video.index_spoken_words() from llama_index.retrievers.videodb import VideoDBRetriever from videodb import SearchType, IndexType spoken_retriever VideoDBRetriever( collectioncoll.id, videovideo.id, search_typeSearchType.semantic, index_typeIndexType.spoken_word, score_threshold0.1, ) spoken_query Nationwide exams nodes_spoken_index spoken_retriever.retrieve(spoken_query)用 LlamaIndex 的回答合成器基于检索节点生成文本from llama_index.core import get_response_synthesizer response_synthesizer get_response_synthesizer() response response_synthesizer.synthesize(spoken_query, nodesnodes_spoken_index) print(response)5.3 视频片段流利用 metadata 中的时间区间每个检索节点 metadata 中的start/end表示该片段时间区间。利用 VideoDB 的可编程流式接口可以即时拼接出与检索结果一一对应的视频剪辑from videodb import play_stream results [ (node.metadata[start], node.metadata[end]) for node in nodes_spoken_index ] stream_link video.generate_stream(results) play_stream(stream_link)5.4 场景visual content检索场景检索需要先用index_scenes建立场景索引并保存返回的index_id再将该 ID 传给检索器的scene_index_id参数from videodb import SceneExtractionType index_id video.index_scenes( extraction_typeSceneExtractionType.shot_based, extraction_config{frame_count: 3}, promptDescribe the scene in detail, ) scene_retriever VideoDBRetriever( collectioncoll.id, videovideo.id, search_typeSearchType.semantic, index_typeIndexType.scene, scene_index_idindex_id, score_threshold0.1, ) scene_query accident scenes nodes_scene_index scene_retriever.retrieve(scene_query)响应合成与片段流生成方式与 5.2、5.3 相同直接复用nodes_scene_index。6. 实战二简单多模态 RAG语音 场景双通道示例 Notebook 的第四步演示了同时利用两种模态回答组合查询如“Show me 1. Accident Scene 2. Discussion about nationwide exams”的简单做法查询拆分用 LLM 把原始查询拆成口语部分与视觉部分from llama_index.llms.openai import OpenAI def split_spoken_visual_query(query): transformation_prompt Divide the following query into two distinct parts: one for spoken content and one for visual content. Format the response strictly as: Spoken: spoken_query Visual: visual_query Query: {query} response OpenAI(modelgpt-4).complete(transformation_prompt.format(queryquery)) divided_query response.text.strip().split(\n) spoken_query divided_query[0].replace(Spoken:, ).strip() scene_query divided_query[1].replace(Visual:, ).strip() return spoken_query, scene_query双检索器并行检索各自对应一种index_typespoken_retriever VideoDBRetriever( collectioncoll.id, videovideo.id, search_typeSearchType.semantic, index_typeIndexType.spoken_word, score_threshold0.1, ) scene_retriever VideoDBRetriever( collectioncoll.id, videovideo.id, search_typeSearchType.semantic, index_typeIndexType.scene, scene_index_idindex_id, score_threshold0.1, ) nodes_spoken_index spoken_retriever.retrieve(spoken_query) nodes_scene_index scene_retriever.retrieve(scene_query)合并结果文本侧直接把两路节点相加后交给合成器视频侧对时间区间做并集Union合并后生成剪辑流。示例中给出的区间合并实现def merge_intervals(intervals): if not intervals: return [] intervals.sort(keylambda x: x[0]) merged [intervals[0]] for interval in intervals[1:]: if interval[0] merged[-1][1]: merged[-1][1] max(merged[-1][1], interval[1]) else: merged.append(interval) return merged results [ [node.metadata[start], node.metadata[end]] for node in nodes_spoken_index nodes_scene_index ] merged_results merge_intervals(results) stream_link video.generate_stream(merged_results) play_stream(stream_link)示例文档也说明除并集Union外还可用交集Intersection策略只保留在两种模态中都出现的时间段结果更保守。7. 实战三集合级检索与跨视频 Timeline 拼接不传video参数即切换为集合级检索对应源码中的coll.search()分支# 假设 video_2 已上传并分别建立语音索引与场景索引 spoken_retriever VideoDBRetriever( collectioncoll.id, search_typeSearchType.semantic, index_typeIndexType.spoken_word, score_threshold0.2, ) scene_retriever VideoDBRetriever( collectioncoll.id, search_typeSearchType.semantic, index_typeIndexType.scene, score_threshold0.2, ) nodes_spoken_index spoken_retriever.retrieve(spoken_query) nodes_scene_index scene_retriever.retrieve(scene_query)跨多个视频合成剪辑流时需要基于每条节点的video_id、start、end构造VideoAsset再挂载到Timeline上统一编译from videodb.timeline import Timeline from videodb.asset import VideoAsset timeline Timeline(conn) for node_obj in nodes_scene_index nodes_spoken_index: node node_obj.node node_asset VideoAsset( asset_idnode.metadata[video_id], startnode.metadata[start], endnode.metadata[end], ) timeline.add_inline(node_asset) stream_url timeline.generate_stream() play_stream(stream_url)8. 检索器配置要点汇总示例 Notebook 的“Configuring VideoDBRetriever”小节给出了全部配置场景可对照本文第 3 节的参数表理解只检索单条视频传入该视频的 IDVideoDBRetriever(videomy_video_id)只检索某个集合传入集合 IDVideoDBRetriever(collectionmy_coll_id)指定索引类型语音索引与场景索引场景索引必须同时提供scene_index_idfrom videodb import IndexType spoken_retriever VideoDBRetriever(index_typeIndexType.spoken_word) scene_retriever VideoDBRetriever( index_typeIndexType.scene, scene_index_idmy_index_id )指定检索方式关键词检索或语义检索from videodb import SearchType, IndexType keyword_spoken_search VideoDBRetriever( search_typeSearchType.keyword, index_typeIndexType.spoken_word ) semantic_spoken_search VideoDBRetriever( search_typeSearchType.semantic, index_typeIndexType.spoken_word )调优阈值result_threshold返回条数上限默认 5与score_threshold分数下限默认 0.2custom_retriever VideoDBRetriever(result_threshold2, score_threshold0.5)9. 打包、发布与集成元信息集成包的 pyproject.toml 中还包含 LlamaHub 集成元数据标明了该包对外的类与导入路径[tool.llamahub] classes [VideoDBRetriever] import_path llama_index.retrievers.videodb [tool.llamahub.class_authors] VideoDBRetriever video-db构建配置[tool.hatch.build.targets.wheel]仅打包llama_index/目录说明该包是一个纯集成插件不修改llama-index-core。10. 适用前提与使用限制小结适用版本本文基于仓库中当前集成包版本 0.5.0依赖videodb0.2.0与llama-index-core0.13.0,0.15Python 要求3.10,4.0外部服务依赖VideoDBRetriever是服务型检索器所有检索都经由 VideoDB API 完成本地没有离线模式缺少 API Key 时构造器会直接抛异常场景索引前置步骤IndexType.scene检索依赖事先通过 VideoDB 场景索引接口生成的scene_index_id否则该参数不会进入检索参数源码中的条件分支连接模型从源码结构看_retrieve每次调用都会重新connect()高频调用场景下连接建立开销需要自行评估扩展方向除了直接使用 VideoDB 托管索引也可以加载其转写文本与场景数据后在 LlamaIndex 侧自行建立索引仓库中另有配套的多模态示例 multi_modal_videorag_videodb.ipynb 可作进一步参考。【免费下载链接】llama_indexLlamaIndex is the leading document agent and OCR platform项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考