You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

7.6 KiB

RFC 134: AI 服务完整实现

状态: 已实施
创建时间: 2026-01-23
作者: AI Assistant
类型: 新功能


概述

完整实现 AI 生成服务,支持图片、视频、音效、配音、字幕和文本处理等多种 AI 功能,集成多个 AI 提供商(OpenAI、Stability AI、Runway),使用 Celery 处理异步任务。

动机

为导演组平台提供强大的 AI 辅助功能,帮助用户快速生成各类媒体资源,提升创作效率。

设计方案

1. 架构设计

┌─────────────┐
│  API Layer  │ ← FastAPI REST 接口
└──────┬──────┘
       │
┌──────▼──────┐
│   Service   │ ← 业务逻辑层
└──────┬──────┘
       │
┌──────▼──────┐
│ Repository  │ ← 数据访问层
└──────┬──────┘
       │
┌──────▼──────┐
│  Database   │ ← PostgreSQL 17
└─────────────┘

┌─────────────┐
│   Celery    │ ← 异步任务处理
└──────┬──────┘
       │
┌──────▼──────┐
│ AI Provider │ ← AI 提供商抽象层
└──────┬──────┘
       │
┌──────▼──────┐
│  OpenAI     │
│ Stability   │ ← 具体提供商实现
│  Runway     │
└─────────────┘

2. 数据库设计

核心表

  1. ai_models - AI 模型配置

    • 存储可用的 AI 模型及其定价
    • 支持动态配置,无需修改代码
  2. ai_jobs - AI 任务记录

    • 记录所有 AI 生成任务
    • 支持状态跟踪和进度更新
  3. ai_usage_logs - 使用日志

    • 详细记录每次 AI 调用
    • 支持成本分析和账单生成
  4. ai_quotas - 配额管理

    • 支持每日/每月配额限制
    • 自动重置过期配额

3. AI 提供商抽象

使用抽象基类 AIProvider 定义统一接口:

class AIProvider(ABC):
    @abstractmethod
    async def generate_image(...)
    
    @abstractmethod
    async def generate_video(...)
    
    async def generate_voice(...)
    async def generate_subtitle(...)
    async def process_text(...)

具体实现:

  • OpenAIProvider - DALL-E, TTS, Whisper, GPT
  • StabilityProvider - Stable Diffusion, Stable Video
  • RunwayProvider - Gen-2 视频生成

4. 异步任务处理

使用 Celery 处理耗时的 AI 生成任务:

@celery_app.task(base=AITask, bind=True, max_retries=3)
def generate_image_task(self, job_id, user_id, prompt, ...):
    return asyncio.run(_generate_image_async(...))

特性:

  • 自动重试(最多 3 次)
  • 任务状态跟踪
  • 失败自动回调
  • 超时控制

5. API 接口

提供 10 个 REST 端点:

  1. POST /api/v1/ai/generate-image - 生成图片
  2. POST /api/v1/ai/generate-video - 生成视频
  3. POST /api/v1/ai/generate-sound - 生成音效
  4. POST /api/v1/ai/generate-voice - 生成配音
  5. POST /api/v1/ai/generate-subtitle - 生成字幕
  6. POST /api/v1/ai/process-text - 处理文本
  7. GET /api/v1/ai/jobs/{job_id} - 查询任务状态
  8. POST /api/v1/ai/jobs/{job_id}/cancel - 取消任务
  9. GET /api/v1/ai/usage/stats - 获取使用统计
  10. GET /api/v1/ai/models - 获取可用模型

实施细节

文件结构

