很多开发者在接触多模态 AI 时,都会遇到一个共同的疑惑:模型明明能“看到”视频,也能“听懂”问题,但一旦任务是“数清楚这段视频里到底鼓了几次掌”,它就变得不够可靠。有人会以为这是模型理解能力不够,但实际上,问题的核心往往不在“看懂”这一步,而在于模型是否被赋予了像智能体一样拆解任务、分段分析、反复验证的能力。

最近“Gemini 3.7 Flash 借智能体视频理解能力准确数清鼓掌次数”这个演示之所以值得关注,不在于“鼓掌”这个动作本身有多难识别,而在于它把一类典型问题暴露了出来:凡是需要连续观察、事件计数、时间戳对应的视频任务,单靠一次“看图说话”式的调用很可能失败,只有把视频理解能力放到智能体工作流里,让模型学会“先取样、再分析、后汇总、最后校验”,才能得到稳定可用的结果。

这篇文章会从一个具体任务入手,拆解视频理解型智能体的工作方式,说明它和传统单轮多模态调用的差别,再给出可以照做的环境准备、工作流设计、代码示例、效果验证和排错建议。无论你是在做内容审核、运动分析,还是想给视频数据加上一层事件检索能力,这套思路都能直接参考。

1. 这篇文章真正要解决的问题

如果只是给模型一张舞台照片,问“台上在做什么”,绝大多数多模态模型都能给出像样的回答。但换成一段几十秒的现场视频,问“观众一共鼓了几次掌”,难度就完全不同了。

第一个难点是时间连续性问题。鼓掌是一个重复性动作,单次鼓掌大约只持续零点几秒。模型如果只看视频里的抽样帧,很可能把两次鼓掌看成一次,或者漏掉掌声已经开始但画面里手被遮挡的那些动作。第二个难点是计数一致性。模型既要识别出“鼓掌”这个事件,还要在时间轴上标记每一次事件的起止时间,然后才能避免把同一段动作重复计数。第三个难点是视频长度和计算成本的矛盾,完整视频直接全部塞给模型,既可能超出上下文窗口,也会让响应时间变得无法接受。

“Gemini 3.7 Flash 借智能体视频理解能力准确数清鼓掌次数”这个演示的巧妙之处,就是把“数清楚鼓掌次数”从一个单纯的多模态识别问题,变成了一个智能体工程问题。模型不再试图一次性完成所有推理,而是把任务拆成几个子目标:先把视频切成可分析的片段,再对每个片段做动作事件识别,然后汇总所有片段的时间戳和事件类型,最后通过一轮或多轮校验打消重复计数。通过 Flash 系列轻量模型的快速迭代,整个工作流可以用较低成本完成。

所以读完本文,你能得到几样实际可用的东西:一套适合视频事件计数的智能体架构,一个从原始视频到结构化计数结果的代码框架,以及一套能帮助你判断结果是否可信的验证思路。对智能体开发新手来说,这篇文章也能帮忙理解为什么 Agent 通常不只是“调用一个大模型”,而是“编排多个能力和结果”。

2. 拆解“数清鼓掌次数”:Agent 需要哪几项核心能力

2.1 视频理解不等于视频分类

传统的视频理解任务,很多会被简化成“对视频抽帧,再用图像模型对每一帧分类”。这种做法对图像描述、场景识别勉强可用,但对鼓掌这种有明确时间跨度的动作事件来说,直接抽帧会因为关键帧选择不准而丢失信息。真正的视频理解,至少要同时建模画面中的空间信息和时间信息。也就是说,模型需要知道“画面里有一双手”只是第一步,它还需要知道“这双手在什么时间段内发生了连续运动”。

Gemini 3.7 Flash 这类多模态模型可以把视频作为时间连续的输入来理解,而不只是单张图片的拼接。这种能力让 Agent 可以直接对视频片段提问,例如“这段视频中第几秒到第几秒出现了鼓掌动作”,而模型给出的答案往往不是一个裸数字,而是带时间范围的文本输出。准确数清鼓掌次数,依赖的正是这种时间感知能力。

