AI 产品创造的最大误区,是先造技术再找场景。专业做法恰恰相反:先锁定一个高频、可量化、愿付费的痛点,再用最小技术栈把"输入→生成→交付→计费"跑通。本文以一个垂直场景——跨境电商 listing 生成器——为例,给出从架构到代码的完整落地路径。
不是所有场景都适合做 AI 产品。用三个维度筛选:高频(用户每天或每周都用)、可量化(结果好坏能判断)、愿付费(节省的时间或成本可折算成钱)。跨境电商卖家写一条 listing 平均耗时 40 分钟,外包成本 50-200 元,这就是典型的可付费场景。
技术栈选择最小化:Next.js 部署 Vercel,模型调 OpenAI,缓存用 Upstash Redis,计费用 Stripe。一套栈覆盖前后端与商业化,一个人两周可上线。
用户输入 → API 网关(鉴权/限流) → 生成服务(模型+缓存) → 用量计费 → 交付关键设计原则:模型调用必须可缓存、可限流、可计量。下面用 Next.js App Router 实现核心生成接口。
// app/api/generate/route.ts
import { NextRequest, NextResponse } from "next/server";
import OpenAI from "openai";
import { Redis } from "@upstash/redis";
import { z } from "zod";
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const redis = Redis.fromEnv();
const Input = z.object({
product: z.string().min(2).max(500),
tone: z.enum(["professional", "casual", "luxury"]).default("professional"),
});
const FREE_QUOTA = 10; // 每月免费次数
export async function POST(req: NextRequest) {
const userId = req.headers.get("x-user-id");
if (!userId) return NextResponse.json({ error: "未登录" }, { status: 401 });
const parsed = Input.safeParse(await req.json());
if (!parsed.success) {
return NextResponse.json({ error: "参数非法" }, { status: 400 });
}
const { product, tone } = parsed.data;
// 1. 用量检查
const monthKey = `quota:${userId}:${new Date().toISOString().slice(0, 7)}`;
const used = (await redis.get<number>(monthKey)) ?? 0;
if (used >= FREE_QUOTA) {
return NextResponse.json(
{ error: "免费额度已用完", paywall: true }, { status: 402 });
}
// 2. 缓存命中直接返回,节省成本
const cacheKey = `gen:${tone}:${Buffer.from(product).toString("base64")}`;
const cached = await redis.get<string>(cacheKey);
if (cached) {
return NextResponse.json({ listing: cached, source: "cache" });
}
// 3. 调用模型,温度与 max_tokens 严格控制成本
const resp = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{ role: "system", content:
`你是跨境电商文案专家。语气:${tone}。` +
"输出格式:标题一行,五点描述,每点不超过30词。" },
{ role: "user", content: product },
],
temperature: 0.7,
max_tokens: 400,
});
const listing = resp.choices[0].message.content ?? "";
// 4. 写入缓存与用量
await redis.setex(cacheKey, 86400, listing);
await redis.incr(monthKey);
await redis.expire(monthKey, 60 * 60 * 24 * 32);
return NextResponse.json({
listing,
source: "llm",
remaining: FREE_QUOTA - used - 1,
});
}这段代码体现了 AI 产品的四个工程要点:Schema 校验输入(防止滥用)、额度前置检查(控制成本)、缓存优先(降低延迟与费用)、用量原子累加(为计费提供依据)。
免费额度用完必须能立刻付费,转化窗口只有几秒。用 Stripe Checkout 是最快路径。
// app/api/checkout/route.ts
import { NextRequest, NextResponse } from "next/server";
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST(req: NextRequest) {
const { userId } = await req.json();
const session = await stripe.checkout.sessions.create({
mode: "payment",
line_items: [{ price: process.env.STRIPE_PRICE_ID!, quantity: 1 }],
success_url: `${process.env.APP_URL}/success?uid=${userId}`,
cancel_url: `${process.env.APP_URL}/pricing`,
metadata: { userId },
});
return NextResponse.json({ url: session.url });
}支付成功后通过 Webhook 提升额度,而不是在主流程里轮询:
// app/api/webhook/route.ts
import { NextRequest, NextResponse } from "next/server";
import Stripe from "stripe";
import { Redis } from "@upstash/redis";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
const redis = Redis.fromEnv();
export async function POST(req: NextRequest) {
const sig = req.headers.get("stripe-signature")!;
const body = await req.text();
const event = stripe.webhooks.constructEvent(
body, sig, process.env.STRIPE_WEBHOOK_SECRET!);
if (event.type === "checkout.session.completed") {
const userId = (event.data.object as any).metadata.userId;
const monthKey = `quota:${userId}:${new Date().toISOString().slice(0, 7)}`;
await redis.set(monthKey, -100); // 负数表示已付费,额度充足
}
return NextResponse.json({ received: true });
}幂等性由 Stripe 事件 ID 保证,重复回调不会重复加额度。
用户等待超过 3 秒就会流失。用流式输出把首字延迟压到 0.5 秒内:
export async function POST(req: NextRequest) {
const stream = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: product }],
stream: true,
});
const encoder = new TextEncoder();
const readable = new ReadableStream({
async start(controller) {
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content ?? "";
if (text) controller.enqueue(encoder.encode(text));
}
controller.close();
},
});
return new Response(readable, {
headers: { "Content-Type": "text/plain; charset=utf-8" },
});
}同时必须设置降级:模型超时或限流时返回缓存或规则文案,绝不让用户看到 500。
成本红线:单次生成成本控制在 1 分钱内。小模型 + max_tokens 限制 + 缓存命中率 40%,足以支撑免费额度。
迭代节奏:第一周做 MVP 并部署,第二周找 10 个真实用户付费验证。先验证付费意愿,再优化体验。
合规最小集:隐私政策、数据保留周期、AI 输出免责声明,缺一不可。
总结:AI 产品创造的胜负手不在模型,而在场景选择的精准、工程实现的克制、付费闭环的顺畅。代码不到两百行,却包含校验、限流、缓存、计费、流式的完整链路。先用最小架构赚到第一块钱,再谈规模化。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。