AI SaaS 开发实战

从零搭建 6 个 AI 项目,不是 demo,是能跑的系统

六个项目,一条线

这 6 个项目不是孤立的,它们共享同一套基础设施:FastAPI + SQLAlchemy 2.0(async) + MySQL + Redis。从 Basic_Web 脚手架开始,往上搭业务。

FinBuddy_Web — LLM 代理服务

FinBuddy_Web 是 FinBuddy 的云端 SaaS 后端,最核心的是 LLM 代理服务。三层控制:层级限额检查 + 余额预检 + Redis 分布式信号量并发控制。

# LLM 代理 — 层级限额 + 余额预检 + 并发控制
class ProxyService:
    async def chat(self, req: ChatRequest, user: User):
        # 1. 层级限额:tier2/tier3 模型有每日使用次数限制
        await self._check_tier_limit(user, req.model)

        # 2. 余额预检:调用前检查余额是否 > 0
        balance = await self.billing.get_balance(user.id)
        if balance <= 0:
            raise InsufficientBalanceError()

        # 3. 并发控制:Redis 分布式信号量
        async with self.semaphore(user.id):
            async for chunk in self._stream(req):
                yield chunk

流式响应用独立短生命周期 Session,避免长时间占用连接池导致 QueuePool 耗尽。这个坑我踩过——高并发时整个服务卡死。FinBuddy_Web 的 LLM 代理也用在投资场景——帮用户调取财报数据、做量化筛选,所以并发控制特别重要。

Promo_Web — Skill 组合引擎

Promo 的核心创新是把营销内容生成抽象为可组合的"技能链":framework → style → adapter → enhancer,四层 Skill 按类型顺序拼接 Prompt。

# Skill 四层组合机制
class GenerationEngine:
    def assemble_prompt(self, product, persona, channel,
                        framework_skill, style_skill,
                        adapter_skill, enhancer_skills=None):
        variables = {
            "product_name": product.name,
            "selling_points": "、".join(product.selling_points),
            "brand_tone": product.brand_tone or "专业、可信赖",
            "persona_desc": f"{persona.description}。"
                           f"语言风格:{persona.language_style}",
            "channel_rules": self._format_channel_rules(channel),
        }
        parts = [
            framework_skill.render(variables),
            style_skill.render(variables),
            adapter_skill.render(variables),
        ]
        for enhancer in (enhancer_skills or []):
            parts.append(enhancer.render(variables))
        return "\n\n".join(parts)

SkillStore — 技能自动分类

SkillStore 用正则规则引擎,根据技能名称和描述中的中英文关键词自动分类到 domain/category 二级分类体系。

# 技能自动分类引擎
_CLASSIFICATION_RULES = [
    (r"orchestrat|编排|流水线|pipeline", "orchestrate", "orchestrator"),
    (r"market|营销|推广|growth|转化", "content", "marketing"),
    (r"writ|写作|文案|article|copy", "content", "writing"),
    (r"video|remotion|视频|媒体|image", "tool", "media"),
    (r"design|设计|hig|platform|ios|macos", "develop", "design"),
]

def _classify_skill(name: str, description: str) -> tuple:
    text = f"{name} {description}".lower()
    for pattern, domain, category in _CLASSIFICATION_RULES:
        if re.search(pattern, text):
            return domain, category
    return "develop", "dev-assist"

MarketingVideo — Remotion 视频管线

用 Remotion 4 + Python 管线做营销视频自动生成。4 步流水线:TTS 配音 -> Whisper 字幕 -> Remotion 渲染 -> 平台发布。

# Python 4 步管线
class VideoPipeline:
    async def run(self, job: VideoJob):
        # Step 1: TTS 配音
        audio = await self.tts.generate(job.script, job.voice)
        # Step 2: Whisper 字幕
        subtitles = await self.whisper.transcribe(audio)
        # Step 3: Remotion 渲染
        video = await self.renderer.render(job.template, subtitles)
        # Step 4: 平台发布
        await self.publisher.publish(video, job.platform)

最头疼的是 Whisper 中文识别金融术语经常出错,需要加自定义词典后处理。TTS 引擎做了路由:默认 Edge TTS(免费),重要内容用 OpenAI TTS(音质好但贵)。

Basic_Web — SaaS 脚手架

所有项目的基础。最值得说的是分布式信号量——基于 Redis INCR + EXPIRE 实现跨实例并发控制。

# 分布式信号量 — 跨实例并发控制
class DistributedSemaphore:
    async def acquire(self) -> bool:
        current = await redis_client.incr(self._key)
        if current == 1:
            await redis_client.expire(self._key, self._ttl)
        if current > self._max_concurrent:
            await redis_client.decr(self._key)
            return False
        return True