
AIGC 常被简化成"输入提示词,输出内容"。但把文本、图像、音频、视频生成放进真实业务后,开发者面对的是另一组问题:多模态如何统一编排、生成结果如何可控、质量如何量化、成本如何收敛、版权如何留痕。 本文从工程视角拆解一条 AIGC 创作管线,并给出可运行代码。
文本、图像、音频、视频的 SDK 各不相同。工程上应先做统一抽象,让业务代码不依赖具体模态。
from dataclasses import dataclass, field
from enum import Enum
from typing import Any, Protocol
class Modality(str, Enum):
text = "text"
image = "image"
audio = "audio"
video = "video"
@dataclass
class GenRequest:
modality: Modality
prompt: str
params: dict[str, Any] = field(default_factory=dict)
seed: int | None = None
@dataclass
class GenResult:
modality: Modality
uri: str
model: str
tokens: int = 0
cost: float = 0.0
meta: dict[str, Any] = field(default_factory=dict)
class Generator(Protocol):
def generate(self, req: GenRequest) -> GenResult: ...统一抽象的价值:切换模型或模态时,业务层不改代码。 每个模态只需实现一个 Generator。
AIGC 最难的不是"生成",而是"可控生成"。核心手段是固定种子、模板化提示词、显式负面约束。
import hashlib, json
from pathlib import Path
class PromptTemplate:
def __init__(self, root: Path):
self.root = root
def render(self, name: str, version: str, **kw) -> tuple[str, str]:
path = self.root / name / f"{version}.json"
data = json.loads(path.read_text(encoding="utf-8"))
fp = hashlib.sha256(
json.dumps(data, sort_keys=True).encode()
).hexdigest()[:16]
return data["template"].format(**kw), fp
TEMPLATE = """主体:{subject}
动作:{action}
风格:{style}
构图:{camera}
负面:文字、水印、Logo、真人、畸形、低清、复杂背景"""关键约束:
人工筛图成本高。可以用基础指标做第一轮过滤。
from PIL import Image, ImageFilter
import numpy as np
def quality_score(path: Path) -> dict:
img = Image.open(path).convert("RGBA")
alpha = np.array(img.split()[-1])
edges = np.array(img.convert("L").filter(ImageFilter.FIND_EDGES))
ys, xs = np.where(alpha > 10)
return {
"sharpness": float(edges.var()),
"coverage": float((alpha > 10).mean()),
"margin_ok": bool(
len(xs) and xs.min() > 4 and ys.min() > 4
and xs.max() < img.width - 4
and ys.max() < img.height - 4
),
"size": img.size,
}
def auto_filter(paths: list[Path], min_sharp: float = 80.0,
min_cov: float = 0.05, max_cov: float = 0.85) -> list[Path]:
return [
p for p in paths
if (s := quality_score(p))["sharpness"] >= min_sharp
and min_cov <= s["coverage"] <= max_cov
and s["margin_ok"]
]这套指标不能替代审美,但能快速剔除模糊、贴边、主体过小的废片,把人工筛选量降低一个量级。
import re
BAD = {"违法", "暴力", "色情", "歧视", "虚假", "最好", "第一"}
PII = re.compile(r"(\d{11}|\d{17}[\dXx]|[\w.+-]+@[\w-]+\.[\w.]+)")
def audit(text: str) -> None:
if any(w in text for w in BAD):
raise ValueError("含敏感或绝对化用语")
if PII.search(text):
raise ValueError("含个人信息,需脱敏")
def mask(text: str) -> str:
return PII.sub("[REDACTED]", text)
def audit_commercial(meta: dict) -> list[str]:
issues = []
if not meta.get("model_license"):
issues.append("缺少模型许可说明")
if not meta.get("font_license"):
issues.append("缺少字体授权")
if meta.get("has_real_person") and not meta.get("portrait_license"):
issues.append("含真人肖像但无授权")
if meta.get("has_brand_logo"):
issues.append("含品牌 Logo,需商标授权")
return issues每次生成必须落盘元数据:模型、seed、提示词指纹、审核结果、trace_id。没有留痕,就没有合规。 AI 生成内容还要按平台要求标注。
import asyncio, logging, time, uuid
log = logging.getLogger("aigc")
async def run_one(req: GenRequest, gen: Generator,
sem: asyncio.Semaphore,
max_retries: int = 3) -> GenResult:
async with sem:
trace_id = uuid.uuid4().hex[:12]
start = time.time()
for attempt in range(max_retries + 1):
try:
result = gen.generate(req)
audit(req.prompt)
log.info("trace=%s modality=%s cost=%.2fs tokens=%d",
trace_id, req.modality, time.time() - start,
result.tokens)
return result
except Exception as e:
if attempt >= max_retries:
raise
await asyncio.sleep(2 ** attempt)
raise RuntimeError("unreachable")
async def run_batch(requests: list[GenRequest], gen: Generator,
concurrency: int = 3) -> list[GenResult]:
sem = asyncio.Semaphore(concurrency)
return await asyncio.gather(
*(run_one(r, gen, sem) for r in requests)
)要点:
维度 | 做法 | 不做会怎样 |
|---|---|---|
幂等 | 提示词指纹做缓存键 | 重复生成、重复扣费 |
限流 | 按用户/租户/模型限流 | 配额被打爆 |
成本 | token/GPU 时长统计 | 预算失控 |
审核 | 输入输出双向过滤 | 违规内容流出 |
脱敏 | 日志中个人信息替换 | 隐私泄露 |
留痕 | 模型、seed、提示词版本留档 | 无法追溯、无法复现 |
授权 | 模型许可、素材授权确认 | 商用纠纷 |
标注 | AI 生成内容按平台要求标注 | 平台处罚 |
AIGC 创作大模型的工程核心,是把生成放进一条可控、可质检、可合规的流水线:统一多模态接口、模板化提示词、固定种子、自动质检、双向审核、成本可观测、全程留痕。代码可以简单,但幂等、限流、审核、脱敏、授权确认不能省。AIGC 是生产力工具,不是免责工具,交付责任始终在人。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。