同一条流水线:采集素材 → 加工生产 → 多端分发 → 转化履约 → 数据复盘。一人或小团队做多业务,唯一可行的架构不是"每件事各买一套工具",而是把每个环节抽象成带输入输出契约的 Skill,由统一编排器调度。本文给出这套中台的代码骨架。
Skill 不是 prompt 集合,而是有 schema、有幂等性、有失败语义的函数。先把契约钉死。
from abc import ABC, abstractmethod
from pydantic import BaseModel
from typing import Any
class SkillInput(BaseModel): ...
class SkillOutput(BaseModel): ...
class Skill(ABC):
name: str
version: str
@abstractmethod
def run(self, data: SkillInput) -> SkillOutput: ...
def can_retry(self, err: Exception) -> bool:
return isinstance(err, (TimeoutError, ConnectionError))
REGISTRY: dict[str, Skill] = {}
def register(s: Skill):
REGISTRY[f"{s.name}@{s.version}"] = s要点:version 让技能可灰度升级;can_retry 把可重试与不可重试错误分开,避免"重试把重复内容又发了一遍"。
办公场景的价值在抽取与汇总,不在"让模型写点东西"。用 schema 校验守住数据质
from pydantic import Field
class SheetIn(SkillInput):
rows: list[dict[str, Any]]
ask: str
class ReportOut(SkillOutput):
summary: str
anomalies: list[dict] = Field(default_factory=list)
class OfficeReport(Skill):
name, version = "office.report", "1.2.0"
def __init__(self, llm): self.llm = llm
def run(self, data: SheetIn) -> ReportOut:
import json
prompt = f"数据:{json.dumps(data.rows, ensure_ascii=False)}\n任务:{data.ask}\n" \
"只输出JSON: {summary, anomalies:[{row, reason}]}"
raw = self.llm.complete(prompt, temperature=0)
return ReportOut(**json.loads(raw)) # 校验失败即抛错,不静默放行同一份内容适配公众号、小红书、X,核心是平台规格表驱动,而不是每次重写 prompt。
PLATFORM_SPEC = {
"wechat": {"max": 4000, "style": "长文,小标题分段"},
"xhs": {"max": 900, "style": "口语化,emoji,首句钩子"},
"twitter": {"max": 260, "style": "短句,结论前置"},
}
class Repurpose(Skill):
name, version = "media.repurpose", "2.0.0"
def __init__(self, llm): self.llm = llm
def run(self, data):
out = {}
for p, spec in PLATFORM_SPEC.items():
text = self.llm.complete(
f"改写为{spec['style']},不超过{spec['max']}字,保留事实不改数字:\n{data.text}",
temperature=0.4)
out[p] = text[: spec["max"]]
return out要点:保留事实不改数字 是硬约束——AI 改写最大的风险是悄悄篡改数据,这类约束必须写进每次调用。
短视频的可规模化部分不是创意,是切条、字幕、封面这些确定性工序。它们应当被封装成不依赖模型的 Skill。
import subprocess
class ShortVideo(Skill):
name, version = "video.clip", "1.0.0"
def run(self, data):
clips = []
for i, (start, dur) in enumerate(data.segments):
dst = f"{data.out_dir}/clip_{i:02d}.mp4"
subprocess.run([
"ffmpeg", "-y", "-ss", str(start), "-i", data.src,
"-t", str(dur), "-vf", "scale=1080:-2,subtitles=auto.srt",
"-c:v", "libx264", "-preset", "fast", dst
], check=True, capture_output=True)
clips.append(dst)
return {"clips": clips}要点:check=True 让失败即抛错;切片参数来自结构化分镜表而非模型即时发挥,保证批量产出的可复现性。
跨境/平台电商的"通关"本质是规则校验:类目属性必填、禁限售词、HS 编码与申报要素。这类环节绝不能交给模型自由判断,必须做成规则引擎 + 模型兜底。
BANNED = {"最", "第一", "国家级", "绝对"}
REQUIRED_ATTRS = {"electronics": {"voltage", "cert"}, "apparel": {"fabric", "size_chart"}}
class Listing(Skill):
name, version = "ecom.listing", "3.1.0"
def run(self, data):
errors = []
if REQUIRED_ATTRS.get(data.category, set()) - data.attrs.keys():
errors.append(f"缺少必填属性: {REQUIRED_ATTRS[data.category] - data.attrs.keys()}")
hit = BANNED & set(data.title.split())
if hit:
errors.append(f"标题含违禁词: {hit}")
if errors:
raise ValueError("; ".join(errors)) # 阻断上架,不进人工复核队列
return {"status": "pass", "hs_code": self.classify(data)}要点:规则命中直接阻断,不做"提示后继续"——通关类错误一旦漏放,成本远高于重跑。
最后一个 Skill 是复盘:把各环节指标按技能版本聚合,才能回答"改版后转化涨了没有"。
def retro(events: list[dict]) -> dict:
agg = {}
for e in events:
k = (e["skill"], e["version"], e["platform"])
s = agg.setdefault(k, {"n": 0, "conv": 0})
s["n"] += 1; s["conv"] += e["converted"]
return {f"{a}@{b}/{c}": round(v["conv"] / v["n"], 4) for (a, b, c), v in agg.items()}结语
五个业务表面各异,专业解法却是同一个:把不确定性关进 Skill 的契约里。办公靠 schema 校验、自媒体靠平台规格表、短视频靠确定性 ffmpeg 工序、电商靠规则门禁、复盘靠版本归因。判断一套中台是否成立只需一问:某个环节出错时,能不能定位到具体技能的具体版本并单独重跑?能,才叫中台;不能,只是拼凑的工具箱。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。