2.2 Agent 在视频任务里扮演什么角色

Agent 在这里并不是一个神秘的概念。它更像是一个“任务调度者”:理解用户意图,决定调用哪些能力,分析模型返回的结果,并在结果不够清晰时发起新一轮工具调用。如果把视频理解能力比作一个熟练的审片员,Agent 就是给审片员派活的导演。导演不会让审片员一口气看完三小时素材后凭印象作答,而是会让审片员先按剧本结构分段,再看某一段里的具体动作,最后把每段的场记单合在一起。

在鼓掌计数场景里,Agent 的工作流可以拆成以下几步:

  1. 接收用户指令,明确目标和输出格式。
  2. 对视频文件生成分段策略,比如按固定时长切分,或按场景变化切分。
  3. 调用视频理解模型,对每个分段执行动作识别。
  4. 汇总各分段输出,对相邻分段的事件做去重合并。
  5. 输出一个带时间戳的 JSON 结果,包含总次数和每一次事件的起止时间。
  6. 如果发现计数结果有跨片段的连续性风险,可以重新检查重叠边界区域。

2.3 计数类任务真正需要的是结构化推理

对“鼓掌次数”这种统计型问题,如果模型只是回复一句“大约鼓了五到六次”,工程价值不大。可用的答案必须能被后续系统继续处理,最好直接是:

{
  "applause_count": 6,
  "events": [
    {"start": 2.3, "end": 4.1, "type": "applause"},
    {"start": 5.6, "end": 8.9, "type": "applause"}
  ]
}

因此,视频理解 Agent 不仅要识别事件,还要把事件输出为带固定 schema 的结构化数据。这也是 Gemini 3.7 Flash 这类模型在智能体场景里的优势:它可以按照 system prompt 中给定的 JSON 格式返回结果,便于 Agent 直接解析并使用。

能力项 传统图像分类模型 单轮视频多模态调用 视频理解型智能体
时间连续动作判断 弱 中 强
长时间视频覆盖 无法覆盖 受上下文限制 可以通过分段解决
事件去重和计数稳定性 不支持 不稳定 通过工作流较稳定
结构化输出 通常没有 可以但不易校验 适合接入工程链路
可解释性 低 低 较高,因为带时间戳

这个表格清楚地说明了为什么“智能体 + 视频理解”的组合值得单独讨论:它不是把模型能力简单叠加,而是用编排逻辑弥补单次模型调用的短板。

3. 原理分析:为什么 Agent 能把“鼓掌计数”做得更稳

3.1 从“看画面”到“在时间轴上定位事件”

要让模型数清楚鼓掌次数,本质上是让模型在视频时间轴上找到所有具备“鼓掌”语义的区间。拍手动作有几个显著特征:双手在水平方向快速接近、手掌接触后立刻弹开、声音通常伴随动作出现。如果只看某一帧,很难判断“这两个手掌靠近”是在鼓掌还是在拍蚊子,又或者只是一次准备动作。Agent 需要做的,通常是让视频理解模型在比较小的片段内完成因果判断。

所以在工程处理上,Agent 往往先做“短片长、多分片”的策略。比如把十分钟的视频按 15 到 30 秒切分,对每个分片单独判断“是否鼓掌、鼓掌次数、起止时间”。为什么不能用更大的分片?因为视频模型的输入 token 有限,分片越大,模型对时间细节的关注越容易被稀释。短片长还有一个好处:即使模型出现误判,也只会影响这一小段结果,定位和修复成本都更低。

3.2 重叠窗口解决边界重复计数

做过时间序列处理的开发者应该很熟悉滑动窗口带来的边界问题。假设视频从第 30 秒切到第 60 秒,模型识别出第一次鼓掌结束于第 31 秒,第二次鼓掌开始于第 29.8 秒,那么这实际上可能是同一次鼓掌事件跨越了切分点,结果被两个分段各自统计一次。

Globis 计数工作流的核心技巧,是在相邻分段间设置重叠区间。每个分段除了分析自己的有效区间,还会带上前后几秒的冗余画面。最后汇总阶段,Agent 根据事件的起止时间做重叠合并。如果两个事件在一个时间窗口内相交,且动作类型相同,就将其合并为一个事件,并取最早开始时间和最晚结束时间。

