标签: Azure

  • 在 Azure 中使用 Elasticsearch(Elastic Cloud)的要点 (下篇 )

    在 Azure 中使用 Elasticsearch(Elastic Cloud)的要点 (下篇 )

    本文作为在 Azure 中使用 Elasticsearch(Elastic Cloud)的要点下篇,将介绍在 Elastic Cloud 中执行以下操作的步骤。

    1. 版本升级

    1. 审计日志设置

    1. 版本升级

    关于 Elastic Stack 的版本升级

    Elastic Stack 有两种版本升级方式,各自的特点如下表所示:

    序号版本升级方式特点
    1滚动升级(Rolling Upgrade)无需停止服务即可完成版本升级
    2全集群升级(Full Cluster Upgrade)需先将服务全部停止

    在 Elastic Cloud 中,版本升级采用上述第 1 种 “滚动升级” 方式,因此无需停止服务即可完成版本升级。有关升级的详细信息,请参考以下链接:Upgrade versions | Elasticsearch Service Documentation | Elastic

    此外,在 Elastic Cloud 中,只需在图形用户界面(GUI)上点击一下,即可完成版本升级。下面实际操作一下具体步骤。

    在 Elastic Cloud 中升级 Elastic Stack

    (1)根据需要将 Deployment设为维护模式

    在 Elastic Cloud 中,如果对高负载的 Deployment 应用设置变更,不仅设置变更会耗费较长时间,最坏情况下还可能导致服务响应中断、设置变更失败。因此,虽然理论上无需停止服务即可完成版本升级,但当 Deployment 处于高负载状态时,也建议先将其切换为维护模式,之后再进行升级。

    访问 Elastic Cloud 的 Deployment 页面,选择菜单中的 “Edit”

    点击“Edit”

    在页面底部的 “Extented maintenance”(扩展维护)处勾选复选框,然后点击 “Save”(保存),即可将 Deployment 设为维护模式。

    在 “Extented maintenance” 处勾选复选框,点击 “Save”

    (2)点击 Elastic Cloud 的 Deployment 页面右侧的 “Upgrade”

    点击 “Upgrade”

    (3)选择版本,点击 “Upgrade”

    (=选择版本,点击 “Upgrade”

    通过以上步骤,即可完成版本升级。无需复杂操作就能轻松升级版本,从而持续使用最新功能,这是 Elastic Cloud 的一大重要优势。

    2. 审计日志设置

    关于 Elastic Stack 的审计日志

    Elasticsearch 和 Kibana 均支持输出审计日志。通过审计日志,可监控认证失败、连接拒绝等与安全相关的事件。

    有关审计日志的详细信息,请参考以下文档:

    审计日志默认处于未启用状态,因此需按以下步骤开启。

    (1)在 Elastic Cloud 的 Deployment管理页面中,点击 “Edit”

    点击 “Edit”

    (2)点击 Elasticsearch 右侧的链接 “Manage user settings and extensions”

    点击 Elasticsearch 右侧的 “Manage user settings and extensions”

    (3)为 Elasticsearch 应用审计日志设置

    设置内容如下:

    xpack.security.audit.enabled: true

    (4)点击 Kibana 右侧的链接 “Edit user settings”

    点击 “Edit user settings”

    (5)为 Kibana 也应用审计日志设置

    设置内容如下:

    xpack.security.audit.enabled: true

    (6)点击页面下方的 “Save”,应用设置

    点击 “Save”

    (7)在 Monitoring功能的 Logs中查看审计日志

    此时会输出 Elasticsearch 和 Kibana 的审计日志。

    查看审计日志

    从上述审计日志中可以看到,“y_nomura” 用户在两次认证失败(红色高亮部分)后,最终认证成功(黄色高亮部分)。通过输出此类审计日志,能够确认 “谁在何时登录”“访问了哪些资源” 等关键信息。

    总结

    截至目前,我们已通过操作篇,讲解了使用 Elastic Cloud 的关键要点。但除此之外,针对不同使用场景,仍有许多需要考虑的事项。

  • Azure 中使用 Elasticsearch(Elastic Cloud)的要点(上篇)

    Azure 中使用 Elasticsearch(Elastic Cloud)的要点(上篇)

    本文作为Azure 中使用 Elasticsearch(Elastic Cloud)的要点上篇,将介绍操作 Elastic Cloud 所需的各类设置的实施步骤。

    本文中,Elastic Cloud(Elasticsearch Service)将统一表述为 “Elastic Cloud”。

    1. 监控设置(Metric/Logs)

    关于监控功能

    利用监控功能,可一目了然地掌握集群状态;且当发生任何问题时,能够从资源和日志两方面快速开展问题排查。

    在 Elastic Cloud 中启用监控功能

    监控功能默认未启用,需通过以下步骤进行启用:

    (1) 访问 Elastic Cloud 的 Deployment页面,点击菜单中的 “Logs and metrics”

    点击 “Logs and metrics”

    (2) 点击 “Ship to a deployment”中的 “Enable”

    点击 “Enable”

    (3) 选择已构建的 Deployment,点击 “Save”

    监控功能即启用成功。

    点击 “Save”

    查看 Metric

    通过 Metric 可查看 Elastic Stack 各组件的服务器资源占用情况:

    (1) 在 Kibana 页面左侧菜单中,点击 “Stack Monitoring”

    点击 “Stack Monitoring”

    (2) 点击 Elasticsearch 的 “Overview”

    在概览中,可实时查看 Elasticsearch 整体的搜索性能与索引性能。

    点击 “Overview”

    (3) 在 Elasticsearch 的「Nodes」中,选择一个实例并点击

    从「Nodes」(节点)中选择一个实例并点击

    可实时查看每台服务器的资源状况。

    查看 Metric

    查看 Logs(日志)

    通过 Logs 可实时查看、筛选日志并开展排查工作:

    (1) 在 Kibana 页面左侧菜单中,点击 “Logs”

    点击 “Logs”

    在 Stream(流)页面中,会实时显示已导入 Elasticsearch 的各类日志。

    日志实时显示

    (2) 在画面顶部的搜索框中输入 “error”,执行日志筛选

    可通过筛选日志开展问题排查。

    输入 “error” 并执行日志筛选

    修改 Metric(指标)的保留期限

    Metric 的默认保留期限为 3 天。由于不同需求对应的保留期限可能不同,下面我们来修改这一设置:

    (1) 在 Kibana 页面左侧菜单中,点击 “Stack Management”

    点击 “Stack Management”

    (2) 点击 “Index Lifecycle Policies”(索引生命周期策略)

    点击 “Index Lifecycle Policies”

    (3) 在搜索框中输入 “.monitoring”,点击显示结果中的 “.monitoring-8-ilm-policy”

    点击 “.monitoring-8-ilm-policy”

    Elasticsearch 会将索引按 “阶段(Phase)” 进行管理,阶段的转换条件通过 ILM(Index Lifecycle Management,索引生命周期管理)进行定义。

    详情可参考以下链接:ILM: Manage the index lifecycle | Elasticsearch Guide [8.14] | Elastic

    修改前的设置如下表所示:

    阶段设置值
    Hot 阶段索引创建后 3 天,或主分片大小达到 50GB 以上时,对索引执行 Rollover(滚动更新)
    Warm 阶段执行 Forcemerge(强制合并),将分片段数合并为 1
    Delete 阶段滚动更新后 3 天,删除该索引

    简单来说,Hot 阶段中定义的 “Rollover(滚动更新)” 是指当满足特定条件时,自动创建新索引的功能。

    详情可参考以下链接:Rollover | Elasticsearch Guide [8.14] | Elastic

    (4) 将 Delete 阶段的数值从 “3 days”修改为 “31 days”,点击 “Save Policy”

    修改设置并点击 “Save Policy”

    通过上述步骤,已完成设置修改,滚动更新后 31 天的索引将被自动删除。

    2. Snapshot设置

    关于 Snapshot设置

    在 Elastic Cloud 中,默认设置为每 30 分钟获取一次快照。下面我们对该设置进行确认与修改:

    (1) 在 Kibana 页面左侧菜单中,点击 “Stack Management”

    点击 “Stack Management”

    (2) 点击 “Snapshot and Restore”

    点击 “Snapshot and Restore”

    (3) 点击 “Policies”标签页,点击 “cloud-snapshot-policy” 右侧的 “Edit”按钮

    点击 “Edit” 按钮

    (4) 修改「Schedule」的设置值

    时间设置可通过 Cron 表达式进行配置。另外,请注意时间采用 UTC 时区。

    详情可参考:API conventions | Elasticsearch Guide [8.14] | Elastic

    修改 “Schedule” 的设置值

    (5) 根据需要修改 “Expiration”、“Snapshots to retain”的设置值

    根据需要修改设置

    (6) 点击 “Save policy”

    点击 “Save policy”

    (7) 点击 “cloud-snapshot-policy”,查看 “Summary”

    修改后,Snapshot将在每天 0 点自动获取。

    查看 “Summary”

    3. 告警设置

    关于 Elastic Cloud 的告警功能

    在 Elastic Cloud 中,可通过 Alert功能实现监控与通知。此外,系统默认提供了多个可配置的监控项,便于快速完成 Alert设置。下面我们通过创建默认规则来使用 Alert功能:

    (1) 从左侧菜单点击 “Stack Monitoring”,在监控页面右上角选择 “alerts and rules”,点击 “Create default rules”

    点击 “Create default rules”

    (2) 点击 “Create”至此,告警设置完成。最后我们来确认已创建的规则列表。

    点击 “Create”

    (3) 点击 “Stack Management”,选择 “Alerts”,然后点击页面右上角的 “Manage rules”

    点击 “Manage rules”

    此时会显示已创建的规则列表。通过编辑规则,可修改触发条件及配置通知方式。

    已创建的规则列表

    例如,“CPU Usage”规则会在 CPU 使用率 5 分钟平均值超过 85% 时触发检测并发送通知。

    CPU Usage(CPU 使用率)

    另外,默认设置下通知会输出至 Kibana 日志,但也可使用邮件、Slack 等多种连接器作为通知渠道。

    连接器列表

    总结

    在实际操作过程中,除了上述 设置外,可能还需要应对以下需求:

    • 版本升级对应
    • 审计日志

    因此,我们将在下次的文章中对上述内容进行讲解。

  • 借助 Azure MCP Server 与 GitHub Copilot,尽可能简化 Azure 应用搭建流程

    借助 Azure MCP Server 与 GitHub Copilot,尽可能简化 Azure 应用搭建流程

    Model Context Protocol(MCP)问世已有一段时间,在此期间,支持 MCP 的服务不断增多,其作为大语言模型(LLM)工具的应用范围也在逐步扩大。无论是工具提供方还是客户端的服务数量都在增加,预计今后支持 MCP 的场景还将进一步拓展。

    在这样的背景下,微软推出了 Azure MCP Server—— 一款可通过 MCP 操作 Azure 资源的 MCP 服务器。(相关链接:github.com

    目前,该服务器可操作的资源虽有限,但已能实现 CosmosDB、Blob Storage 等数据的查询功能。本文将先简要介绍 MCP,随后讲解如何从 GitHub Copilot 调用 Azure MCP Server,从而轻松搭建使用 Azure 资源的 Web 应用。

    MCP 是什么

    MCP 是 Model Context Protocol 的缩写,顾名思义,它指的是一种协议(即标准规范)。具体而言,这是一种针对 “使用 LLM 模型的应用在调用工具时,如何获取上下文并调用工具” 这一流程所制定的标准规范。

    提到工具调用,大家可能会想到 Function Calling(函数调用),但 MCP 与它属于不同层面的概念,具体区别如下:

    • Function Calling(函数调用):输入用户提示词与各工具的信息后,选择并调用对应工具的功能。
    • MCP:规定了 LLM 应用应如何选择工具、工具方应如何提供工具的标准规范。

    在 Model Context Protocol 中,定义了 “MCP Server”(MCP 服务器)与 “MCP Client”(MCP 客户端)两种角色:

    • 宿主(Host):指使用 MCP 的 LLM 应用。
    • MCP Server(MCP 服务器):提供工具,负责提供工具信息并执行工具调用。
    • MCP Client(MCP 客户端):从 MCP Server 获取工具信息,决定调用哪个工具并执行调用操作。
    https://modelcontextprotocol.io/docs/concepts/architecture

    严格来说,MCP Server 还可提供提示词模板等其他功能,本文在此暂不展开说明。

    例如,Claude Desktop、GitHub Copilot 等属于工具调用方服务,对应上述的 “宿主”,其内部包含了 MCP 客户端。

    本文将按照以下架构开展操作:通过由 NodeJS 启动的 MCP Server 来操作 Azure 资源。

    关于 Azure MCP Server

    这是微软发布的 MCP 服务器,可通过工具提供 Azure 资源的操作能力,支持标准输入与 HTTP 两种通信方式。

    可操作的内容示例如下:

    • 获取 CosmosDB 容器列表
    • 向 CosmosDB 容器执行 SQL 查询
    • 获取 Blob Storage 容器列表

    搭建使用 Azure 资源的 Web 应用

    本次我们将搭建一个简易 Web 应用,实现文件的上传、下载与删除功能,并记录 “谁在何时上传了文件”。后端将采用 Blob Storage 作为文件存储,CosmosDB 用于管理上传历史。

    开发环境如下:

    • VS Code Insiders
    • GitHub Copilot
    • Python 3.10.11

    启动 Azure MCP Server

    启动 Azure MCP Server 十分简单。

    https://github.com/Azure/azure-mcp

    执行以下命令启动服务器

    bashnpx -y @azure/mcp@latest server start --transport sse

    若出现如下输出,则表示启动成功

    plaintextinfo: Microsoft.Hosting.Lifetime[14]

    Now listening on: http://localhost:5008

    配置 VS Code 中的 GitHub Copilot,使其适配 Azure MCP Server

    仅启动 MCP Server 无法让客户端识别,需完成注册操作以确保 LLM 应用能正常识别。由于本次使用 GitHub Copilot,具体操作可参考链接code.visualstudio.com

    核心步骤为在 .vscode/mcp.json 文件中写入以下内容即可:

    json

    {
        "servers": {
            "azure-mcp-dev": {
                "url": "http://localhost:5008"
            }
        }
    }
    

    通过 GitHub Copilot 搭建应用

    首先,需预先在 Azure 中手动创建以下资源组及资源:

    • 资源组:mcp-dev
    • CosmosDB:ssk-mcp-cosmos-dev
    • 存储账户:sskmcpblobdev

    理论上,我们希望让 Azure MCP Server 完成资源创建的全过程,但将资源创建操作完全交给 LLM 存在一定风险,因此本次仅手动完成这部分工作。

    完成上述准备后,向已关联 Azure MCP Server 的 GitHub Copilot 输入以下提示词:

    “我想在名为 mcp-dev 的资源组中,使用 Blob Storage 和 CosmosDB 搭建一个文件上传管理系统。

    • 支持用户各自上传、下载、删除文件。
    • 通过 CosmosDB 记录每个用户何时更新了哪个文件。
    • 使用 Python 的 FastAPI 进行开发。

    请基于上述条件完成以下操作:

    • 修改 Azure 资源配置。
    • 输出展示数据库与存储配置的文档。”

    此时,Copilot 会先检查现有资源状态,如下所示:

    其中显示 “Ran azmcp-group-list” 的部分,即为正在执行 Azure MCP Server 操作的过程,能看出它正在确认资源组、存储及 CosmosDB 的状态。

    Copilot 在首次回复中会告知所需的设计方案,之后我们可进一步指令其输出代码。

    需要注意的是,Copilot 会生成源代码,但不会主动创建容器。由于若不明确指示,它通常不会执行修改资源的操作,因此需补充相关指令。

    补充指令后,资源所需的各个容器便会分别创建完成。

    至此,源代码与后端资源的搭建就全部完成了。

    实际使用体验

    下面我们来运行一下这个应用。界面是通过向 GitHub Copilot 输入提示词生成的。

    由于没有对外观做任何指定,所以界面处于最基础的状态。这里展示的是已上传 schema.json 文件后的状态,Azure 资源中也同步了上传的文件及相关操作历史。

    像这样,借助 Azure MCP Server 与 GitHub Copilot,从 Azure 资源配置到应用创建的全过程,都可以通过提示词一次性完成。在 Azure 上搭建简单应用时,这一组合应该会非常实用。

    总结

    本文借助 Azure MCP Server 与 GitHub Copilot,轻松验证了 Azure 资源配置与应用开发的全流程。

    除了 GitHub Copilot 原本就具备的应用创建能力外,现在连适配应用的资源配置都能通过提示词一站式完成,非常便捷。

    未来,MCP Server 的工具扩展功能还将进一步完善,想必能为我们带来更高效的开发体验。

    那么,我们下次再见。

  • 使用 Azure Content Understanding 从视频生成结构化数据

    使用 Azure Content Understanding 从视频生成结构化数据

    最近我沉浸在 LLM(大语言模型)的微调工作中。

    在去年的 Microsoft Ignite 2024 大会上,微软发布了名为 Azure Content Understanding 的服务。该服务能以 Office 文档、图像、音频、视频等文件为基础,利用生成式 AI 等技术,将数据导入用户自定义的结构中,以便在 RAG(检索增强生成)系统等场景中轻松使用。

    以往处理这类数据时,音频需要用到 Speech Service(语音服务),图像需要用到 AI Vision(人工智能视觉)等不同服务分别进行数据处理,而现在只需通过这一项服务定义好结构,就能完成所有处理流程。本次我们就将使用 Azure Content Understanding,从视频中创建便于导入搜索引擎等系统的 JSON 格式结构化数据。

    Azure Content Understanding 是什么

    正如文章开头所介绍的,Azure Content Understanding 能够通过单一服务从多种格式的文件中创建结构化数据。

    在创建结构化数据的过程中,可实现如图所示的文件内文字提取、转录文本生成等内容提取操作。此外,通过生成式 AI 从提取的内容中生成用户定义的项目,还能将文件转换为结构化数据。

    以文档转换为检索数据为例,原本需要通过 OCR(光学字符识别)提取字符串→使用 LLM 提取数据→转换为 JSON 这样的流水线式实现,而借助该功能,只需创建相应定义即可完成,非常便捷。而且单一服务就能支持多种文件类型的处理。

    目前该服务处于预览阶段,暂可免费使用,价格详情将在后续公布。

    使用 Azure Content Understanding 的准备工作

    要使用 Azure Content Understanding,需在 West US(美国西部)、Sweden Central(瑞典中部)、Australia East(澳大利亚东部)这三个区域中的任意一个创建 Azure AI Services 资源。请注意,其他区域暂不支持该服务。

    使用 Azure Content Understanding 解析视频文件

    接下来,我们实际使用 Azure Content Understanding 从视频文件中提取摘要和类别信息。本次将借助以下链接提供的示例,通过 Python 来执行操作。

    示例链接:github.com

    具体实施步骤如下:

    1. 创建数据分析定义
    2. 创建分析器
    3. 使用分析器对文件进行分析

    创建数据分析定义

    首先,定义目标文件格式以及需要提取的数据内容。

    创建如下 JSON 文件:

    {
        "description": "从视频中提取文件的示例",
        "scenario": "videoShot", 
        "config": {
            "returnDetails": true,
            "locales": [
                "ja-JP"
            ],
            "enableFace": false
        },
        "fieldSchema": {
            "fields": {
                "summary": {
                    "type": "string",
                    "method": "generate",
                    "description": "概括内容的一句话"
                },
                "category": {
                    "type": "string",
                    "method": "classify",
                    "description": "视频文件的类别",
                    "enum": [
                        "IT",
                        "Economy",
                        "Nature"
                    ]
                }
            }
        }
    }
    

    该定义的核心要点如下:

    • 因目标为视频,需在scenario(场景)中指定videoShot
    • locales(区域设置)中因需处理日语,仅配置ja-JP
    • fieldSchema(字段 schema)中定义以下两个需提取的项目:
      • summary:概括视频内容的文本
      • category:从 IT、Economy(经济)、Nature(自然)中选择的视频类别

    fieldSchema的设置内容中,生成式 AI 会根据description(描述)的内容提取字段信息,因此description是重要的调优项。不过本次仅为简单的功能验证,故使用简洁的描述进行测试。

    创建分析器

    完成定义后,需创建用于读取文件并进行分析的分析器。目前仅能通过 GUI(图形用户界面)或 REST API 创建和运行分析器。但上述 GitHub 链接中提供了对 API 进行封装的工具类,本次将使用该工具类进行开发。

    github.com

    通过以下代码即可创建分析器:

    import uuid
    
    # 生成分析器名称
    ANALYZER_TEMPLATE = "video"
    ANALYZER_ID = "video-sample-" + str(uuid.uuid4())
    
    # 创建ContentUnderstanding客户端
    client = AzureContentUnderstandingClient(
        endpoint=AZURE_AI_ENDPOINT,
        api_version=AZURE_AI_API_VERSION,
        subscription_key=AZURE_AI_SUBSCRIPTION_KEY
    )
    # 读取数据分析定义并创建分析器
    response = client.begin_create_analyzer(ANALYZER_ID, analyzer_template_path="./content_video.json")
    result = client.poll_result(response)
    

    执行到这里,分析器就创建完成了,接下来只需执行分析操作即可。

    运行分析器

    接下来,我们让分析器加载视频文件并执行分析。

    本次分析的目标文件是视频:www.youtube.com

    该视频讲解了子网掩码的基础知识,因此预期结果是能够提取出相关内容。

    执行过程非常简单,仅需以下 2 行代码即可完成:

    response = client.begin_analyze(ANALYZER_ID, file_location=analyzer_sample_file_path)
    result = client.poll_result(response)
    

    获取分析结果所需的时间因文件而异,本次针对 11 分钟的视频,大约花费了 5 分钟。

    分析结果

    最终会得到如下所示的 JSON 数据,因完整内容过长,此处仅节选部分展示:

    {
      "id": "82eb4975-4232-44a1-a4e6-d018fa45469f",
      "status": "Succeeded",
      "result": {
        "analyzerId": "video-sample-31341919-bf0d-45af-9228-7866b252a70a",
        "apiVersion": "2024-12-01-preview",
        "createdAt": "2025-01-28T05:32:48Z",
        "warnings": [],
        "contents": [
          {
            "markdown": "# 片段 00:00.000 => 00:03.303\n## 转录文本\n```\nWEBVTT\n\n```\n## 关键帧\n- 00:00.825 ![](keyFrame.825.jpg)\n- 00:01.650 ![](keyFrame.1650.jpg)\n- 00:02.475 ![](keyFrame.2475.jpg)",
            "fields": {
              "category": {
                "type": "string",
                "valueString": "IT"
              },
              "summary": {
                "type": "string",
                "valueString": "这是面向新入职年轻工程师的IT基础知识讲解视频,本次将介绍子网掩码与CIDR。"
              }
            },
            "kind": "audioVisual",
            "startTimeMs": 0,
            "endTimeMs": 3303,
            "width": 1280,
            "height": 720,
            "KeyFrameTimesMs": [
              825,
              1650,
              2475
            ],
            "transcriptPhrases": []
          },
          {
            "markdown": "# 片段 00:03.303 => 01:02.106\n## 转录文本\n```\nWEBVTT\n\n00:04.680 --> 00:28.960\n<v 讲解者>接下来我们来介绍子网掩码。刚才我们讲了设置本地网络,并在其中配置和使用IP地址的内容。那么具体如何定义本地网络呢?这里我们采用将IP地址分为网络部分和主机部分的方式来考虑。\n00:29.480 --> 00:59.000\n<v 讲解者>具体怎么做呢?当有一个IP地址时,我们把其中的每个数字用比特来表示,也就是用二进制来书写。这样就会形成这样的形式,此时以某个位置为界限,前半部分称为网络部分,后半部分称为主机部分。可以说,前半部分的网络部分代表了网络本身。\n00:59.600 --> 01:27.680\n<v 讲解者>就是这样。而后面的主机部分则代表了隶属于该网络的各个设备的位置。也就是说,只要前半部分的网络部分一致,就会被视为同一个网络。关于网络的定义方式,“类”的概念从以前就一直在使用。类分为三种,即A类、B类、C类。\n```\n## 关键帧\n- 00:06.072 ![](keyFrame.6072.jpg)\n- 00:08.844 ![](keyFrame.8844.jpg)\n- 00:11.616 ![](keyFrame.11616.jpg)\n- 00:14.388 ![](keyFrame.14388.jpg)\n- 00:17.160 ![](keyFrame.17160.jpg)\n- 00:19.932 ![](keyFrame.19932.jpg)\n- 00:22.704 ![](keyFrame.22704.jpg)\n- 00:25.476 ![](keyFrame.25476.jpg)\n- 00:28.248 ![](keyFrame.28248.jpg)\n- 00:31.020 ![](keyFrame.31020.jpg)\n- 00:33.792 ![](keyFrame.33792.jpg)\n- 00:36.564 ![](keyFrame.36564.jpg)\n- 00:39.336 ![](keyFrame.39336.jpg)\n- 00:42.108 ![](keyFrame.42108.jpg)\n- 00:44.880 ![](keyFrame.44880.jpg)\n- 00:47.652 ![](keyFrame.47652.jpg)\n- 00:50.424 ![](keyFrame.50424.jpg)\n- 00:53.196 ![](keyFrame.53196.jpg)\n- 00:55.968 ![](keyFrame.55968.jpg)\n- 00:58.740 ![](keyFrame.58740.jpg)",
            "fields": {
              "summary": {
                "type": "string",
                "valueString": "讲解者对子网掩码进行了说明,介绍了将IP地址分为网络部分和主机部分的方法,同时也提及了A类、B类、C类的网络定义方式。"
              },
              "category": {
                "type": "string",
                "valueString": "IT"
              }
            },
            "kind": "audioVisual",
            "startTimeMs": 3303,
            "endTimeMs": 62106,
            "width": 1280,
            "height": 720,
            "KeyFrameTimesMs": [
              6072,
              8844,
              11616,
              14388,
              17160,
              19932,
              22704,
              25476,
              28248,
              31020,
              33792,
              36564,
              39336,
              42108,
              44880,
              47652,
              50424,
              53196,
              55968,
              58740
            ],
            "transcriptPhrases": [
              {
                "speaker": "speaker",
                "startTimeMs": 4680,
                "endTimeMs": 28960,
                "text": "接下来我们来介绍子网掩码。刚才我们讲了设置本地网络,并在其中配置和使用IP地址的内容。那么具体如何定义本地网络呢?这里我们采用将IP地址分为网络部分和主机部分的方式来考虑。",
                "confidence": 1,
                "words": [],
                "locale": "en-US"
              },
              {
                "speaker": "speaker",
                "startTimeMs": 29480,
                "endTimeMs": 59000,
                "text": "具体怎么做呢?当有一个IP地址时,我们把其中的每个数字用比特来表示,也就是用二进制来书写。这样就会形成这样的形式,此时以某个位置为界限,前半部分称为网络部分,后半部分称为主机部分。可以说,前半部分的网络部分代表了网络本身。",
                "confidence": 1,
                "words": [],
                "locale": "en-US"
              },
              {
                "speaker": "speaker",
                "startTimeMs": 59600,
                "endTimeMs": 87680,
                "text": "就是这样。而后面的主机部分则代表了隶属于该网络的各个设备的位置。也就是说,只要前半部分的网络部分一致,就会被视为同一个网络。关于网络的定义方式,“类”的概念从以前就一直在使用。类分为三种,即A类、B类、C类。",
                "confidence": 1,
                "words": [],
                "locale": "en-US"
              }
            ]
          },
    

    推测其内部可能使用了类似 Video Indexer 的技术,能够自动将视频按章节分割,并获取每个章节的转录文本和关键帧时间。此外,自定义定义的summary(摘要)和category(类别)也能按章节获取,且内容准确无误。

    只需简单定义并运行分析器,就能将视频结构化到如此详细的程度,非常便捷。同时还附带转录文本,作为检索数据也十分有效。

    总结

    本次我们尝试使用 Azure Content Understanding 对视频数据进行了结构化处理。

    整个过程几乎无需耗费过多精力就能完成视频数据的解析,是一款非常实用的服务。虽然目前仍处于预览阶段,但该服务在 RAG 数据等场景中具有极为广泛的应用前景,未来我还会进一步探索其更多使用方法。