[AI-video] 数据模型与架构 | LLM集成

第五章:数据模型与架构

欢迎来到第五章!

在前几章中,我们学习了网页用户界面(UI)(控制面板)、应用配置(系统参数设置)、任务编排(视频生成流程的总调度)和任务状态管理(进度追踪机制)。

现在我们将探讨支撑这些功能的基础构件数据模型与架构

什么是数据模型与架构?

想象烘焙蛋糕时需要食谱(操作指南)和精确配比的原料(数据)。但如何确定面粉该用什么碗装?糖的计量方式?这需要原料与工具的结构化组织

在软件系统中,数据模型架构正是为此而生:

  • 架构(Schema):类似蓝图模板,定义数据组成要素、类型(文本/数值/布尔值/列表等)及组织方式。例如"用户"架构可能包含name(文本)、age(数值)、is_active(布尔值)三个字段。
  • 数据模型:基于架构创建的具体实例对象,严格遵循蓝图规则。例如用户模型的实例可能是{ "name": "Alice", "age": 30, "is_active": true }

在MoneyPrinterTurbo中,数据模型与架构用于定义:

  • 视频生成请求的结构(用户在UI中配置的所有参数)
  • 视频素材信息的格式(如URL地址、时长等)
  • 系统内部模块/外部服务间的通信协议
  • 第四章所述任务状态的数据结构

这种结构化设计确保数据组织有序、格式统一,便于各模块正确处理与流转。

基于Pydantic的数据模型实现

前文传送:[Meetily后端框架] AI摘要结构化 | SummaryResponse模型 | Pydantic库 | vs marshmallow库

MoneyPrinterTurbo使用Python库Pydantic构建数据模型:

  • Pydantic特性:通过Python类型提示(如str/int/bool/list)定义数据结构。创建模型对象时自动验证数据合规性,若类型错误(如文本填入数值字段)则抛出异常。
  • 选择Pydantic的原因
    • 定义清晰:代码中显式声明数据结构
    • 自动校验:数据输入时即时验证
    • 类型转换:自动将字典等原始数据转为结构化对象

项目主要数据模型定义于app/models/schema.py,均继承自Pydantic的BaseModel

核心模型示例:VideoParams

视频生成的核心模型是VideoParams,它完整承载用户在UI中配置的所有参数。以下是app/models/schema.py中的简化定义:

# 摘自app/models/schema.py的简化代码
from typing import Optional, List, Union
from enum import Enum
from pydantic import BaseModel
import pydantic.dataclasses# 视频比例枚举定义
class VideoAspect(str, Enum):landscape = "16:9"   # 横屏portrait = "9:16"    # 竖屏square = "1:1"       # 正方形# 素材信息数据结构
@pydantic.dataclasses.dataclass
class MaterialInfo:provider: str = "pexels"  # 素材源url: str = ""             # 素材URLduration: int = 0         # 素材时长# 主视频参数模型
class VideoParams(BaseModel):video_subject: str                # 必填:视频主题(字符串)video_script: str = ""            # 可选:剧本文本(默认空字符串)video_terms: Optional[str | list] = None  # 可选:关键词(字符串/列表/空值)video_aspect: Optional[VideoAspect] = VideoAspect.portrait.value  # 比例(枚举值)video_clip_duration: Optional[int] = 5  # 素材片段时长(默认5秒)# ... 其他视频/音频/字幕参数 ...video_materials: Optional[List[MaterialInfo]] = None  # 素材列表(MaterialInfo对象)subtitle_enabled: Optional[bool] = True  # 字幕开关(布尔值,默认开启)font_size: int = 60                      # 字体大小(整型,默认60)# ... 更多字幕参数 ...# Pydantic配置(高级设置)class Config:arbitrary_types_allowed = True