合并逻辑并不复杂,但当模型输出格式统一时,这套逻辑可以很稳定地复用到拍手、跳跃、点头、举手等所有周期性动作视频任务里。

3.3 智能体调用视频理解能力的两种形态

从工程设计上看,“智能体借视频理解能力”通常指两种形态。

第一种是模型原生应用视觉输入,Agent 把视频分片和问题一起作为 prompt 内容,让模型直接回答。这种形态适合 Gemini 这类端到端多模态模型。开发者只需把视频分片传给模型,并在 prompt 中强调“请回到 JSON 格式”。

第二种是模型先通过工具调用,去获取视频关键信息。Agent 可以拆解得到行动计划,并且主动调用外部工具,比如先让视频抽帧工具截取关键瞬间,再让模型分析截帧。两种形态可以结合:模型先看简短视频了解内容,再抽取事件关键帧做精细判断。哪种更好取决于场景。如果任务要求高准确率和较少 token 消耗,通常建议先用工具抽帧粗筛,再用模型精细识别。

4. 环境准备与前置条件

下面内容以“Python + FFmpeg + Gemini 多模态接口”给出一个可复现的通用方案。由于各 SDK 版本迭代很快,代码中涉及的模型名称和接口细节可能发生变化,请以官方最新文档为准。

4.1 基础环境

为完成该演示思路,建议准备以下环境:

  • 操作系统:Linux 或 macOS 均可,Windows 可使用 WSL2 或直接安装 FFmpeg。
  • Python:3.10 或更高版本。
  • FFmpeg:用于视频切割、抽帧和获取视频信息。
  • Python 依赖包:
    • google-genai 或 google-generativeai ,二选一即可;
    • ffmpeg-python ,便于在 Python 中控制视频切割;
    • json 、 os 、 subprocess 等标准库。

4.2 安装命令示例

# Python 环境建议使用虚拟环境
python3 -m venv .venv
source .venv/bin/activate

# 安装 FFmpeg
# Ubuntu / Debian
sudo apt update && sudo apt install -y ffmpeg

# macOS
# brew install ffmpeg

# 安装 Python 依赖
pip install google-genai ffmpeg-python

# 验证 FFmpeg 是否可用
ffmpeg -version

如果安装 google-genai 失败,可以切换到传统 SDK:

pip install google-generativeai

4.3 视频材料准备

准备测试视频时,不用追求内容复杂。找一段带有清晰掌声的视频,时长控制在 20 到 60 秒,并用人工方式记录一次鼓掌次数和时间范围。这个人工标注结果会成为后续验证模型输出是否准确的“基准答案”。注意,测试视频如果涉及人物肖像、活动画面、版权内容,务必确认自己拥有合法处理权限。涉及生产环境的视频分析时,应使用经过授权或有明确版权的素材,不可把隐私内容直接放入大模型请求中。

5. 智能体视频理解工作流:完整示例与代码实现

5.1 第一步:把长视频切成适合模型处理的片段

视频理解任务中,直接上传几十分钟的原始视频,既可能超过模型的输入限制,也会降低事件识别准确率。先用 FFmpeg 把视频拆成短视频片段,是视频 Agent 最常见的预处理方式。

下面是一段使用 ffmpeg-python 和原生 subprocess 配合的切割脚本,演示如何从原始视频中按固定时长切分片段,同时保留重叠窗口。

# 文件路径:scripts/cut_video.sh
#!/bin/bash
INPUT_VIDEO=$1
OUTPUT_DIR=$2
SEGMENT_SECONDS=10
OVERLAP_SECONDS=2

mkdir -p "$OUTPUT_DIR"

# 以 10 秒为一段,相邻片段多保留 2 秒冗余
ffmpeg -i "$INPUT_VIDEO" -c copy -map 0 -segment_time 10 \
  -f segment -segment_format_options movflags=+faststart \
  "$OUTPUT_DIR/segment_%03d.mp4"

