PMFlow/backend/app/models/model_capability_matrix.py

289 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""模型能力矩阵核心模型
AI 开发团队专属垂直能力矩阵的数据模型,包括:
- ModelCapabilityGap: 模型能力差距记录(认知差预警)
- CostTracking: 算力成本跟踪与 ROI 核算
- ModelUpdateImpact: 模型更新影响评估(阶段2)
- ExperimentTruthNodeSync: 实验与宪章同步记录(阶段2)
"""
from datetime import datetime
from typing import Optional
from sqlalchemy import BigInteger, DECIMAL, Boolean, Float, ForeignKey, Integer, Text, VARCHAR, TIMESTAMP
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base
from .types import JSONB
class ModelCapabilityGap(Base):
"""模型能力差距记录 - AI 预警认知差
当需求与绑定的模型能力不匹配时,自动生成差距记录,
提前预警产品经理和技术团队,规避返工风险。
"""
__tablename__ = "model_capability_gaps"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
model_version_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("model_versions.id"), nullable=False, index=True
)
truth_node_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("truth_nodes.id"), nullable=False, index=True
)
# 差距类型:capability(能力不足)、cost(成本过高)、performance(性能不符)、risk(兼容性风险)
gap_type: Mapped[str] = mapped_column(VARCHAR(50), nullable=False, index=True)
# 严重程度:critical(严重,必须解决)、high(高,建议解决)、medium(中)、low(低)
severity: Mapped[str] = mapped_column(VARCHAR(20), nullable=False, index=True)
# 差距描述和 AI 分析
description: Mapped[str] = mapped_column(Text, nullable=False)
ai_analysis: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
# 状态:open(待处理)、acknowledged(已确认)、resolved(已解决)、ignored(已忽略)
status: Mapped[str] = mapped_column(
VARCHAR(50), nullable=False, default="open", index=True
)
# 解决时间
resolved_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
# 解决方案备注
resolution_notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
class CostTracking(Base):
"""算力成本跟踪与 ROI 核算
跟踪每个需求(宪章)、每个任务的算力成本,
自动计算 ROI,实现成本透明化。
"""
__tablename__ = "cost_trackings"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
# 关联的宪章(需求)
truth_node_id: Mapped[Optional[int]] = mapped_column(
BigInteger, ForeignKey("truth_nodes.id"), nullable=True, index=True
)
# 关联的模型版本
model_version_id: Mapped[Optional[int]] = mapped_column(
BigInteger, ForeignKey("model_versions.id"), nullable=True
)
# 关联的任务(可选,用于任务级成本追踪)
task_id: Mapped[Optional[int]] = mapped_column(
BigInteger, ForeignKey("tasks.id"), nullable=True, index=True
)
# 周期:daily、weekly、monthly、project(项目全周期)
period: Mapped[str] = mapped_column(VARCHAR(20), nullable=False, index=True)
# Token 数量
estimated_tokens: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
actual_tokens: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
# 成本(美元)
estimated_cost_usd: Mapped[float] = mapped_column(
DECIMAL(10, 4), nullable=False, default=0.0
)
actual_cost_usd: Mapped[float] = mapped_column(
DECIMAL(10, 4), nullable=False, default=0.0
)
# ROI 评分(0-10)
roi_score: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
# ROI 分析详情
roi_analysis: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
# 成本优化建议
optimization_suggestions: Mapped[dict] = mapped_column(
JSONB, nullable=False, default=dict
)
class ModelUpdateImpact(Base):
"""模型更新影响评估
当监控到新模型发布时,自动评估对现有项目的影响,
生成迁移任务和调整建议。
"""
__tablename__ = "model_update_impacts"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
# 旧模型和新模型
old_model_version_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("model_versions.id"), nullable=False
)
new_model_version_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("model_versions.id"), nullable=False
)
# 受影响的宪章及其影响评分 {node_id: impact_score}
affected_truth_nodes: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
# 成本变化百分比
cost_change_percentage: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
# 性能变化 {speed_change_percent, quality_change_percent, etc.}
performance_change: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
# 兼容性风险列表
compatibility_risks: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
# 自动生成的迁移任务
migration_tasks: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
# 升级建议:immediate_upgrade(立即升级)、evaluate(评估后升级)、defer(暂缓升级)
recommendation: Mapped[str] = mapped_column(VARCHAR(50), nullable=False)
# 状态:pending_review(待审核)、approved(已批准)、in_progress(进行中)、completed(已完成)
status: Mapped[str] = mapped_column(
VARCHAR(50), nullable=False, default="pending_review"
)
class ExperimentTruthNodeSync(Base):
"""实验与宪章同步记录
算法工程师的实验结果自动同步到项目宪章,
确保实验与落地不脱节。
"""
__tablename__ = "experiment_truth_node_syncs"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
# 关联的实验(需要 Experiment 表,如果不存在可以先创建外键约束)
experiment_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True)
# 实验标识(用于关联外部实验平台)
experiment_external_id: Mapped[Optional[str]] = mapped_column(VARCHAR(255), nullable=True)
# 关联的宪章
truth_node_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("truth_nodes.id"), nullable=False, index=True
)
# 同步类型:result_sync(结果同步)、metric_update(指标更新)、conclusion_sync(结论同步)
sync_type: Mapped[str] = mapped_column(VARCHAR(50), nullable=False)
# 同步数据(包含实验结果、建议的变更等)
sync_data: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
# AI 置信度(0-1)
confidence_score: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
# 是否自动应用
auto_applied: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
# 应用状态:pending(待应用)、applied(已应用)、rejected(已拒绝)、requires_review(需审核)
apply_status: Mapped[str] = mapped_column(
VARCHAR(50), nullable=False, default="pending"
)
# 审核意见
review_notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
# 审核人
reviewed_by: Mapped[Optional[int]] = mapped_column(
BigInteger, ForeignKey("users.id"), nullable=True
)
# 审核时间
reviewed_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
class Budget(Base):
"""预算设置
按租户、项目设置月度/季度预算,
实现硬性预算管控。
"""
__tablename__ = "budgets"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
# 预算类型:tenant(租户级)、project(项目级)
budget_type: Mapped[str] = mapped_column(VARCHAR(20), nullable=False, index=True)
# 关联项目(project 类型时使用)
project_id: Mapped[Optional[int]] = mapped_column(
BigInteger, ForeignKey("projects.id"), nullable=True, index=True
)
# 周期:monthly、quarterly、yearly
period: Mapped[str] = mapped_column(VARCHAR(20), nullable=False)
# 预算金额(美元)
budget_amount_usd: Mapped[float] = mapped_column(
DECIMAL(12, 2), nullable=False, default=0.0
)
# 预警阈值(百分比,默认 80%)
alert_threshold_percent: Mapped[float] = mapped_column(
Float, nullable=False, default=80.0
)
# 硬性限制(是否启用硬性预算控制)
hard_limit_enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
# 当前已使用金额
current_usage_usd: Mapped[float] = mapped_column(
DECIMAL(12, 2), nullable=False, default=0.0
)
# 当前周期(用于跟踪每月/每季度的使用情况)
current_period_start: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
current_period_end: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
# 状态:active(激活)、suspended(暂停,超支后暂停)、overridden(被覆盖)
status: Mapped[str] = mapped_column(
VARCHAR(20), nullable=False, default="active"
)
# 超支解锁记录(BOSS/ADMIN 可以临时解锁)
override_history: Mapped[dict] = mapped_column(JSONB, nullable=False, default=dict)
class BudgetAlert(Base):
"""预算预警记录
当预算使用达到预警阈值或超支时,自动生成预警记录。
"""
__tablename__ = "budget_alerts"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
# 关联预算
budget_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("budgets.id"), nullable=False, index=True
)
# 预警类型:threshold_reached(达到阈值)、exceeded(超支)、suspended(暂停服务)
alert_type: Mapped[str] = mapped_column(VARCHAR(50), nullable=False, index=True)
# 当前使用量
usage_usd: Mapped[float] = mapped_column(DECIMAL(12, 2), nullable=False)
# 使用百分比
usage_percent: Mapped[float] = mapped_column(Float, nullable=False)
# 预警消息
message: Mapped[str] = mapped_column(Text, nullable=False)
# 是否已读
is_read: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
# 预警操作(如暂停服务)
action_taken: Mapped[Optional[str]] = mapped_column(VARCHAR(50), nullable=True)
# 状态:active(激活)、dismissed(已忽略)、resolved(已解决)
status: Mapped[str] = mapped_column(
VARCHAR(20), nullable=False, default="active"
)