跳到内容

使用语言模型确保时间戳格式一致性

Gemini 可以理解语言模型输出中的时间戳,但它们可能不一致。视频内容的时间戳格式在 HH:MM:SS 和 MM:SS 之间变化,导致解析错误和计算问题。本文介绍了一种处理视频片段和电影时间戳的技术,避免格式问题。

我们将 Pydantic 的数据验证与自定义解析相结合,以实现一致的时间戳处理。您将学习如何处理任何格式的时间戳,减少视频内容工作流程中的错误。这有点像我们通过添加一个简单字段来确保多语言摘要中的语言匹配

本文提供了一种使用 Pydantic 的解决方案,以改进语言模型项目中时间戳的处理。此方法解决了格式不一致的问题,并实现了时间戳处理。

问题

考虑这样一个场景:我们使用语言模型为视频片段生成时间戳。对于较短的视频,时间戳可能是 MM:SS 格式,而对于较长的视频,则需要 HH:MM:SS。这种不一致可能导致解析错误和不正确的时间计算。

这是此问题可能如何显现的简单示例

class Segment(BaseModel):
    title: str = Field(..., description="The title of the segment")
    timestamp: str = Field(..., description="The timestamp of the event as HH:MM:SS")


# This might work for some cases, but fails for others:
# "2:00" could be interpreted as 2 minutes or 2 hours
# "1:30:00" doesn't fit the expected format

这种方法没有考虑到时间戳格式的可变性,可能导致误解。

解决方案

为了解决这个问题,我们可以结合使用 Pydantic 进行数据验证和自定义解析器来处理不同的时间戳格式。以下是我们的实现方法

  1. 定义预期的时间格式
  2. 使用自定义验证器解析并规范化时间戳
  3. 确保输出始终采用一致的格式

让我们看看改进后的实现

from pydantic import BaseModel, Field, model_validator
from typing import Literal


class SegmentWithTimestamp(BaseModel):
    title: str = Field(..., description="The title of the segment")
    time_format: Literal["HH:MM:SS", "MM:SS"] = Field(
        ..., description="The format of the timestamp"
    )
    timestamp: str = Field(
        ..., description="The timestamp of the event as either HH:MM:SS or MM:SS"
    )

    @model_validator(mode="after")
    def parse_timestamp(self):
        if self.time_format == "HH:MM:SS":
            hours, minutes, seconds = map(int, self.timestamp.split(":"))
        elif self.time_format == "MM:SS":
            hours, minutes, seconds = 0, *map(int, self.timestamp.split(":"))
        else:
            raise ValueError("Invalid time format, must be HH:MM:SS or MM:SS")

        # Normalize seconds and minutes
        total_seconds = hours * 3600 + minutes * 60 + seconds
        hours, remainder = divmod(total_seconds, 3600)
        minutes, seconds = divmod(remainder, 60)

        if hours > 0:
            self.timestamp = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
        else:
            self.timestamp = f"00:{minutes:02d}:{seconds:02d}"

        return self

此实现提供了几个优点

  1. 它明确定义了预期的时间格式,减少了歧义。
  2. 自定义验证器根据指定的格式解析输入。
  3. 它将所有时间戳规范化为一致的 HH:MM:SS 格式。
  4. 它处理边缘情况,例如分钟或秒数超过 59 的情况。

为什么这种方法优于替代方案

您可能想知道为什么我们不能单独使用约束采样方法或 JSON Schema 来解决这个问题。原因在于时间戳解析通常需要超出简单模式匹配的上下文感知处理。

  1. 约束采样可能会强制使用特定格式,但它无法处理不同格式之间的转换或时间的规范化。

  2. JSON Schema 可以验证数据的结构,但它无法执行时间戳所需的复杂解析和规范化。

我们的方法结合了 Schema 验证(使用 Pydantic)和自定义逻辑的优势,以处理时间戳格式的复杂性。

测试解决方案

为了确保我们的实现按预期工作,我们可以创建一些测试用例

if __name__ == "__main__":
    # Test cases for SegmentWithTimestamp
    test_cases = [
        (
            SegmentWithTimestamp(
                title="Introduction", time_format="MM:SS", timestamp="00:30"
            ),
            "00:00:30",
        ),
        (
            SegmentWithTimestamp(
                title="Main Topic", time_format="HH:MM:SS", timestamp="00:15:45"
            ),
            "00:15:45",
        ),
        (
            SegmentWithTimestamp(
                title="Conclusion", time_format="MM:SS", timestamp="65:00"
            ),
            "01:05:00",
        ),
    ]

    for input_data, expected_output in test_cases:
        try:
            assert input_data.timestamp == expected_output
            print(f"Test passed: {input_data.timestamp} == {expected_output}")
        except AssertionError:
            print(f"Test failed: {input_data.timestamp} != {expected_output}")

    # Output:
    # Test passed: 00:00:30 == 00:00:30
    # Test passed: 00:15:45 == 00:15:45
    # Test passed: 01:05:00 == 01:05:00

这些测试用例表明,我们的解决方案正确处理了不同的输入格式,并将它们规范化为一致的输出格式。

结论

处理语言模型输出时需要进行解析和验证。这不是为了强制语言模型,而是为了构建有效的输入以供下游系统使用。将 Pydantic 的验证与逻辑相结合可确保跨格式的处理。这种方法解决了时间戳不一致的问题,并为 NLP 任务中的挑战提供了框架。

在处理语言模型中的基于时间的数据时,应考虑格式的可变性,并实施验证和规范化以保持一致性。