echo "视频切分完成,请检查 $OUTPUT_DIR 目录"

如果希望代码可动态获取视频时长并按重叠窗口切分,推荐使用 ffprobe 获取时长后逐段切割。这类处理没有太多算法深度,关键是确保分段之间的重叠足够避免边界漏检。

5.2 第二步:Agent 主流程循环处理每段视频

接下来是核心部分:Agent 主流程。这里不再写死所有逻辑,而是把 Gemini 多模态模型当作一个“视频分片分析工具”。主循环读取每个切分后的视频片段,发送给模型,要求模型输出 JSON 格式的事件列表。所有分片均分析完成后,Agent 再把所有 JSON 结果做合并去重。

由于具体的模型 SDK 在持续更新,下面代码采用“示例模型名 + 关键注释”的写法。你需要根据当前安装的 SDK 版本把模型名替换成可用的视频理解模型。

# 文件路径:agent_video_counter.py
import json
import os
import glob
from typing import List, Dict, Any

# 以 Gemini 官方 Python SDK 为例,不同版本安装方式不同,请以当前 SDK 为准
# from google import genai
# from google.genai import types

OUTPUT_DIR = "./segments"
ANALYSIS_PROMPT = """
你是一名视频动作事件分析师。请分析这个视频片段,找出其中所有“鼓掌”动作。
要求:
1. 不要遗漏鼓掌事件,也不要将非鼓掌动作识别成鼓掌。
2. 返回 JSON,不要输出其他解释文字。
3. JSON 格式如下:
{
  "events": [
    {"type": "applause", "start": 1.2, "end": 3.4},
    {"type": "applause", "start": 5.0, "end": 6.1}
  ]
}
如果视频中没有鼓掌事件,返回 {"events": []}
"""


def analyze_video_segment(segment_path: str) -> Dict[str, Any]:
    """
    调用视频理解模型分析单个视频片段。
    具体调用方式会依赖 SDK 版本,这里保留一个可运行的最小示例骨架。
    """
    # 不同 SDK 的视频上传方式不一,可能是本地文件引用,也可能是 File API。
    # 请根据自己使用的 SDK 文档补充。
    model = "gemini-video-model-demo"
    prompt = ANALYSIS_PROMPT

    # 伪代码示意:
    # response = client.models.generate_content(
    #     model=model,
    #     contents=[prompt, load_video_part(segment_path)]
    # )
    # text = response.text

    # 下面直接构造一个空的解析函数,便于流程串联。
    text = '{"events": []}'

    try:
        data = json.loads(text)
        for event in data.get("events", []):
            event["source_segment"] = os.path.basename(segment_path)
        return data
    except json.JSONDecodeError:
        return {"events": [], "parse_error": text}


def merge_events(all_events: List[Dict[str, Any]], merge_gap: float = 1.0) -> List[Dict[str, Any]]:
    """
    合并来自不同分片的密集事件。
    如果两个鼓掌事件的时间间隔小于 merge_gap,视为同一次鼓掌。
    """
    if not all_events:
        return []

    events_sorted = sorted(all_events, key=lambda x: x["start"])
    merged = [events_sorted[0].copy()]

    for event in events_sorted[1:]:
        last = merged[-1]
        if event["start"] <= last["end"] + merge_gap and event["type"] == last["type"]:
            last["end"] = max(last["end"], event["end"])
        else:
            merged.append(event.copy())

    return merged