server/app/
├── models/
│   ├── ai_model.py          # AI 模型枚举和 SQLModel
│   ├── ai_job.py            # AI 任务枚举和 SQLModel
│   ├── ai_quota.py          # 配额枚举和 SQLModel
│   └── ai_usage_log.py      # 使用日志 SQLModel
├── repositories/
│   ├── ai_model_repository.py
│   ├── ai_job_repository.py
│   ├── ai_quota_repository.py
│   └── ai_usage_log_repository.py
├── services/
│   ├── ai_service.py        # AI 核心服务
│   └── ai_providers/
│       ├── base.py          # 抽象基类
│       ├── openai_provider.py
│       ├── stability_provider.py
│       ├── runway_provider.py
│       └── factory.py       # 提供商工厂
├── tasks/
│   ├── celery_app.py        # Celery 配置
│   └── ai_tasks.py          # AI 异步任务
├── api/v1/
│   └── ai.py                # API 路由
├── schemas/
│   └── ai.py                # Pydantic schemas
└── migrations/
    └── 007_ai_service_tables.py

配置要求

.env 文件中添加:

# AI 服务配置
OPENAI_API_KEY=sk-...
STABILITY_API_KEY=sk-...
RUNWAY_API_KEY=...

依赖包

新增依赖:

  • celery==5.3.6 - 异步任务队列
  • celery[redis]==5.3.6 - Redis 支持
  • openai==1.12.0 - OpenAI SDK
  • anthropic==0.18.1 - Anthropic SDK

使用示例

1. 生成图片

POST /api/v1/ai/generate-image
{
  "prompt": "一只可爱的猫咪在花园里玩耍",
  "model": "dall-e-3",
  "width": 1024,
  "height": 1024,
  "style": "vivid"
}

# 响应
{
  "job_id": "019d1234-5678-7abc-def0-111111111111",
  "task_id": "abc-123-def",
  "status": "pending",
  "estimated_cost": 0.04,
  "estimated_credits": 10
}

2. 查询任务状态

GET /api/v1/ai/jobs/019d1234-5678-7abc-def0-111111111111

# 响应
{
  "job_id": "019d1234-5678-7abc-def0-111111111111",
  "status": 3,  # COMPLETED
  "progress": 100,
  "output_data": {
    "image_url": "https://storage.jointo.ai/ai/images/123.png"
  }
}

3. 处理文本(剧本拆解)

POST /api/v1/ai/process-text
{
  "task_type": "screenplay_parse",
  "text": "场景1:咖啡厅 - 白天\n小明走进咖啡厅...",
  "model": "gpt-4",
  "output_format": "json"
}

性能考虑

  1. 异步处理: 所有 AI 生成任务使用 Celery 异步处理,避免阻塞 API
  2. 配额限制: 防止用户过度使用,保护系统资源
  3. 任务重试: 自动重试失败的任务,提高成功率
  4. 超时控制: 设置合理的超时时间,避免任务无限等待

安全考虑

  1. API 密钥管理: 所有 AI 提供商的 API 密钥存储在环境变量中
  2. 用户认证: 所有 API 端点需要 JWT 认证
  3. 配额限制: 防止滥用和成本失控
  4. 错误处理: 不暴露敏感的错误信息

测试策略

  1. 单元测试: 测试 Repository 和 Service 层
  2. 集成测试: 测试 API 端点和数据库交互
  3. Mock 测试: Mock AI 提供商,避免实际调用

部署步骤

  1. 执行数据库迁移:

    python run_migration.py 007
    
  2. 安装依赖:

    pip install -r requirements.txt
    
  3. 配置环境变量(.env

  4. 启动 Celery Worker:

    celery -A app.tasks.celery_app worker --loglevel=info
    
  5. 启动 Celery Beat(定时任务):

    celery -A app.tasks.celery_app beat --loglevel=info
    
  6. 重启 FastAPI 应用

后续优化

  1. Credit Service 集成: 实现积分预扣和确认机制
  2. 文件存储: 集成 MinIO 存储生成的媒体文件
  3. 进度回调: 实现 WebSocket 推送任务进度
  4. 批量处理: 支持批量生成任务
  5. 缓存优化: 缓存常用的 AI 模型配置
  6. 监控告警: 添加任务失败率监控

相关文档

变更日志

  • 2026-01-23: 初始实现,包含所有核心功能