关键要素解析:

  • 继承结构class VideoParams(BaseModel)声明继承自Pydantic基类
  • 字段类型
    • video_subject: str 必填字符串字段
    • video_script: str = "" 带默认值的可选字段
    • Optional[...] 表示可空字段(如Optional[str]可为字符串或None
    • Union[bool, str] 允许布尔值或字符串(如字幕背景颜色字段)
  • 嵌套模型List[MaterialInfo]表示该字段为MaterialInfo对象的列表
  • 枚举约束VideoAspect枚举限制比例参数只能取三个预定义值

模型在系统中的应用

数据模型贯穿系统各模块的交互流程:

1. 网页UI的数据封装

用户在UI表单填写参数后,数据被封装为字典并转换为VideoParams对象:

# 网页UI(Streamlit)中的概念代码
from app.models.schema import VideoParams# 收集表单数据
ui_data = {"video_subject": st.session_state["video_subject_input"],"video_aspect": st.session_state["video_aspect_select"],# ... 其他参数 ...
}try:# 创建结构化对象video_params = VideoParams(**ui_data)print(f"创建视频参数对象:{video_params.video_subject}")# 传递给任务编排器# start_video_task(video_params)
except pydantic.ValidationError as e:st.error(f"参数错误:{e}")  # 数据校验失败时提示

此过程通过Pydantic自动校验数据合法性,确保传入编排器的参数结构正确。

2. 任务编排器的参数传递

编排器入口函数明确接收VideoParams类型参数:

# 摘自app/services/task.py的简化代码
from app.models.schema import VideoParamsdef start(task_id, params: VideoParams):logger.info(f"任务{task_id}启动,主题:{params.video_subject}")# 直接访问结构化参数aspect_ratio = params.video_aspectfont_size = params.font_size# ... 调用各服务模块 ...

通过params.field_name的点语法,编排器可高效获取各项参数,无需处理原始字典数据。

3. 服务间通信

其他服务模块也采用模型化交互:

  • 素材服务返回MaterialInfo对象列表
  • API接口使用TaskResponse/VideoScriptResponse等模型定义请求响应格式
  • 状态管理器存储的任务状态数据遵循TaskQueryResponse结构

4. 状态管理的结构化存储

第四章所述状态数据虽然以字典形式存储,但查询响应仍通过模型保证结构一致性:

# 状态查询响应模型示例
class TaskQueryResponse(BaseModel):task_id: strstate: intprogress: intvideos: Optional[List[str]] = Noneerror: Optional[str] = None

Pydantic的底层运作机制

创建Pydantic模型实例时发生以下过程:

  1. 数据解析:将原始数据(如UI提交的字典)转换为字段值
  2. 类型校验:验证各字段类型是否符合定义
  3. 自动转换:尝试类型兼容转换(如字符串"123"转为整型123)
  4. 对象实例化:校验通过后生成结构化对象

以下序列图展示模型在系统中的应用流程:

在这里插入图片描述

该流程体现了模型如何确保从用户输入到状态存储的全链路数据一致性

总结

数据模型与架构作为系统基石,通过Pydantic等工具实现结构化数据定义与校验。VideoParams等模型清晰定义了视频生成任务的参数结构,贯穿UI、编排器、服务模块与状态管理的全流程。这种设计保障了数据流动的可靠性与系统扩展性。

接下来我们将深入探讨驱动剧本生成的核心模块:大语言模型服务,解析AI如何将用户主题转化为精彩剧本。

下一章:大语言模型服务


第六章:LLM集成

在前几章中,我们探讨了《第一章:配置》(如何设置系统)、《第二章:任务管理》(任务如何排队处理)、《第三章:视频生成任务》(视频任务的处理步骤)以及《第四章:任务状态》(如何跟踪任务进度)。

现在,让我们看看最激动人心的部分:MoneyPrinterTurbo如何利用人工智能生成视频创意内容。这正是由LLM集成组件实现的。

为何需要LLM集成?

假设我们要制作关于"学习编程的优势"的视频,传统流程需要:

  1. 编写说明性脚本
  2. 构思视觉创意或搜索匹配脚本的视频素材关键词(如"敲击笔记本键盘"、“团队协作”、“增长趋势图”)

LLM集成组件通过连接大语言模型(如OpenAI的GPT系列、DeepSeek、Moonshot等),实现以下核心功能:

  • 根据视频主题生成完整脚本
  • 基于脚本内容提取相关素材搜索关键词
  • 构建创意概念与视频素材间的智能桥梁

前文传送: [BrowserOS] LLM供应商集成 | 更新系统 | Sparkle框架 | 自动化构建系统 | Generate Ninja

LLM集成工作原理

在视频生成任务中,LLM集成执行以下流程:

  1. 接收视频主题(可选语言和段落数)
  2. 向配置的LLM服务商发送请求
  3. 接收LLM生成的视频脚本
  4. 再次发送脚本和主题获取视频搜索关键词
  5. 将生成内容传递至语音合成和视频素材处理环节

连接LLM服务商

如第一章:配置所述,通过config.toml文件配置LLM服务商:

# config.toml(简化LLM配置段)[app]
llm_provider = "OpenAI"  # 可选DeepSeek/Moonshot/Ollama等# OpenAI配置
openai_api_key = "您的OpenAI密钥"
openai_model_name = "gpt-3.5-turbo"# DeepSeek配置
deepseek_api_key = "您的DeepSeek密钥"
deepseek_base_url = "https://api.deepseek.com"
deepseek_model_name = "deepseek-chat"

API接口视图

MoneyPrinterTurbo提供独立API端点供Web UI调用:

1. 生成脚本接口

@router.post("/scripts")
def generate_video_script(body: VideoScriptRequest):video_script = llm.generate_script(video_subject=body.video_subject,language=body.video_language,paragraph_number=body.paragraph_number,)return {"video_script": video_script}
  • 输入:POST请求体含主题、语言、段落数
  • 输出:JSON格式生成脚本

2. 生成关键词接口

@router.post("/terms")
def generate_video_terms(body: VideoTermsRequest):video_terms = llm.generate_terms(video_subject=body.video_subject,video_script=body.video_script,amount=body.amount,)return {"video_terms": video_terms}
  • 输入:POST请求体含主题、脚本、关键词数量
  • 输出:JSON格式关键词列表

核心实现(app/services/llm.py)

通信枢纽(_generate_response)

def _generate_response(prompt: str) -> str:llm_provider = config.app.get("llm_provider")# 根据配置初始化不同服务商客户端if llm_provider == "openai":client = OpenAI(api_key=config.openai_api_key)elif llm_provider == "deepseek":client = OpenAI(api_key=config.deepseek_api_key)# 发送请求并处理响应response = client.chat.completions.create(model=model_name, messages=[{"role": "user", "content": prompt}])return response.choices[0].message.content

脚本生成逻辑

def generate_script(video_subject: str, language: str, paragraph_number: int):prompt = f"""# 角色:视频脚本生成器## 目标:基于主题生成{paragraph_number}段视频脚本## 约束:1. 直接输出原始脚本内容2. 禁用Markdown格式3. 使用与主题相同的语言## 初始化:- 视频主题:{video_subject}""".strip()return _generate_response(prompt)

关键词生成逻辑

def generate_terms(video_subject: str, video_script: str, amount: int):prompt = f"""# 角色:视频搜索词生成器## 目标:生成{amount}个素材搜索词## 约束:1. 输出JSON数组格式2. 每个词1-3个单词## 上下文:### 视频主题{video_subject}### 视频脚本{video_script}""".strip()response = _generate_response(prompt)return json.loads(response)

流程图解

在这里插入图片描述

结论

LLM集成组件通过智能生成脚本和素材关键词,成为自动化视频制作流程的核心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914730.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP 性能优化实战:突破高并发瓶颈的工业级方案

在互联网高并发场景中,HTTP 性能表现直接决定系统生死。当每秒请求量突破十万级甚至百万级时,哪怕 100 毫秒的延迟都会引发用户流失、交易失败等连锁反应。本文基于五大行业实战案例,拆解 HTTP 性能瓶颈的底层逻辑,输出可直接落地…

Xsens人形机器人拟人动作AI训练,提升机器人工作精度与效率

随着人工智能与机器人技术的深度融合,人形机器人正从实验室走向工业制造、医疗护理、公共服务等真实场景。然而,要让机器人真正"像人类一样工作",其动作的流畅性、精准度与环境适应性仍是技术突破的关键。Xsens动作捕捉系统通过创新…

IIS网站间歇性打不开暴力解决方法

背景 网站使用 Asp.NET 框架开发,使用 SQL Server 2012 IIS 8.5 运行。开发上线以后,经常出现网站间歇性打不开,但是重启 IIS 就可以正常访问。 问题排查过程 打开日志记录 观察 CPU,内存,带宽流量等占用正常&#xf…

JavaScript 动态访问嵌套对象属性问题记录

问题描述不能解析 2 层 只能解析一层在 Vue 项目中,尝试通过动态路径(如 otherInfo.businessPlacePhotoUrlLabel)访问或修改嵌套对象属性时,发现 this[a.b.c] 无法正确解析,导致返回 undefined。错误示例removeImg(val…

7.17 滑动窗口 | assign

lc3015.法1&#xff1a;暴力bfs&#xff0c;数据范围only 100&#xff0c;可以过法2&#xff1a;加入了x,y&#xff0c;可以思考加入的x,y影响了什么呢? 通过数学找规律class Solution { public:vector<int> countOfPairs(int n, int x, int y) {vector<int> ret(…

预训练模型:大规模数据预学习范式——定义、原理与演进逻辑

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 以下基于权威教材、学术论文及行业技术报告&#xff0c;对“预训练模型…

【kubernetes】--安全认证机制

文章目录安全认证1. **身份认证&#xff08;Authentication&#xff09;**2. **授权&#xff08;Authorization&#xff09;**3. **准入控制&#xff08;Admission Control&#xff09;**4. **机密信息管理**5. **其他安全实践**安全认证 Kubernetes 的安全机制覆盖了从身份验…

扣子工作流详解

《扣子开发AI Agent智能体应用&#xff08;人工智能技术丛书&#xff09;》(宋立桓&#xff0c;王东健&#xff0c;陈铭毅&#xff0c;程东升)【摘要 书评 试读】- 京东图书 《扣子开发AI Agent智能体应用》案例重现 开发agent智能体的书籍-CSDN博客 工作流是指一系列相互关联…

【一文解决】块级元素,行内元素,行内块元素

块级元素&#xff0c;行内元素&#xff0c;行内块元素&#xff01;盒模型1.标准盒模型&#xff08;box-sizing: content-box&#xff09;2.IE 盒模型&#xff08;box-sizing: border-box&#xff09;&#xff01;margin & padding1.margin、padding是什么2. 应用一、块级元…

在 Spring Boot 中使用 MyBatis 的 XML 文件编写 SQL 语句详解

前言 在现代 Java Web 开发中&#xff0c;Spring Boot 和 MyBatis 是两个非常流行的技术框架。它们的结合使得数据库操作变得更加简洁和高效。本文将详细介绍如何在 Spring Boot 项目中使用 MyBatis 的 XML 文件来编写 SQL 语句&#xff0c;包括配置、代码结构、SQL 编写技巧以…

字段级权限控制场景中,RBAC与ABAC的性能差异

RBAC(基于角色访问控制)与ABAC(基于属性访问控制)的性能差异主要体现在​​计算复杂度、策略灵活性、扩展性​​和​​资源消耗​​等方面。以下是具体对比分析: ​​一、性能对比维度​​ ​​维度​​​​RBAC​​​​ABAC​​​​计算复杂度​​低(预计算角色权限映射…

Reddit Karma是什么?Post Karma和Comment Karma的提升指南

在Reddit这一用户活跃度高的社区里&#xff0c;想要获得更好的曝光&#xff0c;我们就需要提升我们的Karma值&#xff0c;什么是Reddit Karma&#xff1f;怎么样才能提升以获得更大的影响力&#xff1f;本文将为你提高一套切实可行的提升方案。一、什么是Reddit Karma&#xff…

基于Canal实现MySQL数据库数据同步

一、基础概念与原理 1. Canal是什么&#xff1f; 阿里巴巴开源的MySQL binlog增量订阅与消费组件&#xff0c;通过伪装为MySQL Slave监听Master的binlog变更&#xff0c;实现实时数据同步。 Canal 官方网站&#xff1a;https://github.com/alibaba/canal Canal Demo&#x…

算法第23天|贪心算法:基础理论、分发饼干、摆动序列、最大子序和

今日总结&#xff1a; 摆动序列的三种特殊情况需要着重思考&#xff0c;感觉是没有思考清楚 基础理论 1、贪心的本质&#xff1a; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 例如&#xff1a;一堆钞票&#xff0c;只能拿走10张&#xff0c;如何拿走最…

Q-chunking——带有动作分块的强化学习:基于人类演示,进行一定的连贯探索(且可做到无偏的n步价值回溯)

前言 我在之前的文章中提到过多次&#xff0c;长沙具身团队是我司建设的第二支具身团队&#xff0c;通过5月份的全力招聘&#xff0c;为了冲刺6月底和7月初来长沙办公室考察的第一批客户&#xff0c;过去一个多月来&#xff0c;长沙分部(一开始就5人&#xff0c;另外5人 实习…

NW956NW961美光固态闪存NW964NW968

美光固态闪存深度解析&#xff1a;NW956、NW961、NW964与NW968的全方位评测一、产品概述与市场定位在当今数据爆炸的时代&#xff0c;固态硬盘&#xff08;SSD&#xff09;作为存储领域的佼佼者&#xff0c;其性能与稳定性成为了用户关注的焦点。美光&#xff08;Micron&#x…

C++修炼:IO流

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《C修炼之路》、《Linux修炼&#xff1a;终端之内 洞悉真理…

语音识别的速度革命:从 Whisper 到 Whisper-CTranslate2,我经历了什么?

Whisper-CTranslate2&#xff1a;语音识别的速度革命 大家好&#xff0c;一个沉迷于 AI 语音技术的 “音频猎人”。最近在处理大量播客转录项目时&#xff0c;我被传统语音识别工具折磨得苦不堪言 ——RTX 3090 跑一个小时的音频要整整 20 分钟&#xff0c;服务器内存分分钟爆满…

JVM 内存模型详解:GC 是如何拯救内存世界的?

JVM 内存模型详解&#xff1a;GC 是如何拯救内存世界的&#xff1f; 引言 Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序运行的基础&#xff0c;其核心特性之一就是自动内存管理。与 C/C 不同&#xff0c;Java 开发者无需手动分配和释放内存&#xff0c;而是由 JVM 自动…

分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?

在黑马点评项目实战中&#xff0c;关于全局唯一ID生成的实现方案选择中&#xff0c;我看到有人提到了雪花算法&#xff0c;本文就来简单了解一下雪花算法与Redis的incr方案的不同。在分布式系统开发中&#xff0c;“全局唯一ID”是绕不开的核心问题。无论是分库分表的数据库设计…