def main() -> None:
    segment_files = sorted(glob.glob(os.path.join(OUTPUT_DIR, "*.mp4")))
    all_events: List[Dict[str, Any]] = []

    for segment_path in segment_files:
        result = analyze_video_segment(segment_path)
        all_events.extend(result.get("events", []))

    final_events = merge_events(all_events)
    report = {
        "total_video_events": len(final_events),
        "applause_count": len([e for e in final_events if e["type"] == "applause"]),
        "events": final_events,
    }

    with open("result.json", "w", encoding="utf-8") as f:
        json.dump(report, f, ensure_ascii=False, indent=2)

    print(json.dumps(report, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()

这里有几处需要注意。 merge_gap 参数很有价值。如果视频里两次鼓掌间隔很短,比如在一轮热烈掌声中,模型可能把一个持续 3 秒的鼓掌事件拆成多个片段。设置合理的时间合并窗口,能有效减小重复计数。当然,如果任务要求的是统计“每一次单次拍手”,而不是统计“一轮掌声”,就需要把 merge_gap 调小甚至关闭。

5.3 第三步:支持模型在回答前先使用工具

上面的示例属于“Agent 分批调用模型”的简单形态。更进一步,可以在 prompt 中让 Agent 先对视频片段进行场景分析,再决定使用哪一类工具。比如对鼓掌检测来说,很有用的辅助信息是声音波形。Agent 如果发现某个时间段音频能量很强,就可以把这段视频的关键帧传给视觉模型二次确认。

不过,这类工具调用链路一旦复杂,就必须考虑工具返回内容的可靠性和可观测性。建议把每一次工具调用的输入和输出都记录到日志中,至少包括:

  • 调用时间。
  • 传入的视频片段路径。
  • 所用的 prompt 版本。
  • 模型返回的原始文本。
  • 解析后的 JSON。
  • 是否出现解析异常。

这些日志会是后面排查“数错了”的最重要依据。

5.4 运行与预期效果

按照上述流程,建议按下面的步骤运行:

# 1. 给脚本加执行权限
chmod +x scripts/cut_video.sh

# 2. 切分视频
./scripts/cut_video.sh lecture.mp4 ./segments

# 3. 运行 Python 智能体流程
python agent_video_counter.py

如果一切正常,控制台会输出一份 JSON 结果,其中 applause_count 字段对应总鼓掌次数, events 数组则给出每次鼓掌的大致起止时间。如果 applause_count 为 0,但视频里明明有掌声,通常需要先检查视频分段结果,再看模型是否成功读取了视频文件。

6. 效果验证:如何判断“数清楚”是真的可靠

6.1 不能只看总次数对不对

把模型输出的总次数和人工统计的总次数做对比,是最直观的验证方式,但还远远不够。一次漏检和一次重复计数可能互相抵消,总数看起来一模一样,实际上事件分布已经完全错误。

更合理的验证方式是同时比较:

  • 事件总次数是否一致。
  • 每个事件的起止时间与标注时间是否大致重合。
  • 事件类型标签是否一致。

下面给出一个简单的验证函数,用来计算预测事件与人工标注事件的匹配度。这里把两个事件视为匹配的条件是:事件类型一致,且时间交集占并集的比例大于某个阈值。

# 文件路径:evaluate_events.py
from typing import List, Dict, Any


def event_iou(event_a: Dict[str, Any], event_b: Dict[str, Any]) -> float:
    start = max(event_a["start"], event_b["start"])
    end = min(event_a["end"], event_b["end"])
    intersection = max(0.0, end - start)

    union_start = min(event_a["start"], event_b["start"])
    union_end = max(event_a["end"], event_b["end"])
    union = max(0.0, union_end - union_start)

    if union == 0:
        return 1.0 if event_a["type"] == event_b["type"] else 0.0
    return intersection / union


def match_events(pred_events: List[Dict[str, Any]],
                 gt_events: List[Dict[str, Any]],
                 iou_threshold: float = 0.5) -> Dict[str, Any]:
    matched_pred = set()
    matched_gt = set()

    for p_idx, pred in enumerate(pred_events):
        for g_idx, gt in enumerate(gt_events):
            if p_idx in matched_pred or g_idx in matched_gt:
                continue
            if pred["type"] == gt["type"] and event_iou(pred, gt) >= iou_threshold:
                matched_pred.add(p_idx)
                matched_gt.add(g_idx)

    precision = len(matched_pred) / len(pred_events) if pred_events else 1.0
    recall = len(matched_gt) / len(gt_events) if gt_events else 1.0
    f1 = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0.0

    return {
        "precision": round(precision, 4),
        "recall": round(recall, 4),
        "f1": round(f1, 4),
        "matched_count": len(matched_pred),
        "pred_count": len(pred_events),
        "gt_count": len(gt_events),
    }


if __name__ == "__main__":
    ground_truth = [
        {"type": "applause", "start": 1.0, "end": 3.0},
        {"type": "applause", "start": 10.0, "end": 12.0},
    ]
    predictions = [
        {"type": "applause", "start": 1.2, "end": 3.1},
        {"type": "applause", "start": 11.8, "end": 12.5},
    ]
    print(match_events(predictions, ground_truth))

运行该脚本后,会看到输出结果中包含 precision、recall、f1 等指标。如果 F1 偏低,看到底是漏检还是误检:

  • 漏检通常表现为 recall 低。可能原因包括视频画质差、动作幅度小、单次鼓掌时间过短、分段后动作被切碎。
  • 误检通常表现为 precision 低。可能原因包括模型把掌声、欢呼、靠近麦克风的动作,甚至双手整理衣领的动作识别成了鼓掌。

6.2 用“多段素材 + 多次重复”测试稳定性

视频理解模型的输出有一定随机性。相同视频片段,同一模型可能在不同温度设置下产生不同的事件边界。聪明做法是准备至少 5 段测试视频,每段视频跑 3 至 5 次,观察结果方差。如果结果波动大,可以考虑降低模型的 temperature 参数,或在 prompt 中增加“基于画面内容客观判断,不要猜测”的约束。

为了形成稳定的质量基线,建议记录一份简单的验证清单:

测试项 验证方法 通过标准
鼓掌事件召回 比较人工标注事件是否都在模型输出中出现 recall 不低于 0.8
鼓掌事件误识别 用没有掌声的视频测试 模型输出事件应尽量少
总次数稳定性 同片段重复多次 次数误差不超过 1 次
时间戳准确度 人工记录的掌声范围与输出范围比较 IoU 大于 0.5 算匹配
长视频覆盖 用 5 分钟以上视频测试分段能力 无片段遗漏

绝对理想的值可能因视频场景不同而差异很大。但如果测试过程严格遵守同一套标准,你的 Agent 工作流是不是真的比“直接把整段视频丢给模型”更稳定,就可以得到明显证据。

7. 视频理解智能体的常见问题与排查方法

在实际把视频理解能力接入智能体时,开发者经常在一开始就发现效果不如预期。以下问题来自我在视频分析和 Agent 开发中常见的真实技术损耗,基本都可以通过调整工程链路来解决。

问题现象 可能原因 排查方式 解决方案
模型输出不是 JSON 提示词约束不够,或模型版本对 JSON 输出支持弱 查看原始返回文本 使用结构化输出参数;在提示中增加“只返回 JSON,不要解释”
鼓掌总数少了很多 长视频被直接输入,模型上下文有限 查看视频是否被正确转码、分段 增加视频分段逻辑,启用重叠窗口
同一段掌声被数两次 相邻分段边界重叠导致重复事件未被合并 打印各分片返回的事件时间戳 调整 merge_gap,完善事件合并逻辑
没鼓掌的视频也检测出鼓掌 音频或视觉信息被误判 单独检查音频轨内容 在 prompt 中强调“画面中双手接触并快速分离才算鼓掌”
单独片段识别正常,整体结果乱 Agent 汇总逻辑没有统一事件格式 检查各分片返回的 start/end 字段类型 在解析层强制转换成 float,并做排序与去重
响应时间较长 分片过多但任务可并行 观察各分片耗时 引入并发调用,同时注意 API 限流

其中,最容易被忽视的是“Agent 汇总逻辑”。很多人以为问题出在视频理解模型不够聪明,结果查了半天,发现其实是模型对每个分片都返回了正确事件,但汇总脚本里没有排序去重。所以建议在系统设计初期,就把模型输出格式当成 API 契约来管理。模型输出必须能被机器读取,后续一切统计、校验、报警才能自动化。

另一个高频问题是把视频理解与音频理解混为一谈。鼓掌虽然通常伴随声音,但有的视频里会出现后期添加的鼓掌声效,或者现场其他噪音。如果任务要求精确识别“画面人物做出的鼓掌动作”,Agent 应该把判断依据限制在视觉内容上,否则容易产生由音频引起的误报。

8. 视频理解 Agent 落地时的最佳实践与工程建议

8.1 先稳定输出格式,再提升准确率

不管用哪种视频理解模型,第一优先级都不是让模型“想得更深”,而是让模型输出可以被程序稳定解析。建议在 prompt 中加入固定的 JSON Schema,同时在代码层保留原始输出日志。一旦准确率下降,可回溯对比当时模型版本和输出结构。不要试图依赖模型“随心所欲”的文本回答,这会让后续所有 Agent 逻辑变成脆弱的字符串匹配。

8.2 用 Agent 做校验,而不只是做识别

一个成熟的鼓掌计数 Agent,不应只做一次视频分析就给出结果。可以增加一次校验步骤:Agent 列出所有检测到的事件后,把事件时间点附近的若干关键帧重新截图,并让模型做二次验证。如果第二次识别结果与第一次相差过大,就触发重新分析。这种“多轮自我校验”机制,是 Agent 相对单次模型调用价值最大的地方之一。

具体实现时,可以在每一轮校验前加上简单的计数规则,例如:

# 校验规则示例
def check_count_confidence(events, max_count=20):
    if len(events) > max_count:
        return "need_review"
    for event in events:
        if event["end"] <= event["start"]:
            return "invalid_timestamp"
    return "ok"

8.3 注意数据权限和最小化传输

视频文件通常含有敏感信息。如果使用云端多模态 API,必须遵守权限边界,并在数据处理前获得合法授权。对可落到本地的任务,建议先对视频做场景裁剪,只截取涉及判断的片段再上传。同时,API 请求和返回结果中的视频原始文件、检测到的事件数据,也要有明确的保存期限和删除策略。不要在提示词里加入无关个人信息,避免数据泄露风险。

8.4 不要把计数结果直接当成“最终事实”

模型对视频事件的时间边界判断往往有几百毫秒甚至更大的误差。因此,如果业务场景涉及自动处罚、用户行为判断或任何高风险决策,建议把 Agent 输出标记为“初筛结果”,并由人再复核。Agent 可以帮助审核员快速定位高潮时间段,而不是完全替代判断。

9. 下一步:如何把演示能力变成自己的实战项目

Gemini 3.7 Flash 及相关视频多模态模型近期的演示,最值得关注的一点是模型本身的快速迭代减少了视频理解的技术摩擦力,但真正决定成败的还是工作流。

如果你现在想动手,建议从一个更简单但能完整跑通的项目开始,不必一开始就追求“精确数清鼓掌次数”。可以选择客厅摄像头录下的一段活动视频,标注“人站起坐下”的次数,或者体育比赛视频里“得分后击掌”的次数。这样的事件比鼓掌边界更清晰,训练和验证都比较容易。跑通后再加入音频、多角度、长短镜头切换等干扰因素。

如果你更关心 Agent 开发本身,可以研究两条技术路线:一条是模型自身直接消费视频输入,另一条是模型通过工具调用查询外部视频分析服务。前者依赖多模态模型的持续迭代,后者更接近现有系统集成方式。两条路线不冲突,也适合做对比实验。在长期项目中,建议把 Prompt 模板、视频分片参数、事件合并规则都当成需要版本管理的代码资产,而不是临时写在配置文件里的魔术数字。这样当模型升级到新版本后,你可以快速判断是模型能力提升导致效果变化,还是你的视频拆解策略已经过时。

把“数清楚鼓掌次数”当作一个标尺,它可以度量视频理解模型的时间感知能力,更可以度量你在智能体工程上的编排水平。下一次再看到类似的惊艳演示,不妨把它拆开看几步:模型到底做了什么,Agent 又在外面做了哪些包抄。理解了这一层,你的收获远比记住“某模型会数数”更有价值。

建议收藏这篇文章,也欢迎在评论区交流你自己的视频理解方案。如果你能从“把一段视频变成结构化事件列表”这个最小闭环开始动手,很快就能体会到视频理解 Agent 与传统单轮模型调试的差异。

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